前言
最近通过Xshell连接远程服务器,然后使用Vim修改文件时会莫名其妙的卡死,一开始我还没注意,因为近期的网络一直不太好,经常出现按下一个字母半天才反应过来的情况,所以我没有太在意,直接关闭终端重新打开就好。直到有一天我开着两个终端的时候,Vim又卡着不动了,而另一个终端还以流畅的处理我敲击的命令,我就断定这肯定不是网络原因了。
原因
既然是Vim卡住了那就查查Vim本身有什么BUG吧,结果上网搜了一圈发现原来是远程终端的问题,根本就不关Vim的事,它只是躺着中枪了而已(*^▽^*)
,实际上就是不小心按下了快捷键 Ctrl+S
导致的,为什么常常是Vim卡住呢?那是因为很多人习惯了在 Windows上 的保存快捷键,写写文档总是习惯性按下快捷键 Ctrl+S
保存一下,来避免程序突然崩溃导致文档丢失,这就解释了为什么出问题的总是Vim,因为使用Vim编辑文本有时会习惯性的按下 Ctrl+S
保存,而在执行Shell命令是很小的概率会按 Ctrl+S
,所以大多数人卡住往往是在使用Vim的时候。
可是快捷键 Ctrl+S
为什么会导致终端卡死呢?实际上这个快捷键的含义是“阻断向终端输出内容”,很多人说这个快捷键的作用是暂停终端,我个人感觉这种说法并不准确,实际是上终端并没有暂停,按下 Ctrl+S
快捷键后,你依然可以像终端发送命令,终端也会正常执行,只是不会将反馈内容和结果显示在终端上而已,这个特性可以用来暂停显示快速滚动输出的内容,比如在编译大型项目的时候。
解决办法
解除这种状态的方法很简单,按下快捷键 Ctrl+Q
就可以“恢复向终端输出内容”,只是很多时候我们并不知道,以为是终端卡死了然后错杀了程序!
附注
关于这个问题,Vim文档中“SECTION 32 - VIM ON UNIX”一节也给出了回答,有兴趣的小伙伴可以自己看一下:
32.1. I am running Vim in a xterm. When I press the CTRL-S key,Vim freezes. What should I do now?