2011-01-09 101 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