我习惯了我的编辑在失去焦点时自动保存文件。我最近切换到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
)时,问题仍然存在。
答案 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