如何在失去焦点时使Vim自动保存文件?

时间:2011-01-09 03:44:03

标签: vim

我习惯了我的编辑在失去焦点时自动保存文件。我最近切换到MacVim,我无法重现这种行为。我试过这个:

autocmd BufLeave,FocusLost * wall

但是如果在窗口或MacVim失去焦点时未命名缓冲区,我会收到如下错误:

Error detected while processing BufLeave Auto commands for "*":
E141: No file name for buffer 1

我很困惑,因为:wall的文档说:

Write all changed buffers.  Buffers without a file
name or which are readonly are not written.

所以我希望它能够跳过未命名的缓冲区。有更好的方法吗?

修改

我很确定使用BufLeave做出我想要的更好的方法 - 当我在它们之间切换时保存缓冲区,所以我没有得到“自上次更改后没有写入” - 是设置'autowriteall'。当MacVim将焦点转移到其他应用程序(FocusLost)时,问题仍然存在。

4 个答案:

答案 0 :(得分:39)

你并不关心那些情况下的错误,因为无论如何你都无法合理地对待它们 - 特别是在失去焦点时。所以只是吞下它们:

autocmd BufLeave,FocusLost * silent! wall

比精心设计的舞蹈更简单,找出 出错的地方,以避免它。

答案 1 :(得分:3)

我怀疑当wall的文档说“没有文件名”时,它们可能指的是buftype = nofile的缓冲区。获得你想要的东西的一种方法是让autocmd有bufdo调用一个简单的函数。例如,一些未经测试的代码可以提供这个想法:

autocmd BufLeave,FocusLost * bufdo! call WriteFile()

function WriteFile()
   if (&buftype=="") && (expand("%:r") > "") && (&readonly==0)
      write
   endif
endfunction

我认为获得像这样自动保存缓冲区的标准方法是在Vim中设置autosave选项。

答案 2 :(得分:0)

autocmd BufLeave,FocusLost * bufdo! call WriteFile()

function WriteFile()
   if (&buftype=="") && (expand("%:r") > "") && (&readonly==0)
      write
   endif
endfunction

此方法有副作用,您只能打开一个未命名的缓冲区。如果您打开第二个,它将自动同步到第一个未命名缓冲区的内容。

答案 3 :(得分:0)

将其放入.vimrc

set updatetime=1000
autocmd CursorHoldI * silent w