キャッチされなかった例外をフックにスローすると、書き込みが中止されます。try
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
また注意してください
- shellescape:
:!shell_command %ここではvimが適切なエスケープを行わないため、使用しないでください。ファイル名にスペース、引用符、ドル、改行などの特別な記号が含まれていると、問題が発生します。
<buffer>*2番目のパターンの代わりに。元のコマンドは、phpファイルの自動コマンドを定義していません。代わりに、ファイルタイプの1つがphpの場合、すべてのファイルタイプの自動コマンドを定義します。
- autocmdのグループ化とbangeds
:autocmd!:自動コマンドの重複を防ぎます。
ちなみに、古いバージョンのファイルでphpを実行して何を達成したいですか(これはBufWrite Preイベントなので、ファイルが書き込まれる前に発生します)。たぶん、phpを実行するコードを:w !php -l、:w !php -l -または:w !php -l /dev/stdinphpが受け入れるものに応じて置き換える必要があります(私はシステムにそれを持っていないので、持っていたくありません)。