2011-05-19 30 views
9

我使用vim,並希望它可以防止我保存有解析錯誤的php文件。如果我想使用例如「php -l <文件>」來實現這一點,那麼.vimrc中的autocmd將如何顯示?是否有可能讓vim阻止保存有解析錯誤的php文件?

我知道我可以掛接到BufWritePre把喜歡的東西

autocmd FileType php autocmd BufWritePre * !php -l % 

,但我希望它中止「寫」如果PHP命令失敗。

+0

你可能會運行,也許,一些shell將會執行'php -l%|| chmod u-w%' – Benoit 2011-05-19 09:18:20

+0

請參閱http://stackoverflow.com/questions/5542969/prevent-file-saving-during-bufwritepre – 2011-05-19 11:19:46

回答

4

您可以在鉤子拋出一個未捕獲的異常,這將中止寫:儘量

function s:RunPHP() 
    execute '!php -l' shellescape(@%, 1) 
    if v:shell_error | throw 'PHP failed' | endif 
endfunction 

function s:DefineBWPphpevent() 
    augroup Run_php 
     autocmd! BufWritePre <buffer> :call s:RunPHP() 
    augroup END 
endfunction 

augroup Run_php 
    autocmd! 
    autocmd FileType * :autocmd! Run_php BufWritePre <buffer> 
    autocmd FileType php :call s:DefineBWPphpevent() 
augroup END 

還要注意

  1. shellescape:你不應該在這裏使用:!shell_command % VIM沒有做適當的轉義如果文件名包含空格,引號,美元,換行符等特殊符號,則會遇到麻煩......
  2. <buffer>代替第二種模式中的*。您的原始命令沒有爲php文件定義自動命令,而是如果其中一個文件類型是php,則會爲所有文件類型定義自動命令。
  3. autocmd分組並且被觸擊:autocmd! s:它們防止重複自動命令。

順便說一句,你想通過舊版本文件的運行PHP實現什麼(它是BufWrite 事件,所以它發生文件被寫入之前)?也許你應該替換代碼,運行PHP :w !php -l,:w !php -l -,甚至:w !php -l /dev/stdin取決於什麼PHP接受(我沒有在我的系統上,並不想有)。

2

但我希望它中止「寫」如果PHP命令失敗。

據我所知,VIM是不可能的。文檔也沒有說明這種能力,所以我敢肯定,這是不能做的,沒有黑客。問題是你想要完成什麼?我有一個腳本,可以確保在我承諾使用版本控制之前,在PHP 中沒有解析錯誤,而不是在保存文件時。這是一個簡單的預先提交鉤子,也許這是可行的?

如果您在保存文件之前真的對linting感興趣,您可以將「ZZ」和「:w」重寫爲您自己編寫的命令,然後輪流刪除文件(如果是PHP文件)並保存在沒有錯誤。我不確定您是否可以重新映射:w,但它可能會導致比解決問題更多的問題。

也許一個更簡單的解決方案是在你自己選擇的按鍵上創建一個命令(例如F5),然後讓它做你想做的事情?

相關問題