我想要实现的是仅在编辑命令行时将 Ctrl-C 绑定到清除行而不发出换行符( à la ipython),同时在命令运行时保持 Ctrl-C 作为中断信号触发器。我正在使用,即 vi 模式行编辑,但我认为它不相关。bindkey -v
作为旁注,我希望此功能不会造成 Ctrl-C 不会中断正在运行的命令的情况。
我在业余时间研究这个,所以我会对任何线索感兴趣。如果我发现一些足够强大的东西,我会把它作为答案发布。
.zshrc 中命名TRAPINT
的任何函数都会捕获 Ctrl-C 发送的中断信号。在那里,您将需要测试您是否处于插入模式,这可以通过测试${KEYMAP}
变量来实现。如果不是,您应该传递父进程的返回值(有关此提示,请参阅此答案)。这将我们引向以下代码段:
TRAPINT() {
if [[ "${KEYMAP}" = "viins" -o "${KEYMAP}" = "main" ]]; then
zle kill-whole-line
zle reset-prompt
else
return ${128+$1}
fi
}
如果您使用 vi 模式行编辑,这将起作用。它还应该捕获 emacs-mode,其中KEYMAP
应该设置为main
,尽管我没有测试这个特定的用例。zle reset-prompt
有时需要更新显示。