我喜欢我的vim尽可能多地进入命令模式.我认为失去焦点将是一个很好的事件来实现这一目标.我发现的一切都是为了节省失去的焦点.
我希望在macvim中切换选项卡或cmd + tabbing到另一个应用程序时自动返回cmd模式.
jam*_*san 17
以下自动命令将是"明显的"选择.
au FocusLost,TabLeave * stopinsert
Run Code Online (Sandbox Code Playgroud)
不幸的是,它似乎只适用于TabLeave.FocusLost事件正在触发但由于某种原因,一旦Vim重新获得焦点,直到收到键事件后,stopinsert命令才会生效.
相反,你可以利用feedkeys和"让我进入正常模式,无论如何!" 关键组合:
au FocusLost,TabLeave * call feedkeys("\<C-\>\<C-n>")
Run Code Online (Sandbox Code Playgroud)
唯一的缺点是feedkeys()需要至少Vim 7.这应该不是什么大问题,因为Vim 7在2006年发布.
我会添加评论,但我无法格式化解决方案.
feedkeys解决方案非常棒,无论你使用何种其他模式,它总是很小的故障,它总是回到正常模式.我不想取消命令行模式(对于Windows中的拖放文件)而我不这样做需要取消可视模式,我只是想取消插入模式.
然后,解决方案显示为:
autocmd FocusLost * call PopOutOfInsertMode()
function! PopOutOfInsertMode()
if v:insertmode
feedkeys("\<C-\>\<C-n>")
endif
endfunction
Run Code Online (Sandbox Code Playgroud)
换句话说,只有在处于插入模式时才会弹出.这可以进一步细化,因为v:insertmode将在"正常插入"中为"i",在"替换"模式下为"r",在"虚拟替换"模式下为"v".对我来说,无论是好的弹出,但用户可能想要编辑以适应.
如果这在MacVim中不起作用,请将以下内容替换为PopOutOfInsertMode:
if v:insertmode == 'i' | call feedkeys("\<C-\>\<C-n>") | endif
Run Code Online (Sandbox Code Playgroud)