キャッチされなかった例外をフックにスローすると、書き込みが中止されます。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/stdin
phpが受け入れるものに応じて置き換える必要があります(私はシステムにそれを持っていないので、持っていたくありません)。