按 Alt+箭头键时打印的字符是什么?

按 Alt+箭头键时打印的字符是什么?

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

我认识的其他角色;

AltLeft=DAltRight=C

这些命令的目的是什么?

答案1

根据终端的配置方式,键入Alt+Key就像按顺序键入EscKey键,因此它发送 ESC 字符(又名\e^[\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一些终端喜欢rxvt及其衍生产品,例如etermsend\033后跟转义序列 for Up(即\033\033[A\033\033OA),而其他一些终端则喜欢xterm或在与, ,gnome-terminal等组合键一起使用时为这些类型的键提供单独的转义序列。AltShiftCtrl

这些通常会\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,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

这些是向后和向前搜索命令行的历史记录,这些命令行从当前命令行开始一直到光标的当前位置,这对于调用以前的命令非常方便。

答案2

您可以使用Crtl+v返回键盘的输入代码。如果您对箭头键执行此操作,您将获得[[D^[[C^[[A^[[B值。 + 箭头键没有任何默认绑定Alt,因此执行的操作似乎只是单独打印字母代码。但是,如果您创建本地版本的 readline 库配置文件:

$ cp /etc/inputrc ~/.inputrc

并添加一行:

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

+[1;3C的输入代码在哪里(您可以像使用+快捷键之前一样获取它)并重新启动终端,然后+快捷键将返回文本“sometexthere”,其他+arrow 快捷键将停止返回字符。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)) 处理第八位:

如果终端有一个充当 Shift 键的“元键”,设置传输的任何字符的第 8 位,则可以用以下命令表示这一事实:km。否则,软件将假定第 8 位是奇偶校验位,并且通常会被清除。如果存在字符串可以将其转变为“元模式” 打开和关闭,它们可以表示为smmrmm

bash也知道这一点(参见ncurses 常见问题解答),但很少有用户对该功能感兴趣。尽管如此,Alt即使元模式已关闭,他们还是习惯于称为“元”。 rxvt 和 xterm 自(至少)20 世纪 90 年代初以来就具有此功能。

其他用户(自xterm引入该功能以来补丁 #94, 1999)可能期望修饰符信息被编码为特殊键将发送的字符序列中的参数。 XTerm 的文档将这些修改后的键称为“PC风格”功能键来区分它们“VT220式”(没有修饰符)。未修改的光标键可能会发送ESC[A,但拥有范围,例如ESC[5A,哪个应用程序应该理解为重复五次。xterm的第一个版本电脑风格键使用“5”来表示control,后来的版本对其进行了更改以避免与重复计数混淆。所以...

ESC[5A

建议应用程序将光标向上移动 5 行,同时

ESC[1;5A

建议它向上移动一行,告诉应用程序control按下了某个键。

有用的组合已在 ncurses terminfo 数据库中2004年:

# 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终端描述已形成。它使用 ncurses 中提供的扩展自1999年以来它允许用户定义名称。由于 termcap 仅支持 2 个字符的名称和 1023 字节的描述,因此没有理由通过术语帽界面。它们很容易被使用的应用程序使用术语信息界面。

现在出现了一个困难:应用程序可以通过几种方法来确定这样的按键序列代表什么:

  1. 完整分析字符序列
  2. control对其进行部分分析,如果不需要则丢弃修改器
  3. 只需将字符序列与字典进行比较,希望能够通过这种方式确定含义。

很少有程序能做到第一个;一些文本编辑器会做第二个(实际上,我做了为了ded在里面20世纪80年代末)。诸如此类的应用程序的开发人员bash选择了第三条路线,假设大部分信息都在术语帽。或者,他们可以选择制作一个包含 termcap/terminfo 信息的表格,并使用提供最佳信息的界面。 xterm这样做是为了tcap 查询功能,提供vim实际的功能键分配。

由于比较的字符串都不bash匹配它接收到的字符串,因此它可能会感到困惑,并解决部分匹配(例如转义字符本身)。

进一步阅读:

相关内容