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

时间:2010-06-03 18:00:13

标签: vim macvim

我喜欢我的vim尽可能经常进入命令模式。我认为失去焦点将是一个很好的事件来实现这一目标。我发现的一切都是为了节省失去的焦点。

我希望在macvim中切换标签或cmd + tabbing到另一个应用时自动返回cmd模式。

2 个答案:

答案 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