2011-01-09 95 views
30

当我失去焦点时,我习惯了编辑自动保存文件。我最近切换到MacVim,我无法重新创建这种行为。我尝试这样做:如何让Vim在失去焦点时自动保存文件?

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),问题仍然存在。

+0

只是问候扔了这一点,那里在VIM自动保存:未交换文件还不够吗? – skippr 2012-03-27 20:51:38

+2

我不是想要支持我的工作;我需要将该文件放在磁盘上,以便查看我所关注的任何工具,例如测试套件。 – Peeja 2012-03-28 13:10:42

回答

38

你不会在意这些情况下的错误,因为无论如何你没有办法对它们进行合理的处理 - 特别是当失去焦点时。所以,刚咽下他们:

autocmd BufLeave,FocusLost * silent! wall 

是个精心设计的舞蹈更易于弄清楚,以免它那里是一个错误。

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选项的标准方式。

+0

`bufdo`将在当前窗口中切换缓冲区。你应该写`let s:curbuf = bufnr('%')|尝试|执行'bufdo!调用WriteFile()'|终于|执行“buffer”.s:curbuf | endtry`。它仍然有问题:由于某些原因,此代码在帮助缓冲区中的“list”选项被重置并且光标位于中心。 `endtry`后面的`try`和`wincmd q`之前加`wincmd v`。 – ZyX 2011-01-09 10:07:35

+0

Plain`wincmd v |执行'bufdo!调用WriteFile()'| wincmd q`可能是最好的选择。 – ZyX 2011-01-09 10:09:20

+0

@ZyX - 感谢您的纠正;当我建议bufdo时,我并没有想到。听起来像你的第二个解决方案可以很好地工作,打开新窗口,循环浏览缓冲区,然后关闭窗口。我仍然认为只要使用`autosave`就是最好的解决方案,或者可能编写一个更复杂的函数,以便在`tabdo`中使用`windo`命令的autocmd调用,这样就不需要在窗口中进行缓冲区切换。 – 2011-01-09 17:16:56

0
autocmd BufLeave,FocusLost * bufdo! call WriteFile() 

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

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

0

只是把这个在.vimrc里

set updatetime=1000 
autocmd CursorHoldI * silent w