From e7944e7606442684578fb2d31f8e811ece0b1403 Mon Sep 17 00:00:00 2001 From: Bart Schaefer Date: Mon, 31 Jul 2006 06:33:48 +0000 Subject: unposted: a technique for overriding ZLE widgets within a selected keymap --- Functions/Zle/keymap+widget | 76 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 Functions/Zle/keymap+widget (limited to 'Functions') diff --git a/Functions/Zle/keymap+widget b/Functions/Zle/keymap+widget new file mode 100644 index 000000000..2a437c234 --- /dev/null +++ b/Functions/Zle/keymap+widget @@ -0,0 +1,76 @@ +#autoload + +## +# self-insert-by-keymap originally appeared in zsh-users/10559 (July 2006). +# Changes have been made to the widget naming scheme, based on feedback on +# the mailing list thread. +## + +emulate -L zsh +zmodload -i zsh/zleparameter || return 1 + +# Rebind the most common widgets to override in multiple keymaps. Ideally +# complete-word would also be in this list, but so many other things +# already rebind complete-word that doing so here is a waste of effort. + +local -a m +local w='' k='' +for w in self-insert accept-line forward-char backward-char \ + up-{,line-or-}history down-{,line-or-}history \ + magic-space backward-delete-char delete-char-or-list +do + + # If this is run early enough that all the widgets are still builtins, + # no explicit remapping is needed. If they've already been rebound, + # it's not safe to assume we can do so again. + + if [[ $widgets[$w] != (builtin|user:$w-by-keymap) ]] + then + m+="Cannot rebind $w: $widgets[$w]" + continue + fi + + function $w-by-keymap { + if (( $+widgets[$KEYMAP+$WIDGET] == 1 )) + then zle $KEYMAP+$WIDGET "$@" + else zle .$WIDGET "$@" + fi + } + + zle -N $w $w-by-keymap + +done + +[[ -n $m ]] && { zle && zle -M "${(F)m}" || print -l -u2 -R $m } + +return 0 + +# With this in place, you should rarely need "zle -N self-insert frob" +# again. Instead you do this: +# +# bindkey -N frobber main +# zle -N frobber+self-insert frob +# +# Then, whenever you wish to replace self-insert with frob, change +# keymaps: +# +# zle recursive-edit -K frobber + +# Here's a simple example, which improves upon the caps-lock example in +# the zsh manual entry for recursive-edit: +# +# ucase+self-insert() { +# LBUFFER+=${(U)KEYS[-1]} +# } +# zle -N ucase+self-insert +# caps-lock() { +# bindkey -N ucase $KEYMAP +# bindkey -M ucase "$KEYS" .accept-line +# zle recursive-edit -K ucase || zle send-break +# } +# zle -N caps-lock +# +# To turn this on, pick a key sequence (I've chosen ctrl-x shift-L) and +# bind the caps-lock widget to it: +# +# bindkey -M main '^XL' caps-lock -- cgit 1.4.1