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命令失败,我希望它中止"写入".
你可以在钩子中抛出一个未捕获的异常,它会中止写入:尝试
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)
还要注意
:!shell_command %因为这里 vim 没有做正确的转义,如果文件名包含特殊符号,如空格、引号、美元、换行符等,你会遇到麻烦。<buffer>代替*第二种模式。您的原始命令没有为 php 文件定义自动命令,而是为所有文件类型定义自动命令,如果其中一种文件类型是 php。:autocmd!s:它们防止重复自动命令。顺便说一句,你想通过在旧版本的文件上运行 php 来实现什么(它是 BufWrite Pre事件,所以它发生在文件写入之前)?也许你应该取代代码运行PHP和:w !php -l,:w !php -l -甚至是:w !php -l /dev/stdin根据什么PHP接受(我没有它我的系统上,不希望有)。