yfk*_*lon 15 command-line terminal key-mapping
当我按下时AltUp,A
打印到终端屏幕。当我按下AltDown但B
被打印时发生了同样的事情。
我意识到的其他角色;
AltLeft=D
和AltRight=C
这些命令的目的是什么?
Sté*_*las 14
根据终端的配置方式,键入Alt+Key就像按顺序键入Esc和Key键,因此它会发送 ESC 字符(又名\e
或^[
或\033
),然后是按下该 时发送的字符或字符序列Key。
按下 后Up,大多数终端仿真器会发送三个字符\033[A
或\033OA
取决于它们是否处于应用程序键盘模式。
第一个确实对应于转义序列,当输出到终端时,向上移动光标。如果你这样做:
printf '\nfoo\033[Abar\n\n'
Run Code Online (Sandbox Code Playgroud)
你会看到bar
写在foo
一行之后。如果你这样做:
stty -echoctl; tput rmkx; read foo
Run Code Online (Sandbox Code Playgroud)
您会看到箭头键确实会移动光标。
当应用程序喜欢zsh
或vi
从终端读取该字符序列时,它会将其解释为“向上”操作,因为它从 terminfo 数据库(kcuu1
功能)知道它是按下 时发送的转义序列Up。
现在,对于Alt-Up,一些终端像sendrxvt
和它的派生词,比如eterm
send\033
后跟 for Up(即\033\033[A
或\033\033OA
)的转义序列,而其他一些终端喜欢xterm
或gnome-terminal
有单独的转义序列,用于这些类型的键,当与Alt, Shift,等组合键一起使用时Ctrl。
这些通常会发送\033[1;3A
时Alt-Up。
当发送到终端时,该序列也会向上移动光标(第二个参数 (3) 被忽略)。没有相应的键盘键,因此在Alt-Up进入或退出应用程序键盘模式时发送的序列相同。
现在无论是\033\033[A
还是\033[1;3A
,许多应用程序都不知道这些序列的用途。terminfo 数据库不会帮助他们,因为没有这样的功能来定义这些组合键发送的字符。
他们将尽最大努力解释那个序列。bash
例如将解释\033[1;3
为转义序列,对此一无所知,因此什么也不做,然后是A
. zsh
, 一旦发现没有已知的匹配字符序列,就会停止读取。它不知道以什么开头的转义序列,\033[1
因此它将跳过该序列,并阅读其余部分:;3A
并将其插入行编辑器中。
许多应用程序一样vi
,zsh
或readline
基于那些象gdb
或bash
(不过要小心bash
使用修改后的版本readline
)允许你添加绑定任何字符序列。
例如,在 中zsh
,您可能想要绑定Alt-Up,Alt-Down例如:
bindkey '\e[1;3A' history-beginning-search-backward
bindkey '\e[1;3B' history-beginning-search-forward
Run Code Online (Sandbox Code Playgroud)
那些是向后和向前搜索命令行的历史记录,这些命令行从当前的开始到光标的当前位置,这对于调用以前的命令非常方便。
归档时间: |
|
查看次数: |
7057 次 |
最近记录: |