这手册页for bind 似乎没有链接到语法解释,因此在尝试转换bind -p
为人类可读格式时,我可以过滤掉从 483 到 109 的垃圾,但随后我只能理解 73;
bind -p 2>/dev/null \
| grep -vP "digit-argument|do-lowercase-version|not bound|self-insert" \
| perl -pe 's/\\e/[alt]/g;s/\\C/[control]/g' \
| grep -P "[\-\]].\""
"[control]-g": abort
"[control]-x[control]-g": abort
"[alt][control]-g": abort
"[control]-j": accept-line
"[control]-m": accept-line
"[control]-b": backward-char
"[control]-h": backward-delete-char
"[control]-?": backward-delete-char
"[control]-x[control]-?": backward-kill-line
"[alt][control]-h": backward-kill-word
"[alt][control]-?": backward-kill-word
"[alt]b": backward-word
"[alt]<": beginning-of-history
"[control]-a": beginning-of-line
"[alt]c": capitalize-word
"[control]-]": character-search
"[alt][control]-]": character-search-backward
"[control]-l": clear-screen
"[control]-i": complete
"[alt]!": complete-command
"[alt]/": complete-filename
"[alt]@": complete-hostname
"[alt]{": complete-into-braces
"[alt]~": complete-username
"[alt]$": complete-variable
"[control]-d": delete-char
"[control]-x[control]-v": display-shell-version
"[alt]l": downcase-word
"[alt][control]-i": dynamic-complete-history
"[control]-x[control]-e": edit-and-execute-command
"[alt]>": end-of-history
"[control]-e": end-of-line
"[control]-x[control]-x": exchange-point-and-mark
"[control]-f": forward-char
"[control]-s": forward-search-history
"[alt]f": forward-word
"[alt]g": glob-complete-word
"[alt]^": history-expand-line
"[alt]#": insert-comment
"[alt]*": insert-completions
"[alt].": insert-last-argument
"[alt]_": insert-last-argument
"[control]-k": kill-line
"[alt]d": kill-word
"[control]-n": next-history
"[alt]n": non-incremental-forward-search-history
"[alt]p": non-incremental-reverse-search-history
"[control]-o": operate-and-get-next
"[alt]=": possible-completions
"[alt]?": possible-completions
"[control]-p": previous-history
"[control]-q": quoted-insert
"[control]-v": quoted-insert
"[control]-x[control]-r": re-read-init-file
"[control]-r": reverse-search-history
"[alt][control]-r": revert-line
"[alt]r": revert-line
"[control]-@": set-mark
"[alt] ": set-mark
"[alt][control]-e": shell-expand-line
"[alt]&": tilde-expand
"[control]-t": transpose-chars
"[alt]t": transpose-words
"[control]-x[control]-u": undo
"[control]-_": undo
"[control]-u": unix-line-discard
"[control]-w": unix-word-rubout
"[alt]u": upcase-word
"[control]-y": yank
"[alt].": yank-last-arg
"[alt]_": yank-last-arg
"[alt][control]-y": yank-nth-arg
"[alt]y": yank-pop
还押36我还没有破译;
bind -p 2>/dev/null \
| grep -vP "digit-argument|do-lowercase-version|not bound|self-insert" \
| perl -pe 's/\\e/[alt]/g;s/\\C/[control]/g' \
| grep -vP "[\-\]].\""
"[alt]OD": backward-char
"[alt][D": backward-char
"[alt][alt][D": backward-word
"[alt][1;5D": backward-word
"[alt][5D": backward-word
"[alt]OH": beginning-of-line
"[alt][1~": beginning-of-line
"[alt][H": beginning-of-line
"[alt][200~": bracketed-paste-begin
"[control]-xe": call-last-kbd-macro
"[alt][alt]": complete
"[alt][3~": delete-char
"[alt]\\": delete-horizontal-space
"[control]-x)": end-kbd-macro
"[alt]OF": end-of-line
"[alt][4~": end-of-line
"[alt][F": end-of-line
"[alt]OC": forward-char
"[alt][C": forward-char
"[alt][alt][C": forward-word
"[alt][1;5C": forward-word
"[alt][5C": forward-word
"[control]-x*": glob-expand-word
"[control]-xg": glob-list-expansions
"[alt]OB": next-history
"[alt][B": next-history
"[control]-x!": possible-command-completions
"[control]-x/": possible-filename-completions
"[control]-x@": possible-hostname-completions
"[control]-x~": possible-username-completions
"[control]-x$": possible-variable-completions
"[alt]OA": previous-history
"[alt][A": previous-history
"[alt][2~": quoted-insert
"[control]-x(": start-kbd-macro
例如,我知道这三个之一必须是alt→;
bind -p | grep forward-word | grep \\[
"\e\e[C": forward-word
"\e[1;5C": forward-word
"\e[5C": forward-word
但我不知道哪一个,也不知道其他的是什么。是否有这 36 个通常对应的列表?
[编辑1] 感谢@undercat 的提示,^V
我能够将未知数降至 7。
bind -p 2>/dev/null \
| grep -vP "digit-argument|do-lowercase-version|not bound|self-insert" \
| perl -pe 's/\\e\[A/[up]/g' \
| perl -pe 's/\\e\[B/[down]/g' \
| perl -pe 's/\\e\[C/[right]/g' \
| perl -pe 's/\\e\[D/[left]/g' \
| perl -pe 's/\\e\[1;5A/[control]-[up]/g' \
| perl -pe 's/\\e\[1;5B/[control]-[down]/g' \
| perl -pe 's/\\e\[1;5C/[control]-[right]/g' \
| perl -pe 's/\\e\[1;5D/[control]-[left]/g' \
| perl -pe 's/\\e\[2~/[control]-[insert]/g' \
| perl -pe 's/\\e\[3~/[control]-[delete]/g' \
| perl -pe 's/\\e/[alt]/g;s/\\C/[control]/g' \
| grep -P "\[[^\]]*\"" \
| perl -pe 's/\[alt\]/\\e/g;s/\[control\]/\\C/g'
"\e[5D": backward-word
"\e[1~": beginning-of-line
"\e[H": beginning-of-line
"\e[200~": bracketed-paste-begin
"\e[4~": end-of-line
"\e[F": end-of-line
"\e[5C": forward-word
[EDIT2] 感谢@JdeBP 的 nosh 和printf
提示,但是decode-ecma48 的输出(来自 nosh-terminal-management_1.39_amd64)对我来说同样难以解读;
... \
| perl -pe 's/:.*//g;s/"//g;s/^/\\/g' \
| xargs -I {} printf '{}' \
| ./console-decode-ecma48
CUB 5
DEC FIND
CUP 0
DEC FNK 200;1
DEC SELECT
CPL 1
CUF 5
JdeBP 或其他人可以将这些老式缩写翻译成完整的现代缩写(示例1,示例2,与古代的例子)键(如果它们甚至映射到现代键盘)?
答案1
可以从手册页中收集有关按键序列的大量信息console_codes
。例如,\e[1;5C
我们有:
ECMA-48 CSI 序列
CSI(或 ESC [)后面跟着一系列参数,最多为 NPAR (16),这些参数是用分号分隔的十进制数字。 (...) CSI 序列的动作由其最终字符决定。
这告诉我们第一个数字1
是参数并且C
是操作。再往下看我们就可以成功定位到action:
C CUF 将光标向右移动指定的列数。
这意味着该序列描述了将光标向右移动一个符号的键......这就是→键!
这里未记录的(?)前缀5
表示控制键。它被提到在以下文件,尽管我认为猜测它会更容易(但肯定不容易!)。
我不知道将这样的转义码转换为人类可读形式的简单方法,但是相反方向的转换很简单,您只需按C-vBash,然后按组合键,其控制序列就会以符号形式显示在屏幕上,因此例如Ctrl+ v,Ctrl→将产生^[[1;5C
。
答案2
console-decode-ecma48 似乎不起作用;
从问题给出的输出来看,很清楚做过工作。不起作用的是您的echo
命令,您错误地调用了该命令,而没有首先生成控制序列。显示的解码输出就是您的echo
命令实际上排放。
%echo -n '\e[1;5D' \e[1;5D%
console-decode-ecma48
解码实际的ECMA-48 控制序列,用于终端输入和输出,而不是它们的编码表示。因此,您需要为其提供实际的 ECMA-48 控制序列。
有多种方法可以echo
做到这一点,但不同 shell 所发生的情况echo
有所不同,更好的方法是使用printf
.
%printf '\e[1;5D' | '\e[1;5D' |控制台解码ecma48--输入 控制+CUB 1 %
然而,这并不理想,因为 GNU Readline 使用的编码是特殊的,并且不完全与其他任何东西共享,例如printf
and (有时)在echo
或vis
/unvis
编码中使用的转义序列。
printf
将处理许多剩余的未知数,但无法将\C-
序列转换为控制代码。您需要预先将形式转换为可以理解的八进制转义序列。否则,它根本不会首先打印要解码的正确 ECMA-48 字符序列。\C-c
printf
%printf '\Cg' | 打印控制台解码ecma48--输入 '\' 'C' '-' 'G' %printf '\007' | printf '\007' |控制台解码ecma48--输入 贝尔 %
该--input
选项是必要的,因为这是终端输入你正在解码。要处理⎇ Alt关键和弦,您将还需要--no-7bit
阻止解码(几乎所有)ECMA-48 的选项7位代码扩展名和其他转义序列,否则将根据 ECMA-48 解码为其正确含义。
%printf '\eD' | 打印控制台解码ecma48--输入 临床试验 %printf '\eb' |控制台解码ecma48--输入 电磁干扰 %printf '\eD' | 打印控制台解码-ecma48 --输入 --no-7bit 元“D” %printf '\eb' |控制台解码-ecma48 --输入 --no-7bit 元“b” %
循环遍历第一个字段序列的输出bind -p
并将其输入printf
(预先转换为八进制转义),作为练习留给读者,从问题中可以清楚地看出您知道如何做到这一点。\C-c
输出中使用的标准缩写的含义请参见手册中的解释和引用的标准。
进一步阅读
- 为什么 printf 比 echo 更好?
- 乔纳森·德博因·波拉德 (2018)。 ”
console-decode-ecma48
”。 小吃指南。软件。