我使用vim,並希望它可以防止我保存有解析錯誤的php文件。如果我想使用例如「php -l <文件>」來實現這一點,那麼.vimrc中的autocmd將如何顯示?是否有可能讓vim阻止保存有解析錯誤的php文件?
我知道我可以掛接到BufWritePre把喜歡的東西
autocmd FileType php autocmd BufWritePre * !php -l %
,但我希望它中止「寫」如果PHP命令失敗。
我使用vim,並希望它可以防止我保存有解析錯誤的php文件。如果我想使用例如「php -l <文件>」來實現這一點,那麼.vimrc中的autocmd將如何顯示?是否有可能讓vim阻止保存有解析錯誤的php文件?
我知道我可以掛接到BufWritePre把喜歡的東西
autocmd FileType php autocmd BufWritePre * !php -l %
,但我希望它中止「寫」如果PHP命令失敗。
您可以在鉤子拋出一個未捕獲的異常,這將中止寫:儘量
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
還要注意
:!shell_command %
VIM沒有做適當的轉義如果文件名包含空格,引號,美元,換行符等特殊符號,則會遇到麻煩......<buffer>
代替第二種模式中的*
。您的原始命令沒有爲php文件定義自動命令,而是如果其中一個文件類型是php,則會爲所有文件類型定義自動命令。:autocmd!
s:它們防止重複自動命令。順便說一句,你想通過舊版本文件的運行PHP實現什麼(它是BufWrite 預事件,所以它發生文件被寫入之前)?也許你應該替換代碼,運行PHP :w !php -l
,:w !php -l -
,甚至:w !php -l /dev/stdin
取決於什麼PHP接受(我沒有在我的系統上,並不想有)。
但我希望它中止「寫」如果PHP命令失敗。
據我所知,VIM是不可能的。文檔也沒有說明這種能力,所以我敢肯定,這是不能做的,沒有黑客。問題是你想要完成什麼?我有一個腳本,可以確保在我承諾使用版本控制之前,在PHP 中沒有解析錯誤,而不是在保存文件時。這是一個簡單的預先提交鉤子,也許這是可行的?
如果您在保存文件之前真的對linting感興趣,您可以將「ZZ」和「:w」重寫爲您自己編寫的命令,然後輪流刪除文件(如果是PHP文件)並保存在沒有錯誤。我不確定您是否可以重新映射:w,但它可能會導致比解決問題更多的問題。
也許一個更簡單的解決方案是在你自己選擇的按鍵上創建一個命令(例如F5),然後讓它做你想做的事情?
你可能會運行,也許,一些shell將會執行'php -l%|| chmod u-w%' – Benoit 2011-05-19 09:18:20
請參閱http://stackoverflow.com/questions/5542969/prevent-file-saving-during-bufwritepre – 2011-05-19 11:19:46