2011-04-04 97 views
2

我有一個函數可以對當前文件執行有效性檢查(以符合我的僱主的編碼標準)。我想在保存之前調用這個函數,即使用BufWritePre。但是,如果我的檢查功能失敗,我會防止保存文件。在BufWritePre期間防止文件保存

那麼,是否有可能突破BufWritePre自動命令?

我意識到我可以通過重新映射:write命令來完成此操作,如圖所示here,但是我想盡可能避免這種情況,因爲它感覺有點不太巧妙。

在此先感謝您的建議。

+0

又見問題「[防止保存文件與Vim中的某些名稱](http://stackoverflow.com/q/6210946/254635)「。 – 2012-07-29 04:11:24

回答

4

你可以「簡單」強制錯誤:

:autocmd BufWritePre *.txt throw "you may not" 

如果您希望能夠保存.txt文件再次

:autocmd! 
:source $MYVIMRC 
+0

這比我炮製的要簡單得多。我猜測使用':w!'會強制通過這個錯誤? – intuited 2011-04-04 20:12:56

+0

不,不管怎麼寫'w!' – sehe 2011-04-04 20:33:18

+0

謝謝!這看起來很有希望。但是,「檢測到錯誤」消息看起來相當醜陋......錯誤是否可以被處理,以便迴應一個有意義的消息,但是仍然保留該功能而不保存?我在try/catch/endtry方面經驗不足,不知道這是否可行。 – 2011-04-04 20:52:03

1

:help BufWriteCmd

      *BufWriteCmd* 
BufWriteCmd   Before writing the whole buffer to a file. 
       Should do the writing of the file and reset 
       'modified' if successful, unless '+' is in 
       'cpo' and writing to another file |cpo-+|. 
       The buffer contents should not be changed. 
       |Cmd-event| 

所以,它聽起來就像你可以實現自動命令,只有做了保存,如果保存被允許重新'modified'

我猜你必須使用類似writefile(getline('^', '$'))這樣的東西才能真正寫作。

在另一方面,你也許可以做到像

  • 禁用BufWriteCmd再次自動命令
  • :write文件。我不確定它是否會讓你在BufWriteCmd處理程序中執行此操作。
  • 重新啓用您的BufWriteCmd自動命令。您應該將其放在:finally子句中,以確保它即使在寫入出現問題時也能執行。