我在中创建了以下映射~/.zshrc
bindkey -s '^[u' 'whatever string'
vim
我通过在中设置以下规则来启用模式~/.zshrc
bindkey -v
当我处于插入模式并且我想进入正常模式时,我遇到的问题就出现了。如果我按Escape
,u
则会whatever string
附加到光标位置的命令提示符中。这意味着每当我按下 时Escape
,唯一不能按下的键是u
为了进入正常模式。否则我会追加whatever string
.
所以,我的问题是,如何映射Alt + u
到追加whatever string
,以便它不会通过按Escape
then来切换u
。
PD1:请注意,这是一个最小的工作示例。
PD2:我目前使用的解决方法是按Escape + {no map} + u
(其中{no map}
是尚未与 映射在一起的键Alt
)
答案1
作为@JdeBP 说,如今,当用户按下并按住该键时,终端会发送相同的字符序列Escape:U u+ 001B U+0075 ( )。uAlt\eu
Alt但是,在+的情况下u,它们会同时发送两个字符,而在Escape,的情况下,发送和字符u之间会有延迟,因为用户不会同时按下两个字符,因此应用程序通常可以告诉不同之处。\e
u
在 的行编辑器中,当和zsh
都有按键绑定时,如果在收到后几厘秒内没有收到,或者收到除 以外的字符,则会触发的按键。x
xy
x
y
$KEYTIMEOUT
x
y
默认值为$KEYTIMEOUT
40,即 0.4 秒。该值允许用户手动输入多字符绑定,但您可以将其设置得足够小,以至于人类无法如此快地输入按键序列,以确保仅在按下时触发多字符绑定组合键或功能键。
例如,如果您更改$KEYTIMEOUT
为 1(0.01 秒),那么您需要在绑定触发u后快速键入。Escape\eu
这不仅限于 zsh。大多数允许自定义键绑定的交互式终端应用程序都具有等效设置。例如,在( , , ...readline
使用的行编辑器)中,这就是变量(默认为 0.5 秒);用,查看变量和环境变量(默认1秒);使用,请参阅/选项(默认情况下为 1 秒)。bash
python
gdb
keyseq-timeout
ncurses
ESCDELAY
vim
tm
ttm
答案2
当终端通过(虚拟)线路向主机传输字符时,没有区别键序列Esc U与键和弦⎇ Alt+之间U,甚至复合键序列⎈ Control+之间[ U。
它们都被编码为␛
字符后跟u
字符。 Z shell 认为来自终端的输入字符流没有任何区别,并且无法进行区分。终端 I/O 应用程序看到的是字符,而不是按键。