Answers:
根据终端的配置方式,键入Alt+Key就像按顺序键入Esc和Key键一样,因此它发送ESC字符(aka \e
或^[
or \033
),然后发送按该字符时发送的字符或字符序列Key。
按下时Up,大多数终端仿真器将发送三个字符\033[A
或发送三个字符,\033OA
具体取决于它们是否处于应用程序键盘模式。
第一个确实对应于转义序列,当输出到终端时,将光标向上移动。如果您这样做:
printf '\nfoo\033[Abar\n\n'
排成一行bar
后,您会看到书面内容foo
。如果您这样做:
stty -echoctl; tput rmkx; read foo
您会看到箭头键确实会移动光标。
当应用程序喜欢zsh
或vi
从终端读取该字符序列时,它将其解释为“向上”动作,因为它从terminfo数据库(kcuu1
功能)中知道这是按时发送的转义序列Up。
现在,对于Alt-Up,某些终端like rxvt
和它的派生词eterm
send \033
后面跟有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
这些命令将在历史记录中向前和向后搜索以从当前行开始直到光标的当前位置的命令行,这很容易调用以前的命令。
您可以使用Crtl+ v返回键盘输入代码。如果你这样做的箭头键,你会得到[[D^
,[[C^
,[[A^
,和[[B
值。Alt+箭头键没有任何默认绑定,因此似乎执行的操作仅是打印字母代码。如果您创建本地版本的readline库配置文件,请执行以下操作:
$ cp /etc/inputrc ~/.inputrc
并添加一行:
"\e[1;3C": "sometexthere"
+的[1;3C
输入代码在哪里(您可以使用+ 快捷方式之前获得它)并重新启动终端,然后+ 快捷方式将返回文本“ sometexthere”,而其他+箭头快捷方式将停止返回字符。Alt→CrtlvCrtl→Alt
相反,您可以从http://www.gnu.org/software/bash/manual/html_node/Bindable-Readline-Commands.html#Bindable-Readline-Commands传递可绑定的命令,例如
"\e[1;3C": unix-line-discard
具有与Crtl+ u(删除行)相同的效果。
此处提供更多信息:http : //cnswww.cns.cwru.edu/php/chet/readline/readline.html
该Alt键通常用作元修饰符。光标键和功能键被称为特殊键,因为它们可能发送多个字符,并且发送的字符可以更改。
例如,某些用户bash
希望按下Alt会发送以转义字符为前缀的键。已记录的“元”功能(请参阅terminfo(5)
参考资料)处理的是第八位:
如果终端具有用作移位键的“元键”,则将传输的任何字符的第8位设置为1,则可以用表示这一事实
km
。否则,软件将假定第8位是奇偶校验,通常将其清除。如果存在字符串以打开 和关闭此“元模式”,则可以将它们指定为smm
和rmm
。
bash
也知道这一点(请参阅ncurses FAQ),但是很少有用户对该功能感兴趣。但是,Alt即使关闭了元模式,他们还是习惯将其称为“元”。从至少1990年代初期开始,rxvt和xterm都具有此功能。
其他用户(因为xterm
在1999年第94号补丁中引入了此功能)可能希望将修饰符信息编码为特殊键将发送的字符序列中的参数。XTerm的文档将这些经过修改的键称为“ PC样式”功能键,以将其与“ VT220样式”(没有修饰符)区分开。未经修改的光标键可能会发送ESC[A,但拥有一个参数(例如)也是合法的ESC[5A,应用程序应将其理解为重复该命令五次。xterm
的PC样式键的第一个版本使用“ 5”表示control,后来又对其进行了更改,以避免与重复计数混淆。所以...
ESC[5A
建议应用程序将光标向上移动5行,而
ESC[1;5A
建议它向上移动一行,告诉应用程序control已按下一个键。
自2004年以来,有用的组合已存在于ncurses terminfo数据库中:
# 2004-07-17
# * add xterm-pc-fkeys -TD
terminfo数据库显示xterm + pcfkeys的当前版本,并带有注释,显示修饰符的编码方式:
# This fragment describes as much of XFree86 xterm's "pc-style" function
# keys as will fit into terminfo's 60 function keys.
# From ctlseqs.ms:
# Code Modifiers
# ---------------------------------
# 2 Shift
# 3 Alt
# 4 Shift + Alt
# 5 Control
# 6 Shift + Control
# 7 Alt + Control
# 8 Shift + Alt + Control
# ---------------------------------
# The meta key may also be used as a modifier in this scheme, adding another
# bit to the parameter.
(Alt和meta不一定是相同的键)。那是构成终端描述的组成部分(又由其他组成部分组成)xterm
。自1999年以来,它使用ncurses中提供的扩展名,该扩展名允许用户定义名称。由于termcap仅支持2个字符的名称和1023个字节的描述,因此没有理由通过termcap接口使这些扩展名称可用。使用terminfo界面的应用程序随时可以使用它们。
现在遇到了一个难题:应用程序可以通过几种方法来确定类似的键序列代表什么:
很少有程序可以做到这一点。一些文本编辑器会做第二个(实际上,我是在1980年代后期这样做ded
的)。诸如此类的应用程序的开发人员通过假定大多数信息都在termcap中来选择了第三条路线。或者,他们可以选择制作一个带有termcap / terminfo信息的表,并使用提供最佳信息的界面。 为tcap查询功能执行此操作,并提供实际的功能键分配。bash
xterm
vim
由于没有一个bash
与之比较的字符串与接收到的字符串相匹配,因此它可能会感到困惑,会解决部分匹配问题(例如,转义字符本身)。
进一步阅读: