Vim:失去焦点时返回命令模式

6

我希望我的vim尽可能经常进入命令模式。我认为失去焦点是一个很好的事件,可以让它发生。我找到的所有内容都是为了在失去焦点时保存。

我希望在macvim中切换选项卡或使用cmd+tab切换到另一个应用程序时,它能自动返回到cmd模式。


在Superuser上有一个重复的问题和答案:http://superuser.com/questions/236534/change-to-normal-mode-when-macvim-goes-background - rubiii
2个回答

17
以下autocommand将是“显而易见”的选择。
au FocusLost,TabLeave * stopinsert

很遗憾,它似乎只对TabLeave正常工作。 FocusLost事件正在触发,但由于某种原因,在Vim重新获得焦点后,stopinsert命令直到接收到按键事件后才实际生效。
相反,您可以利用feedkeys和“无论如何都让我进入正常模式!”key combo
au FocusLost,TabLeave * call feedkeys("\<C-\>\<C-n>")

唯一的缺点是feedkeys()至少需要Vim 7。不过这并不是什么大问题,因为Vim 7已经在2006年发布了。

酷,从未听说过 Ctrl-\_Ctrl-N。我在我的vimrc中有stopinsert行,但总是被返回缓冲区时需要多按一个字符的事实所困扰... :wq - dash-tom-bang
我本想评论,但我的评论需要格式。请看下面。 :) 我必须感谢@jamessan在此方面的指导。 - dash-tom-bang

7

我本想添加一条评论,但是我无法格式化解决方案。

使用 feedkeys 的解决方案很好,只有一个小问题,即它始终返回正常模式,而不管您之前处于何种模式。 我不想取消命令行模式(用于在Windows中拖放文件),也不需要取消可视模式,我只想取消插入模式。

因此,解决方案如下:

autocmd FocusLost * call PopOutOfInsertMode()

function! PopOutOfInsertMode()
    if v:insertmode
        feedkeys("\<C-\>\<C-n>")
    endif
endfunction

换句话说,只有在插入模式下才会弹出。这可以进一步细化,因为在“正常插入”中v:insertmode将是'i',在替换模式中将是'r',在虚拟替换模式中将是'v'。对于我来说,无论何时都弹出都是好的,但用户可能希望进行编辑以适应自己的需要。

如果在MacVim中无法正常工作,请用以下内容替换PopOutOfInsertMode的内容:

if v:insertmode == 'i' | call feedkeys("\<C-\>\<C-n>") | endif

感谢提供额外的信息!我发现原始解决方案也存在同样的问题。在命令模式下切换到其他页面查找信息,然后回来却发现所有内容都被清空了,这真是令人沮丧。 - devth
1
不幸的是,这在MacVim中无法工作。虽然我还没有研究过原因,但这已经列在待办事项清单上了。 :) - dash-tom-bang
我安装了最新的(7.3)MacVim,问题似乎已经解决了。虽然我没有大量使用它,也不确定,但我认为现在它正在工作。 - dash-tom-bang
我使用的是MacVim快照62(据我所知,这是适用于OSX 10.6的最新版本),但它似乎无法工作,原因不明。然而,排名第一的答案可以正常工作。 - mrooney
1
在MacVim上,if v:insertmode == 'i' | call feedkeys("\<C-\>\<C-n>") | endif 对我来说似乎是有效的。 - Delameko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接