是否有可能让vim阻止保存具有解析错误的php文件?

Chr*_*ter 9 php vim lint save autocmd

我使用vim并希望它阻止我保存有解析错误的php文件.如果我想使用例如"php -l <​​file>"来实现这一点,.vimrc中的autocmd将如何?

我知道我可以用类似的东西挂钩BufWritePre

autocmd FileType php autocmd BufWritePre * !php -l %
Run Code Online (Sandbox Code Playgroud)

但如果php命令失败,我希望它中止"写入".

ZyX*_*ZyX 5

你可以在钩子中抛出一个未捕获的异常,它会中止写入:尝试

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
Run Code Online (Sandbox Code Playgroud)

还要注意

  1. shellescape:你不应该使用,:!shell_command %因为这里 vim 没有做正确的转义,如果文件名包含特殊符号,如空格、引号、美元、换行符等,你会遇到麻烦。
  2. <buffer>代替*第二种模式。您的原始命令没有为 php 文件定义自动命令,而是为所有文件类型定义自动命令,如果其中一种文件类型是 php。
  3. autocmd 分组和 banged :autocmd!s:它们防止重复自动命令。

顺便说一句,你想通过在旧版本的文件上运行 php 来实现什么(它是 BufWrite Pre事件,所以它发生在文件写入之前)?也许你应该取代代码运行PHP和:w !php -l:w !php -l -甚至是:w !php -l /dev/stdin根据什么PHP接受(我没有它我的系统上,不希望有)。