我喜欢我的vim尽可能经常进入命令模式。我认为失去焦点将是一个很好的事件来实现这一目标。我发现的一切都是为了节省失去的焦点。
我希望在macvim中切换标签或cmd + tabbing到另一个应用时自动返回cmd模式。
答案 0 :(得分:17)
以下autocommand将是“显而易见”的选择。
au FocusLost,TabLeave * stopinsert
不幸的是,它似乎只适用于TabLeave。 FocusLost事件正在触发,但由于某种原因,stopinsert命令实际上没有生效,直到Vim重新获得焦点后才收到关键事件。
相反,您可以利用feedkeys和“让我进入正常模式,无论如何!” key combo:
au FocusLost,TabLeave * call feedkeys("\<C-\>\<C-n>")
唯一的缺点是feedkeys()
至少需要Vim 7.这应该不是什么大问题,因为Vim 7在2006年发布了。
答案 1 :(得分: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