无法在 macOS Sierra 上的 iTerm2 中绑定 Bash 中的 Ctrl-o

无法在 macOS Sierra 上的 iTerm2 中绑定 Bash 中的 Ctrl-o

我无论如何也无法在 iTerm2/Bash 上重新绑定 Ctrl-o。

这是我的 cchars 的 stty -a 标志:

cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
stop = ^S; susp = ^Z; time = 0; werase = ^W;

这是我的.inputrc:

set bind-tty-special-chars off
Control-o: "> output"

不过,Rebind Cu 可以工作,所以这种不一致让我抓狂。如果有人能向我解释原因,我将不胜感激。

答案1

简而言之:该功能仅适用于編輯字符;discard不是编辑字符。

更长:使用源。有一个表,其中lib/readline/bind.c有以下条目:

  { “bind-tty-special-chars”, &_rl_bind_stty_chars, 0 },

它将选项名称赋值给变量的地址。该变量在 libreadline 中的几个地方进行了测试,最终进入此函数:

    /* 重新绑定 readline 担心的所有 tty 特殊字符
       自行插入。在保存当前终端特殊之前调用此命令
       字符与 save_tty_chars()。这仅适用于 POSIX termios 或 termio
       系统。*/
    空白
    rl_tty_unset_default_bindings (kmap)
         键盘映射 kmap;
    {
      /* 在我们至少保存一次 tty 特殊字符之前不要打扰。 */
      如果 (RL_ISSTATE(RL_STATE_TTYCSAVED) == 0)
        返回;

      重置特殊(_rl_tty_chars.t_erase);
      重置特殊(_rl_tty_chars.t_kill);

    # 如果定义(VLNEXT)&& 定义(TERMIOS_TTY_DRIVER)
      重置特殊(_rl_tty_chars.t_lnext);
    # 万一 /* VLNEXT && TERMIOS_TTY_DRIVER */

    # 如果定义(VWERASE)&& 定义(TERMIOS_TTY_DRIVER)
      重置特殊(_rl_tty_chars.t_werase);
    # 万一 /* VWERASE && TERMIOS_TTY_DRIVER */
    }

您可以看到stty结构中使用的名称:erasekilllnext. 没有discard. bash不设置它(或重置它)。

相关内容