当我按 时AltUp,A
打印到终端屏幕。当我按下AltDown但B
打印时发生了同样的事情。
我认识的其他角色;
AltLeft=D
和AltRight=C
这些命令的目的是什么?
答案1
根据终端的配置方式,键入Alt+Key就像按顺序键入Esc和Key键,因此它发送 ESC 字符(又名\e
或^[
或\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一些终端喜欢rxvt
及其衍生产品,例如eterm
send\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
,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
这些是向后和向前搜索命令行的历史记录,这些命令行从当前命令行开始一直到光标的当前位置,这对于调用以前的命令非常方便。
答案2
您可以使用Crtl+v返回键盘的输入代码。如果您对箭头键执行此操作,您将获得[[D^
、[[C^
、[[A^
和[[B
值。 + 箭头键没有任何默认绑定Alt,因此执行的操作似乎只是单独打印字母代码。但是,如果您创建本地版本的 readline 库配置文件:
$ cp /etc/inputrc ~/.inputrc
并添加一行:
"\e[1;3C": "sometexthere"
+[1;3C
的输入代码在哪里(您可以像使用+快捷键之前一样获取它)并重新启动终端,然后+快捷键将返回文本“sometexthere”,其他+arrow 快捷键将停止返回字符。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
答案3
该Alt密钥通常用作元修饰符。光标键和功能键称为特殊键因为它们可能会发送多个字符 - 并且发送的字符可以更改。
例如,一些用户期望bash
按下Alt将发送以转义字符为前缀的键。记录的“元”功能(参见terminfo(5)
) 处理第八位:
如果终端有一个充当 Shift 键的“元键”,设置传输的任何字符的第 8 位,则可以用以下命令表示这一事实:
km
。否则,软件将假定第 8 位是奇偶校验位,并且通常会被清除。如果存在字符串可以将其转变为“元模式” 打开和关闭,它们可以表示为smm
和rmm
。
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 字节的描述,因此没有理由通过术语帽界面。它们很容易被使用的应用程序使用术语信息界面。
现在出现了一个困难:应用程序可以通过几种方法来确定这样的按键序列代表什么:
- 完整分析字符序列
- control对其进行部分分析,如果不需要则丢弃修改器
- 只需将字符序列与字典进行比较,希望能够通过这种方式确定含义。
很少有程序能做到第一个;一些文本编辑器会做第二个(实际上,我做了这为了ded
在里面20世纪80年代末)。诸如此类的应用程序的开发人员bash
选择了第三条路线,假设大部分信息都在术语帽。或者,他们可以选择制作一个包含 termcap/terminfo 信息的表格,并使用提供最佳信息的界面。 xterm
这样做是为了tcap 查询功能,提供vim
实际的功能键分配。
由于比较的字符串都不bash
匹配它接收到的字符串,因此它可能会感到困惑,并解决部分匹配(例如转义字符本身)。
进一步阅读: