我想让 Nano 具有更常见的快捷方式(即 Ctrl-F 用于搜索,Ctrl-H 用于替换等)并编辑文件nanorc
以添加:
bind ^F whereis all
bind ^H replace all
bind ^M mark all
...
令我惊讶的是,按退格键可激活替换功能,按 Enter 键可激活标记。
然后我意识到他们的虚拟键码是:Backspace 0x08、H 0x48、Enter 0x0D、M 0x4D。
Ctrl 键绑定实际上在 0x40 上进行了位掩码吗?
答案1
您正在使用 Nano 的虚拟终端是根据过去几十年的物理串行终端建模的。按照惯例,当字母键或标有@
、[
、\
、]
、 、^
的键之一_
与 按键同时按下时,这些终端会生成 ASCII 控制代码Ctrl
。发出的控制码是字母代码的 ASCII 码减去 64。因此按下Ctrl-M
会产生 M (0x53) 的 ASCII 码减去 0x40 = 0x13,这就是回车码。 Return 键还会产生回车符,因为这是该键的功能。
答案2
这些不是虚拟键码。
您正在使用终端。
终端使用简单的 8 位(有时甚至是 7 位)字符流进行操作。就 TUI 应用程序所知nano
,您和它之间有一个串行端口、两个调制解调器、PSTN 和一个诚实的 DEC VT525。 全部它看到的是字符流、终端设备文件描述符、TERM
环境变量以及 terminfo 数据库中的记录。
该字符流中不存在字母键的控制键修饰符之类的东西。当你编写bind ^M
软件时实际上理解为具有约束力字符数 13。这就是软件必须在内部工作的方式,因为这是它必须使用的实际终端 I/O 模型。这^M
是软件命令解析器的产物,是一种方法表示您键入的配置命令中的字符号 13。
一些操作系统(例如 FreeBSD)提供了应用程序软件可以在其解析器中使用的通用库函数,以便为跨应用程序的此类表示生成统一的语义。
% printf '\x08\x0d' | % printf '\x08\x0d' |可见-w;回声 \^H\^M %
此外,这里没有虚拟键码。⎈ Control在字符沿着(虚拟或实际)线路传输之前,由修饰键引起的所有转换都发生在终端或终端仿真器中。
碰巧您的终端为 + 生成字符 #8 (␈),为+ 和⎈ Control生成H字符⌫ Backspace13 (␍) 。这完全取决于终端/终端模拟器。许多模拟器都有某种键盘映射,人们可以在其中更改它。对于真正的 DEC VT,实际上有一个输出控制序列 DECBKM,它在发送字符 #8 和发送字符 #127 (DEL) 之间切换。⎈ ControlMEnter⌫ Backspace
进一步阅读
- https://unix.stackexchange.com/a/382814/5132
- 为什么 Enter 键不发送 EOL?
- 将制表符显示为“^I”
vis()
、strvis()
、 等。。 FreeBSD 库函数手册。 2017年4月22日。unvis
。 FreeBSD 通用命令手册。 2010年11月7日。