¿Cómo corregir automáticamente los errores de linting comunes informados a través de Syntastic?

13

Comencé a usar el complemento fantástico con vim para informar errores de pelusa en mi javascriptcódigo.

También integramos eslint con Syntastic , y me muestra errores agradables, advertencias en caso de que estén presentes según las reglas escritas en mi archivo .eslintrc .

¿Hay alguna forma de corregir algunos errores comunes, por ejemplo, falta de punto y coma, falta de espacio, etc. con una pulsación de tecla?

Editar:

He descubierto que eslint tiene una opción

  --fix Automatically fix problems

que puede usarse para tales casos. Necesito ejecutar este comando para permitir que eslint solucione esos problemas

eslint --fix -c myconfig file.js

¿Quiero saber cómo se puede integrar eso con vim ?

WitVault
fuente
55
1. No necesita ese complemento para la verificación de sintaxis. 2. La corrección automática de errores es una muy mala idea.
romainl
1
No todos los errores a los que me refiero son errores como espacio alrededor =, espacio alrededor si bloque, sangría, etc. Estos son errores relacionados con estilos de código, no errores reales.
WitVault
1
La respuesta corta es sí, por supuesto que puedes. Debería definir una función personalizada para analizar las líneas en la revisión rápida buscando los errores específicos que desea corregir, y ejecutar un comando basado en esos errores. También podría usar fácilmente la solución rápida para llevarlo a la ubicación de cada error. Luego, asignaría la función a una pulsación de tecla. map <C-j> call Function()<CR>Pero esta sería una función personalizada muy personalizada que necesitaría escribir para satisfacer sus necesidades. Y el punto de romainl es que si haces algo mal, puedes terminar fácilmente haciendo más daño que bien. Se recomienda precaución
Tumbler41
1
Use una impresora bonita para imponer un formato consistente.
lcd047
1
Todos los IDE admiten algún tipo de formateo automático, no entiendo el odio aquí. Mi empresa utiliza un enlace previo a la confirmación eslint --fix, prefiero tener esto a nivel de editor.
Jerska 01 de

Respuestas:

11

Como se mencionó en los comentarios, tenga en cuenta las consecuencias que esta modificación tiene para su entorno de trabajo (sepa exactamente qué reglas de seguridad usa para "arreglar" las cosas).

Para responder a su pregunta: agregar la opción a la ejecución de eslint con sintáctico es sencillo . Simplemente agregue esto a su .vimrc:

" execute eslint with --fix flag
let g:syntastic_javascript_eslint_args = ['--fix']

Pero como eslint se ejecuta en el archivo después de que vim escribe su búfer en el archivo, vim no conoce las soluciones que eslint hace. Entonces, de alguna manera, vim tiene que cargar el archivo nuevamente (la forma manual sería simplemente escribir :een modo normal / comando). Para hacer eso, podemos usar la opción de lectura automática junto con checktime :

" enable autoread to reload any files from files when checktime is called and
" the file is changed
set autoread

Para llamar a checktime podemos usar un autocmd que se ejecuta cada vez que se escribe un búfer en un archivo. Pero como Syntactic está utilizando su propio autocmd en el mismo evento BufWritePost, tenemos que agregar nuestro autocmd después de que Syntactic agregue el suyo. Descubrí que este es el caso cuando agregamos nuestro autocmd en VimEnter:

" add an autocmd after vim started to execute checktime for *.js files on write
au VimEnter *.js au BufWritePost *.js checktime

Entonces, después de agregar las tres partes a su .vimrcvim, debe comportarse como se espera (pelusa y autocorrección al guardar el archivo :w).

JepZ
fuente
7

La solución dada en la respuesta de Jepz no funcionó completamente para mí. eslintfue llamado correctamente con la --fixopción Sin embargo, tal vez se deba a que las partes internas han cambiado, pero parece que checktimese llamó antes del final eslint --fix, por lo que la recarga del archivo no funcionó correctamente, lo que provocó un file has changed, are you sure you want to write to it?en el siguiente guardado.

Sin embargo, al investigar los problemas, descubrí un gancho oculto que parece activarse después de que se hayan completado las comprobaciones de Syntastic, llamado SyntasticCheckHook( fuente ).

Con esto, simplemente puede llamar checktimedespués de que se hayan ejecutado las comprobaciones de Syntastic.

Aquí está mi código final:

set autoread

let g:syntastic_javascript_checkers = ['eslint']

" autofix with eslint
let g:syntastic_javascript_eslint_args = ['--fix']
function! SyntasticCheckHook(errors)
  checktime
endfunction

Editar: Personalmente ALEcambié a linting, que admite autofixing de forma nativa.

Jerska
fuente