如果 zsh 中没有其他绑定,则匹配的通用键绑定是什么?

如果 zsh 中没有其他绑定,则匹配的通用键绑定是什么?

鱼壳,如果没有其他绑定,则可以通过指定空字符串(即 '' )的 SEQUENCE 来设置匹配的通用键绑定。

例如:

bind '' self-insert

我检查了zsh 的文档对于类似的功能,它说:

-m

将内置的元键绑定集添加到选定的键盘映射。只有未绑定或绑定到自插入的键才会受到影响。

我不确定我是否可以将它用于我的目的。

如果 zsh 中没有其他绑定,则匹配的通用键绑定是什么?

答案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

相关内容