我的鱼配置包含以下绑定:
bind \ci nextd-or-forward-word
bind \co prevd-or-backward-word
bind \t complete
当我注释掉complete
目录导航到 时,它会按预期工作。但是,打开它会导致 重新绑定\ci
,Tab
因此nextd-or-forward-word
不再起作用。我知道根据控制字符没问题,并且我还可以通过以下方式确认:
>> fish_key_reader
Press a key:
hex: 9 char: \cI (or \t)
bind \t 'do something'
但是我想区分\cI
和Tab
。有没有办法在 Fish 中实现这一点?
答案1
你不能。在终端上下文中,Ctrl+I 是 Tab。 让我解释。
发明 Control 键是为了让终端用户可以输入终端键盘上可能没有专用键的“控制字符”。控制字符是所有值低于十进制 32 (0x20) 的 ASCII 字符。按住 Control 键并按下另一个非修饰键基本上会从按下该键时通常发送的 ASCII 代码值中减去十进制 64 (0x40)(它会清除 64 的位置位)。
因此,由于I
ASCII 为 0x49 且HT
(水平制表符)为 ASCII 0x09,Ctrl-I 发送的值与按下 Tab 键完全相同。
现代终端仿真器仍然通过物理终端时代的旧机制与操作系统进行交互,因此 shell 无法区分Ctrl+I和Tab;shell 只能判断已发送 0x09。
现代 GUI 应用程序的 API 通常有办法获取有关直接连接到计算机的键盘上按下的键的更多信息,但旧的终端、tty/pty 设备、shell 等系统从未更新过以提供该级别的按键详细信息。