我无论如何也无法在 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
结构中使用的名称:erase
,kill
和lnext
. 没有discard
. bash
不设置它(或重置它)。