X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=etc%2Fzsh%2Fzshrc;h=eb1767eeeed4c39b5f262eb27e4d2d2e8fd4c162;hb=06a39dc69b644a1f757481e3af31e8c1025a88ea;hp=c01dac7fbb29b8894fe95ddc0a05b13e5e994505;hpb=d6923f34da2c51d707858e978626129c19c3b915;p=grml-etc-core.git
diff --git a/etc/zsh/zshrc b/etc/zsh/zshrc
index c01dac7..eb1767e 100644
--- a/etc/zsh/zshrc
+++ b/etc/zsh/zshrc
@@ -406,6 +406,7 @@ check_com() {
salias() {
emulate -L zsh
local only=0 ; local multi=0
+ local key val
while [[ $1 == -* ]] ; do
case $1 in
(-o) only=1 ;;
@@ -495,11 +496,7 @@ xcat() {
xunfunction() {
emulate -L zsh
local -a funcs
- funcs=(salias xcat xsource xunfunction zrcautoload
- zrcautozle
- zrcbindkey
- zrcgotkeymap
- zrcgotwidget)
+ funcs=(salias xcat xsource xunfunction zrcautoload zrcautozle)
for func in $funcs ; do
[[ -n ${functions[$func]} ]] \
&& unfunction $func
@@ -596,7 +593,7 @@ typeset -U path cdpath fpath manpath
# Load a few modules
is4 && \
-for mod in complist deltochar mathfunc ; do
+for mod in parameter complist deltochar mathfunc ; do
zmodload -i zsh/${mod} 2>/dev/null || print "Notice: no ${mod} available :("
done
@@ -785,11 +782,11 @@ grmlcomp() {
compdef _hosts upgrade
}
-# Keyboard setup: The following is the same code, we wrote for debian's setup.
-# It ensures the terminal is in the right mode, when zle is active, so the
-# values from $terminfo are valid. Therefore, this setup should work on all
-# systems, that have support for `terminfo'. It also requires the zsh in use to
-# have the `zsh/terminfo' module built.
+# Keyboard setup: The following is based on the same code, we wrote for
+# debian's setup. It ensures the terminal is in the right mode, when zle is
+# active, so the values from $terminfo are valid. Therefore, this setup should
+# work on all systems, that have support for `terminfo'. It also requires the
+# zsh in use to have the `zsh/terminfo' module built.
#
# If you are customising your `zle-line-init()' or `zle-line-finish()'
# functions, make sure you call the following utility functions in there:
@@ -1040,15 +1037,14 @@ zleiab() {
LBUFFER+=${abk[$MATCH]:-$MATCH}
}
-zle -N zleiab && bindkey ",." zleiab ## KEYB!
+zle -N zleiab
help-show-abk()
{
zle -M "$(print "Type ,. after these abbreviations to expand them:"; print -a -C 2 ${(kv)abk})"
}
-#k# Display list of abbreviations that expand when followed by ,.
-zle -N help-show-abk && bindkey '^xb' help-show-abk ## KEYB!
+zle -N help-show-abk
# press "ctrl-e d" to insert the actual date in the form yyyy-mm-dd
insert-datestamp() { LBUFFER+=${(%):-'%D{%Y-%m-%d}'}; }
@@ -1128,7 +1124,7 @@ inplaceMkDirs() {
}
#k# mkdir -p
from string under cursor or marked area
-zle -N inplaceMkDirs && bindkey '^xM' inplaceMkDirs ## KEYB!
+zle -N inplaceMkDirs
#v1# set number of lines to display per page
HELP_LINES_PER_PAGE=20
@@ -1249,8 +1245,7 @@ help-zle()
help_zle_sln=$((help_zle_sln + HELP_LINES_PER_PAGE))
zle -M "${(F)help_zle_lines[sln,help_zle_sln-1]}"
}
-#k# display help for keybindings and ZLE
-zle -N help-zle && bindkey '^xz' help-zle # note: cycle pages with consecutive use of '^xz' ## KEYB!
+zle -N help-zle
## complete word from currently visible Screen or Tmux buffer.
if check_com -c screen || check_com -c tmux; then
@@ -1292,7 +1287,7 @@ function zrcautozle() {
}
function zrcgotwidget() {
- (( ${+widgets[$i]} ))
+ (( ${+widgets[$1]} ))
}
function zrcgotkeymap() {
@@ -1315,7 +1310,7 @@ zstyle ':completion:hist-complete:*' completer _history
typeset -ga grml_missing_features
function zrcbindkey() {
- if (( ARGC && ${+widgets[${argv[-1]}]} )); then
+ if (( ARGC )) && zrcgotwidget ${argv[-1]}; then
bindkey "$@"
fi
}
@@ -1330,7 +1325,12 @@ function bind2maps () {
done
shift
- sequence="${key[$1]}"
+ if [[ "$1" == "-s" ]]; then
+ shift
+ sequence="$1"
+ else
+ sequence="${key[$1]}"
+ fi
widget="$2"
[[ -z "$sequence" ]] && return 1
@@ -1342,9 +1342,11 @@ function bind2maps () {
if (( ${+terminfo[smkx]} )) && (( ${+terminfo[rmkx]} )); then
function zle-smkx () {
+ emulate -L zsh
printf '%s' ${terminfo[smkx]}
}
function zle-rmkx () {
+ emulate -L zsh
printf '%s' ${terminfo[rmkx]}
}
function zle-line-init () {
@@ -1377,6 +1379,19 @@ key=(
BackTab "${terminfo[kcbt]}"
)
+# Guidelines for adding key bindings:
+#
+# - Do not add hardcoded escape sequences, to enable non standard key
+# combinations such as Ctrl-Meta-Left-Cursor. They are not easily portable.
+#
+# - Adding Ctrl characters, such as '^b' is okay; note that '^b' and '^B' are
+# the same key.
+#
+# - All keys from the $key[] mapping are obviously okay.
+#
+# - Most terminals send "ESC x" when Meta-x is pressed. Thus, sequences like
+# '\ex' are allowed in here as well.
+
bind2maps emacs -- Home beginning-of-somewhere
bind2maps viins vicmd -- Home vi-beginning-of-line
bind2maps emacs -- End end-of-somewhere
@@ -1392,92 +1407,107 @@ bind2maps viins vicmd -- Left vi-backward-char
bind2maps emacs -- Right forward-char
bind2maps viins vicmd -- Right vi-forward-char
bind2maps viins vicmd -- Right vi-forward-char
-
-if zrcgotkeymap menuselect; then
- bind2maps menuselect -- BackTab reverse-menu-complete
-
- #k# menu selection: pick item but stay in the menu
- zrcbindkey -M menuselect '\e^M' accept-and-menu-complete
- # also use + and INSERT since it's easier to press repeatedly
- zrcbindkey -M menuselect "+" accept-and-menu-complete
- zrcbindkey -M menuselect "^[[2~" accept-and-menu-complete
-
- # accept a completion and try to complete again by using menu
- # completion; very useful with completing directories
- # by using 'undo' one's got a simple file browser
- zrcbindkey -M menuselect '^o' accept-and-infer-next-history
-fi
-
+#k# Display list of abbreviations that expand when followed by ,.
+bind2maps emacs viins -- -s ',.' zleiab
+bind2maps emacs viins -- -s '^xb' help-show-abk
+bind2maps emacs viins -- -s '^xM' inplaceMkDirs
+#k# display help for keybindings and ZLE
+bind2maps emacs viins -- -s '^xz' help-zle
#k# Insert files and test globbing
-zrcbindkey "^xf" insert-files # C-x-f
-
+bind2maps emacs viins -- -s "^xf" insert-files
#k# Edit the current line in \kbd{\$EDITOR}
-zrcbindkey '\ee' edit-command-line
-
-## use Ctrl-left-arrow and Ctrl-right-arrow for jumping to word-beginnings on the CL
-zrcbindkey "\e[5C" forward-word
-zrcbindkey "\e[5D" backward-word
-zrcbindkey "\e[1;5C" forward-word
-zrcbindkey "\e[1;5D" backward-word
-## the same for alt-left-arrow and alt-right-arrow
-zrcbindkey '^[[1;3C' forward-word
-zrcbindkey '^[[1;3D' backward-word
-
+bind2maps emacs viins -- -s '\ee' edit-command-line
#k# search history backward for entry beginning with typed text
-zrcbindkey '^xp' history-beginning-search-backward-end
+bind2maps emacs viins -- -s '^xp' history-beginning-search-backward-end
#k# search history forward for entry beginning with typed text
-zrcbindkey '^xP' history-beginning-search-forward-end
+bind2maps emacs viins -- -s '^xP' history-beginning-search-forward-end
#k# search history backward for entry beginning with typed text
-zrcbindkey "\e[5~" history-beginning-search-backward-end # PageUp
+bind2maps emacs viins -- PageUp history-beginning-search-backward-end
#k# search history forward for entry beginning with typed text
-zrcbindkey "\e[6~" history-beginning-search-forward-end # PageDown
-
-# insert unicode character
-# usage example: 'ctrl-x i' 00A7 'ctrl-x i' will give you an §
-# See for example http://unicode.org/charts/ for unicode characters code
-#k# Insert Unicode character
-zrcbindkey '^xi' insert-unicode-char
-
-#m# k Shift-tab Perform backwards menu completion
-if [[ -n "$terminfo[kcbt]" ]]; then
- zrcbindkey "$terminfo[kcbt]" reverse-menu-complete
-elif [[ -n "$terminfo[cbt]" ]]; then # required for GNU screen
- zrcbindkey "$terminfo[cbt]" reverse-menu-complete
-fi
-
+bind2maps emacs viins -- PageDown history-beginning-search-forward-end
#k# Toggle abbreviation expansion on/off
-zrcbindkey '^xA' grml_toggle_abbrev
-zrcbindkey "^x^h" commit-to-history
-
+bind2maps emacs viins -- -s '^xA' grml_toggle_abbrev
+bind2maps emacs viins -- -s "^x^h" commit-to-history
#k# Kill left-side word or everything up to next slash
-zrcbindkey '\ev' slash-backward-kill-word
+bind2maps emacs viins -- -s '\ev' slash-backward-kill-word
#k# Kill left-side word or everything up to next slash
-zrcbindkey '\e^h' slash-backward-kill-word
+bind2maps emacs viins -- -s '\e^h' slash-backward-kill-word
#k# Kill left-side word or everything up to next slash
-zrcbindkey '\e^?' slash-backward-kill-word
-
-# use the new *-pattern-* widgets for incremental history search
-if zrcgotwidget history-incremental-pattern-search-backward; then
- zrcbindkey '^r' history-incremental-pattern-search-backward
- zrcbindkey '^s' history-incremental-pattern-search-forward
-fi
-
+bind2maps emacs viins -- -s '\e^?' slash-backward-kill-word
# Do history expansion on space:
-zrcbindkey ' ' magic-space
+bind2maps emacs viins -- -s ' ' magic-space
#k# Trigger menu-complete
-zrcbindkey '\ei' menu-complete # menu completion via esc-i
+bind2maps emacs viins -- -s '\ei' menu-complete # menu completion via esc-i
#k# Insert a timestamp on the command line (yyyy-mm-dd)
-zrcbindkey '^ed' insert-datestamp
+bind2maps emacs viins -- -s '^ed' insert-datestamp
#k# Insert last typed word
-zrcbindkey "\em" insert-last-typed-word
+bind2maps emacs viins -- -s "\em" insert-last-typed-word
#k# A smart shortcut for \kbd{fg}
-zrcbindkey '^z' grml-zsh-fg
+bind2maps emacs viins -- -s '^z' grml-zsh-fg
#k# prepend the current command with "sudo"
-zrcbindkey "^os" sudo-command-line
+bind2maps emacs viins -- -s "^os" sudo-command-line
#k# jump to after first word (for adding options)
-zrcbindkey '^x1' jump_after_first_word
+bind2maps emacs viins -- -s '^x1' jump_after_first_word
#k# complete word from history with menu
-zrcbindkey "^x^x" hist-complete
+bind2maps emacs viins -- -s "^x^x" hist-complete
+
+# insert unicode character
+# usage example: 'ctrl-x i' 00A7 'ctrl-x i' will give you an §
+# See for example http://unicode.org/charts/ for unicode characters code
+#k# Insert Unicode character
+bind2maps emacs viins -- -s '^xi' insert-unicode-char
+
+# use the new *-pattern-* widgets for incremental history search
+if zrcgotwidget history-incremental-pattern-search-backward; then
+ for seq wid in '^r' history-incremental-pattern-search-backward \
+ '^s' history-incremental-pattern-search-forward
+ do
+ bind2maps emacs viins vicmd -- -s $seq $wid
+ done
+fi
+
+if zrcgotkeymap menuselect; then
+ #m# k Shift-tab Perform backwards menu completion
+ bind2maps menuselect -- BackTab reverse-menu-complete
+
+ #k# menu selection: pick item but stay in the menu
+ bind2maps menuselect -- -s '\e^M' accept-and-menu-complete
+ # also use + and INSERT since it's easier to press repeatedly
+ bind2maps menuselect -- -s '+' accept-and-menu-complete
+ bind2maps menuselect -- Insert accept-and-menu-complete
+
+ # accept a completion and try to complete again by using menu
+ # completion; very useful with completing directories
+ # by using 'undo' one's got a simple file browser
+ bind2maps menuselect -- -s '^o' accept-and-infer-next-history
+fi
+
+# Finally, here are still a few hardcoded escape sequences; Special sequences
+# like Ctrl- etc do suck a fair bit, because they are not
+# standardised and most of the time are not available in a terminals terminfo
+# entry.
+#
+# While we do not encourage adding bindings like these, we will keep these for
+# backward compatibility.
+
+## use Ctrl-left-arrow and Ctrl-right-arrow for jumping to word-beginnings on
+## the command line.
+# URxvt sequences:
+bind2maps emacs viins vicmd -- -s '\eOc' forward-word
+bind2maps emacs viins vicmd -- -s '\eOd' backward-word
+# These are for xterm:
+bind2maps emacs viins vicmd -- -s '\e[1;5C' forward-word
+bind2maps emacs viins vicmd -- -s '\e[1;5D' backward-word
+## the same for alt-left-arrow and alt-right-arrow
+# URxvt again:
+bind2maps emacs viins vicmd -- -s '\e\e[C' forward-word
+bind2maps emacs viins vicmd -- -s '\e\e[D' backward-word
+# Xterm again:
+bind2maps emacs viins vicmd -- -s '^[[1;3C' forward-word
+bind2maps emacs viins vicmd -- -s '^[[1;3D' backward-word
+# Also try ESC Left/Right:
+bind2maps emacs viins vicmd -- -s '\e'${key[Right]} forward-word
+bind2maps emacs viins vicmd -- -s '\e'${key[Left]} backward-word
# autoloading
@@ -2129,7 +2159,7 @@ if is437; then
unset i
zstyle ':prompt:grml(|-large|-chroot):right:setup' use-rprompt false
elif (( EUID == 0 )); then
- zstyle ':prompt:grml(|-large|-chroot):*:items:user' pre '%F{red}'
+ zstyle ':prompt:grml(|-large|-chroot):*:items:user' pre '%B%F{red}'
fi
# Finally enable one of the prompts.