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