这些不是虚拟键码。

这些不是虚拟键码。

我想让 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

进一步阅读

相关内容