创建包含“Alt”的键盘快捷键,按“Escape”不会触发

创建包含“Alt”的键盘快捷键,按“Escape”不会触发

我在中创建了以下映射~/.zshrc

bindkey -s '^[u' 'whatever string'

vim我通过在中设置以下规则来启用模式~/.zshrc

bindkey -v

当我处于插入模式并且我想进入正常模式时,我遇到的问题就出现了。如果我按Escapeu则会whatever string附加到光标位置的命令提示符中。这意味着每当我按下 时Escape,唯一不能按下的键是u为了进入正常模式。否则我会追加whatever string.

所以,我的问题是,如何映射Alt + u到追加whatever string,以便它不会通过按Escapethen来切换u

PD1:请注意,这是一个最小的工作示例。

PD2:我目前使用的解决方法是按Escape + {no map} + u(其中{no map}是尚未与 映射在一起的键Alt

答案1

作为@JdeBP 说,如今,当用户按下并按住该键时,终端会发送相同的字符序列Escape:U u+ 001B U+0075 ( )。uAlt\eu

Alt但是,在+的情况下u,它们会同时发送两个字符,而在Escape,的情况下,发送和字符u之间会有延迟,因为用户不会同时按下两个字符,因此应用程序通常可以告诉不同之处。\eu

在 的行编辑器中,当和zsh都有按键绑定时,如果在收到后几厘秒内没有收到,或者收到除 以外的字符,则会触发的按键。xxyxy$KEYTIMEOUTxy

默认值为$KEYTIMEOUT40,即 0.4 秒。该值允许用户手动输入多字符绑定,但您可以将其设置得足够小,以至于人类无法如此快地输入按键序列,以确保仅在按下时触发多字符绑定组合键或功能键。

例如,如果您更改$KEYTIMEOUT为 1(0.01 秒),那么您需要在绑定触发u后快速键入。Escape\eu

这不仅限于 zsh。大多数允许自定义键绑定的交互式终端应用程序都具有等效设置。例如,在( , , ...readline使用的行编辑器)中,这就是变量(默认为 0.5 秒);用,查看变量和环境变量(默认1秒);使用,请参阅/选项(默认情况下为 1 秒)。bashpythongdbkeyseq-timeoutncursesESCDELAYvimtmttm

答案2

当终端通过(虚拟)线路向主机传输字符时,没有区别键序列Esc U与键和弦⎇ Alt+之间U,甚至复合键序列⎈ Control+之间[ U

它们都被编码为字符后跟u字符。 Z shell 认为来自终端的输入字符流没有任何区别,并且无法进行区分。终端 I/O 应用程序看到的是字符,而不是按键。

相关内容