![在 inputrc 中绑定 Ctrl-\ 吗?](https://linux22.com/image/70440/%E5%9C%A8%20inputrc%20%E4%B8%AD%E7%BB%91%E5%AE%9A%20Ctrl-%5C%20%E5%90%97%EF%BC%9F.png)
我一直在搞这个,似乎无法让它发挥作用。在终端中使用Ctrl+可以正确输出该组合,因此它应该是可识别的。V^\
由于我在 emacs 中将Ctrl+\绑定到了挂起帧,因此我希望能够通过再次按Ctrl+快速返回前台\。
我相信这是唯一可行的组合:
"\C-\\": "fg\n"
如果我在这个组合的+Enter之后点击,我会得到以下输出,这可能有用:CtrlV
bash: $'\034': command not found
答案1
Ctrl+\ 是导致终端发送信号 (SIGQUIT) 的控制字符之一,如 Ctrl+C (SIGINT) 和 Ctrl+Z (SIGTSTP)。你可以运行stty -a
来显示哪些字符对终端有特殊含义;看清除/删除 Linux 中 shell/终端上输入错误的隐形密码更多细节。结果是,当您按Ctrl+时\,bash 在其标准输入上看不到字符,它看到一个信号,并且不会通过键绑定机制。
您可以使用命令关闭终端中字符的含义stty quit undef
。如果这样做,bash 会将字符视为输入,并且您的键绑定将生效。
要将Ctrl+设置\为 bash 绑定,但在运行命令时具有其正常的终端绑定,请更改终端设置前并在运行命令后。
preexec () {
stty quit '^\'
}
precmd () {
stty quit undef
}
preexec_invoke_exec () {
[ -n "$COMP_LINE" ] && return # do nothing if completing
[ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # don't cause a preexec for $PROMPT_COMMAND
local this_command=`HISTTIMEFORMAT= history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//"`;
preexec "$this_command"
}
trap 'preexec_invoke_exec' DEBUG
PROMPT_COMMAND='precmd'
不要让键类型fg
和换行符,而是将键绑定到 shell 命令。您不能从 执行此操作.inputrc
,这适用于所有 readline 应用程序,而不仅仅是 bash。相反,在您的 中定义 bash 绑定.bashrc
:
bind -x '"\C-\\": "fg"'