答案1
在 中zsh
,当找不到键(终端发送的字节序列)的映射时调用的小部件是undefined-key
默认发出蜂鸣声的小部件,但您可以将其重新定义为其他内容,例如:
undefined-key() {
zle -M "${(q+)KEYS} is not bound to anything"
zle .$WIDGET
}
zle -N undefined-key
或者让它插入光标左侧的原始字节:
undefined-key() LBUFFER+=$KEYS
zle -N undefined-key
它不是self-insert
,self-insert
在诸如emacs
或 之类的键映射中viins
,由于它绑定到R
字节范围而绑定到键:
$ bindkey | awk '$NF == "self-insert"'
" "-"~" self-insert
"\M-^@"-"\M-^?" self-insert
这是 32(空格)到 255(M-^?)的所有字节值,不包括 127(^?
它绑定到backward-delete-char
)。
您可以通过以下方式绑定到其他内容:
my-self-insert() { zle -M "You entered <$KEYS>"; zle self-insert; }
zle -N my-self-insert
for range (' -~' '\x80-\xff') bindkey -R $range my-self-insert
尽管可能更惯用的方法是重新定义self-insert
:
self-insert() { zle -M "You entered <$KEYS>"; zle .$WIDGET; }
请注意,对于多字节字符,该小部件会为字符中的每个字节调用一次,并且据我所知,范围的边界只能是单个字节。
self-insert
也只适用于单个字节,尽管你总是可以这样做:
my-self-insert() {
zle -M "You entered <$KEYS>"
repeat ${NUMERIC-1} LBUFFER+=$KEYS
}
for c ({$'\ua0'..$'\uff'}) bindkey $c my-self-insert
绑定到 Unicode 字符 U+00A1 到 U+00FF 并通过将(导致调用小部件的终端发送的字节或字节序列)附加到(行编辑缓冲区左侧的部分)来my-self-insert
手动执行自插入光标)。$KEYS
$LBUFFER