如果我碰巧在 Vim 中编辑某些内容,我想同时使用 Ctrl+S 和 Cmd+S 来保存文件。
经过一番思考,我想我已经发现^S
终端可能被 shell 捕获,因为该终端向进程发送了信号,或者 Vim 正在做一些特殊的事情来不听它。我有一个 perl 脚本,将术语置于原始模式,它可以很好地读取我的映射(^S
发送十六进制0x13
),但是当我在 VimCtrl+V
逐字模式下输入它时什么也没有发生。在裸 zsh shell 中,逐字模式确实显示我正在按下^S
。这似乎反驳了存在一些终端程序流控制绑定到此键的命题,因为我能够让 zsh 看到它。
我怎样才能让 vim 识别我的 Ctrl+S?
答案1
^S
是 ASCII XOFF 字符。它们与 XON ( ^Q
) 一起,是用于软件流控制。
它们不是被 shell 拦截的,而是被终端拦截的,拦截^S
表示停止终端输出,^Q
拦截表示恢复终端输出。
您可以配置您的终端(使用stty -ixon -ixoff
)通过关闭软件流控制来忽略它们,但这可能是徒劳的:尝试将其他功能分配给 XON 和 XOFF 是不明智的,因为用户会话中可能有其他东西(远程终端、调制解调器、其他 RS-232 设备)来解释它们。
答案2
stty -ixon
(并且stty -ixoff
为了达到更好的效果)对 Terminal.app、iTerm2 也做了同样的操作。