2011-05-19 9 views
9

Uso vim y me gustaría evitar que guarde archivos php que tengan errores de análisis. Si quisiera utilizar, por ejemplo, "php -l <archivo>" para lograr esto, ¿cómo sería el autocmd en .vimrc?¿Es posible evitar que se guarde un archivo php que tenga un error de análisis?

Sé que puedo enganchar en BufWritePre con algo como

autocmd FileType php autocmd BufWritePre * !php -l % 

pero lo quiero para abortar la "escritura" si falla el comando php.

+0

Puede ejecutar, tal vez, algunos shell schript que harán 'php -l% || chmod u-w% ' – Benoit

+0

Ver http://stackoverflow.com/questions/5542969/prevent-file-saving-during-bufwritepre –

Respuesta

4

Usted puede lanzar una excepción no capturada en el gancho y se abortará escritura: tratar

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 

También tenga en cuenta

  1. shellescape: no se debe utilizar :!shell_command % como en este caso vim no hace escape adecuada y se encontrará con problemas si el nombre del archivo contiene símbolos especiales como espacios, comillas, dólar, nuevas líneas, ...
  2. <buffer> en lugar de * en segundo patrón. Su comando original no define autocomando para archivos php, sino que define autocommand para todos los tipos de archivos si uno de los tipos de archivos es php.
  3. agrupar autocmd y golpear :autocmd! s: impiden la duplicación de autocomandos.

Por cierto, ¿qué es lo que quiere lograr mediante la ejecución de php en versión antigua del archivo (es BufWrite Pre evento, por lo que sucede antes de archivo se escribe)? Tal vez deberías reemplazar el código que ejecuta php con :w !php -l, :w !php -l - o incluso :w !php -l /dev/stdin dependiendo de lo que php acepte (no lo tengo en mi sistema y no quiero tener).

2

pero quiero que anule la "escritura" si falla el comando php.

Por lo que yo sé, esto no es posible con VIM. La documentación tampoco establece esta capacidad, así que estoy bastante seguro de que no se puede hacer sin un truco. La pregunta es, sin embargo, ¿qué estás tratando de lograr? Tengo un script que se asegura de que no tengo errores de análisis en PHP antes de comprometerme con el control de versión, en lugar de guardar el archivo. Ese es un simple gancho precompromiso, ¿quizás ese algo funcionará?

Si realmente está interesado en linting antes de guardar el archivo, puede volver a escribir "ZZ" y ​​": w" en un comando que usted mismo haya escrito, que a su vez lo lame (en el caso de Archivo PHP) y guarda cuando no haya errores. No estoy seguro de si puede reasignar el: w, y podría causar más problemas de los que resuelve.

Quizás una solución más simple sería crear un comando en una pulsación de tecla que usted mismo (por ejemplo, F5), y hacer que haga lo que quiera?

Cuestiones relacionadas