按下Alt + Arrow键时打印的字符是什么?


13

当我按时AltUp,将A打印到终端屏幕。当我按下AltDownB打印时发生了同样的事情。

我意识到的其他角色;

AltLeft= DAltRight=C

这些命令的目的是什么?

Answers:


14

根据终端的配置方式,键入Alt+Key就像按顺序键入EscKey键一样,因此它发送ESC字符(aka \e^[or \033),然后发送按该字符时发送的字符或字符序列Key

按下时Up,大多数终端仿真器将发送三个字符\033[A或发送三个字符,\033OA具体取决于它们是否处于应用程序键盘模式。

第一个确实对应于转义序列,当输出到终端时,将光标向上移动。如果您这样做:

printf '\nfoo\033[Abar\n\n'

排成一行bar后,您会看到书面内容foo。如果您这样做:

stty -echoctl; tput rmkx; read foo

您会看到箭头键确实会移动光标。

当应用程序喜欢zshvi从终端读取该字符序列时,它将其解释为“向上”动作,因为它从terminfo数据库(kcuu1功能)中知道这是按时发送的转义序列Up

现在,对于Alt-Up,某些终端like rxvt和它的派生词etermsend \033后面跟有Up\033\033[A\033\033OA)的转义序列,而另一些终端用户喜欢xtermgnome-terminal具有与组合键AltShift,,)一起使用的那些类型的键的单独转义序列Ctrl

这些通常会发送\033[1;3AAlt-Up

当发送到终端时,该序列还将使光标向上移动(第二个参数(3)将被忽略)。没有相应的键盘键,因此Alt-Up应用程序键盘模式输入或输出时都具有相同的顺序。

现在,无论是\033\033[A还是\033[1;3A,许多应用程序都不知道这些序列的用途。terminfo数据库无法为他们提供帮助,因为没有这样的功能来定义这些组合键发送的字符。

他们将尽力解释该顺序。bash例如将解释\033[1;3为转义序列,对此一无所知,因此一无所获,后跟Azsh,一旦发现没有已知的匹配字符序列,将立即停止阅读。它知道没有以它开头的转义序列,\033[1因此它将跳过该序列,然后阅读其余序列:;3A并将其插入到行编辑器中。

许多应用程序(例如vi,,zshreadline基于gdb或)bash(尽管请注意bash使用的修改版本readline)允许您为任何字符序列添加绑定。

例如,在中zsh,您可能想绑定Alt-UpAlt-Down例如:

bindkey '\e[1;3A' history-beginning-search-backward
bindkey '\e[1;3B' history-beginning-search-forward

这些命令将在历史记录中向前和向后搜索以从当前行开始直到光标的当前位置的命令行,这很容易调用以前的命令。


3

您可以使用Crtl+ v返回键盘输入代码。如果你这样做的箭头键,你会得到[[D^[[C^[[A^,和[[B值。Alt+箭头键没有任何默认绑定,因此似乎执行的操作仅是打印字母代码。如果您创建本地版本的readline库配置文件,请执行以下操作:

$ cp /etc/inputrc ~/.inputrc

并添加一行:

"\e[1;3C": "sometexthere"

+的[1;3C输入代码在哪里(您可以使用+ 快捷方式之前获得它)并重新启动终端,然后+ 快捷方式将返回文本“ sometexthere”,而其他+箭头快捷方式将停止返回字符。AltCrtlvCrtlAlt

相反,您可以从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


3

Alt键通常用作修饰符。光标键和功能键被称为特殊键,因为它们可能发送多个字符,并且发送的字符可以更改。

例如,某些用户bash希望按下Alt会发送以转义字符为前缀的键。已记录的“元”功能(请参阅terminfo(5)参考资料)处理的是第八位:

如果终端具有用作移位键的“元键”,则将传输的任何字符的第8位设置为1,则可以用表示这一事实km。否则,软件将假定第8位是奇偶校验,通常将其清除。如果存在字符串以打开 和关闭此“元模式”,则可以将它们指定为smmrmm

bash也知道这一点(请参阅ncurses FAQ),但是很少有用户对该功能感兴趣。但是,Alt即使关闭了元模式,他们还是习惯将其称为“元”。从至少1990年代初期开始,rxvt和xterm都具有此功能。

其他用户(因为xterm1999年第94号补丁中引入了此功能)可能希望将修饰符信息编码为特殊键将发送的字符序列中的参数。XTerm的文档将这些经过修改的键称为“ PC样式”功能键,以将其与“ VT220样式”(没有修饰符)区分开。未经修改的光标键可能会发送ESC[A,但拥有一个参数(例如)也是合法的ESC[5A,应用程序应将其理解为重复该命令五次。xtermPC样式键的第一个版本使用“ 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界面的应用程序随时可以使用它们。

现在遇到了一个难题:应用程序可以通过几种方法来确定类似的键序列代表什么:

  1. 完整分析字符序列
  2. 部分分析它,并在control不需要时丢弃修饰符
  3. 只需将字符序列与字典进行比较,希望以此方式确定其含义。

很少有程序可以做到这一点。一些文本编辑器会做第二个(实际上,我是在1980年代后期这样ded的)。诸如此类的应用程序的开发人员通过假定大多数信息都在termcap中来选择了第三条路线。或者,他们可以选择制作一个带有termcap / terminfo信息的表,并使用提供最佳信息的界面。 为tcap查询功能执行此操作,并提供实际的功能键分配。bashxtermvim

由于没有一个bash与之比较的字符串与接收到的字符串相匹配,因此它可能会感到困惑,会解决部分匹配问题(例如,转义字符本身)。

进一步阅读:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.