以下无法将字符“#”绑定到按Ctrl+3tmux
# ~/.tmux.conf
unbind-key -T root C-3
bind-key -T root -N '#' C-3 send-keys '#'
# in a tmux session
tmux source-file ~/.tmux.conf
问题是什么?
我的终端仿真器是Alacritty。这是xxd
对Ctrl+ 3、Ctrl+ D、Ctrl+ 的反应D:
>>>xxd
^[00000000: 1b .
>>>
分析
问题是:对于从终端读取的程序来说,没有Ctrl+这样的东西3。
终端和终端仿真器不会传递最终到达程序(例如 tmux 客户端)的按键,而是传递字节流。某些键(或组合)会生成单个字节,某些键(组合)会生成(或多或少标准的)字节序列。没有为Ctrl+唯一分配的标准字节或序列3。在Ctrl+上,3虚拟终端(例如 tty4)只会为我打印
3
。我的 Kubuntu 中的 Konsole 会生成转义字符。您发布的输出显示您也获得了转义字符。在这种情况下,(或任何仅使用终端从键盘读取的程序)
xxd
无法区分+和。tmux
Ctrl3Esc不要尝试
bind-key -T root '^[' …
,因为这会破坏Esc在 tmux 下运行的程序。不局限于从标准输入读取的程序
/dev/tty
(尤其是带有 GUI 的程序)可以(半)直接读取按键,并且可以Ctrl将+与其他任何东西区分开来3。Tmux 不属于这些程序,但终端仿真器属于这些程序。解决方案
我不知道 Alacritty。也许您可以自定义 Alacritty 在Ctrl+上发送的字节(或字节序列) 3。如果是这样,那么您可以让Ctrl+3在其下运行的程序可区分。如果您知道 tmux 识别为
C-3
,则可以配置终端仿真器以生成此内容。不幸的是,我不知道 tmux 识别什么
C-3
(见下面的观察)。如果您设法让终端仿真器在Ctrl+上生成自定义序列3,那么(至少在原则上)您将使在其下运行的程序能够区分按键。然后您可以相应地配置 tmux(这可能需要链接键表)。
但是如果您只想获取
#
,那么只需配置终端仿真器,首先在Ctrl+上发送这个精确的字符。Tmux 客户端(或任何程序)将直接获取,例如在+上;无需。3#
A
ShiftAbind-key
观察
我在 tmux 中的 shell 中运行,它显示(byte ) 和(byte )
tmux send-key C-a C-3 C-b C-d C-d; xxd
之间没有生成任何内容。我得出的结论是,tmux 本身不知道在即将发送“击键”时对它意味着什么。因此,我怀疑它在读取它们时是否知道对它意味着什么。C-a
0x01
C-b
0x02
C-3
C-3
另一方面,tmux 确实允许我们将某些东西绑定到
C-3
,就好像它知道它应该意味着什么一样。为了比较:尝试tmux bind-key C-% …
产生unknown key: C-%
。即使 tmux 将某些内容识别为
C-3
,您的 Alacritty 也不会在Ctrl+上生成它3(暂时)。我试图在源代码中找到
C-3
对 tmux 可能意味着什么。我失败了。(我不是程序员。)结论
无论 tmux 是否知道它的含义,当前您的终端仿真器都会在+
C-3
时发送转义字符。更改它发送的内容应该是您的第一步。Ctrl3