Answers:
是否不建议,实际上是不可能的:
Control + [?]键绑定实际上是由tty驱动程序而不是由外壳程序处理的,因为只要在前台运行一个进程,终端的输入和输出将直接转发到该进程。该外壳将永远无法作用于(甚至看不到)您的按键。
您可以从中获取当前分配的Ctrl + [?]组合键的列表stty -a
。但是,只有intr
(SIGINT,通常绑定到Ctrl + C)quit
(SIGQUIT,通常绑定到Ctrl + \)和susp
(SIGSUSP,通常绑定到Ctrl + Z)对应于实际的unix信号。(kill,
例如,不发送SIGKILL,而是删除当前输入。)
不幸的是,无法发送无法被进程禁用的两个信号之一(SIGKILL和SIGSTOP),因此,如果上述三个信号均无效,则必须使用其他方式(例如另一个shell)杀死前台进程。
(实际上,除了捕获所有三个信号之外,前台进程甚至可以首先通过将tty设置为“原始”模式来禁用特殊的按键组合。例如,SSH就是这样做的–它可以中继本地按Ctrl + C到远程主机。)
是的,有些不可取的事情。你直接从跳跃SIGINT
到SIGKILL
信号。我建议像其他人一样,在采用核选择之前,先考虑发送SIGHUP
或SIGTERM
信号。然后,将其作为键绑定是不可取的,这当然意味着它仅在ZLE处于活动状态且shell以交互方式提示您输入时才起作用,而不是在命令运行时起作用。(为此,您将需要配置终端而不是外壳,并且需要具有终端线路规范来实现将SIGTERM
POSIX指定的行为作为扩展发送。)
关于这一点,似乎没有人注意到您正在询问的是shell行编辑器的键盘绑定,而不是终端。要回答问题的第一部分,然后:
您设置了一个shell函数,以将信号发送到“当前”作业。
function terminate-current-job() { kill -s TERM %+ ; }
然后,构造一个ZLE用户定义的小部件,以调用此Shell函数。
zle -N terminate-current-job terminate-current-job
然后,最后,将该小部件绑定到您选择的键上。
bindkey "^/" terminate-current-job