如何仅在 viins 模式下将 Ctrl-C 键绑定到 vi-kill-line?

How can I keybind Ctrl-C to vi-kill-line only when in viins mode?

我想要实现的是绑定Ctrl-C来清除行而不发出换行符(à la ipython) only 编辑命令行时,同时在命令为 运行 时保持 Ctrl-C 作为中断信号触发器。我正在使用 bindkey -v,即 vi 模式行编辑,但我认为它不相关。

附带说明一下,我希望此功能不会造成 Ctrl-C 不会中断 运行 命令的情况。

我正在利用业余时间对此进行深入研究,所以我会对任何线索感兴趣。如果我找到足够强大的东西,我会 post 它确实是一个答案。

.zshrc 中任何名为 TRAPINT 的函数都会捕获 Ctrl-C 发送的中断信号。在那里,您需要测试是否处于插入模式,这可以通过测试 ${KEYMAP} 变量来实现。如果不是,您应该传递父进程的 return 值(有关提示,请参阅 )。这将我们引向以下片段:

TRAPINT() { 
    if [[ "${KEYMAP}" = "viins" -o "${KEYMAP}" = "main" ]]; then
        zle kill-whole-line
        zle reset-prompt
    else
        return ${128+}
    fi
}

如果您使用 vi 模式行编辑,这将起作用。它还应该捕获 emacs 模式,其中 KEYMAP 应该设置为 main,尽管我没有测试这个特定的用例。 zle reset-prompt 有时 需要更新显示。