9

私は vim を使用していますが、解析エラーのある php ファイルを保存できないようにしたいと考えています。たとえば、これを実現するために「php -l <​​file>」を使用したい場合、.vimrc の autocmd はどのようになりますか?

私は次のようなもので BufWritePre にフックできることを知っています

autocmd FileType php autocmd BufWritePre * !php -l %

しかし、phpコマンドが失敗した場合は「書き込み」を中止したい。

4

2 に答える 2

5

キャッチされなかった例外をフックにスローすると、書き込みが中止されます。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

また注意してください

  1. shellescape::!shell_command %ここではvimが適切なエスケープを行わないため、使用しないでください。ファイル名にスペース、引用符、ドル、改行などの特別な記号が含まれていると、問題が発生します。
  2. <buffer>*2番目のパターンの代わりに。元のコマンドは、phpファイルの自動コマンドを定義していません。代わりに、ファイルタイプの1つがphpの場合、すべてのファイルタイプの自動コマンドを定義します。
  3. autocmdのグループ化とbangeds :autocmd!:自動コマンドの重複を防ぎます。

ちなみに、古いバージョンのファイルでphpを実行して何を達成したいですか(これはBufWrite Preイベントなので、ファイルが書き込まれる前に発生します)。たぶん、phpを実行するコードを:w !php -l:w !php -l -または:w !php -l /dev/stdinphpが受け入れるものに応じて置き換える必要があります(私はシステムにそれを持っていないので、持っていたくありません)。

于 2011-05-20T15:54:36.503 に答える
2

しかし、phpコマンドが失敗した場合は「書き込み」を中止したい。

私の知る限り、これは VIM では不可能です。ドキュメンテーションにもこの機能については記載されていないため、ハックなしでは実行できないと確信しています。問題は、あなたが達成しようとしていることですか?ファイルを保存するときではなく、バージョン管理にコミットする前に、PHP に解析エラーがないことを確認するスクリプトがあります。これは単純な pre-commit フックですが、おそらくうまくいくでしょうか?

ファイルを保存する前に lint を実行することに本当に興味がある場合は、"ZZ" と ":w" を自分で記述したコマンドに書き換えることができます。これにより、ファイル (PHP ファイルの場合) が lint され、エラーなしで保存します。:w を再マップできるかどうかはわかりませんが、解決するよりも多くの問題が発生する可能性があります。

おそらく、より簡単な解決策は、自分で選択したキーストローク (F5 など) でコマンドを作成し、それを希望どおりにすることでしょうか?

于 2011-05-19T09:14:02.690 に答える