Comment réparer automatiquement les erreurs de peluchage courantes signalées via la syntaxe?

13

J'ai commencé à utiliser un plugin syntaxique avec vim pour signaler les erreurs de charpie dans mon javascriptcode.

J'ai également intégré eslint à la syntaxe , et cela me montre de belles erreurs, des avertissements au cas où ils seraient présents selon les règles écrites dans mon fichier .eslintrc .

Existe-t-il un moyen de corriger certaines erreurs courantes, par exemple un point-virgule manquant, un espace manquant, etc. avec un coup de clé?

Éditer:

J'ai trouvé qu'eslint a une option

  --fix Automatically fix problems

qui peut être utilisé pour de tels cas. Je dois exécuter cette commande pour laisser eslint résoudre ces problèmes

eslint --fix -c myconfig file.js

Je veux savoir comment cela peut être intégré à vim ?

WitVault
la source
5
1. Vous n'avez pas besoin de ce plugin pour vérifier la syntaxe. 2. La correction automatique des erreurs est une très mauvaise idée.
romainl
1
Pas toutes les erreurs Je parle d'erreurs telles que l'espace autour de =, l'espace autour de si le bloc, l'indentation, etc. Ce sont des erreurs liées aux styles de code, pas des erreurs réelles.
WitVault
1
La réponse courte est oui, bien sûr que vous le pouvez. Vous devez définir une fonction personnalisée pour analyser les lignes du quickfix à la recherche des erreurs spécifiques que vous souhaitez corriger et exécuter une commande en fonction de ces erreurs. Vous pouvez facilement utiliser le quickfix pour vous emmener également à l'emplacement de chaque erreur. Vous devez ensuite mapper la fonction sur une frappe. map <C-j> call Function()<CR>Mais ce serait une fonction personnalisée très personnalisée que vous auriez besoin d'écrire pour répondre à vos besoins. Et le point de Romainl est que si vous faites quelque chose de mal, vous pouvez facilement finir par faire plus de mal que de bien. La prudence est recommandée
Tumbler41
1
Utilisez une jolie imprimante pour appliquer un formatage cohérent.
lcd047
1
Les IDE supportent tous une sorte de formatage automatique, je ne comprends pas la haine ici. Mon entreprise utilise un hook de pré-validation eslint --fix, je préfère de beaucoup avoir cela au niveau de l'éditeur.
Jerska

Réponses:

11

Comme mentionné dans les commentaires, soyez conscient des conséquences de cette modification sur votre environnement de travail (sachez exactement quelles règles eslint vous utilisez pour "réparer" les choses).

Pour répondre à votre question: l'ajout de l'option à l'exécution eslint avec syntaxique est simple . Ajoutez simplement ceci à votre .vimrc:

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

Mais comme eslint est exécuté sur le fichier après que vim ait écrit son tampon dans le fichier, vim ne connaît pas les correctifs qu'eslint fait. Donc, en quelque sorte, vim doit charger à nouveau le fichier (la manière manuelle serait de simplement taper :een mode normal / commande). Pour ce faire, nous pouvons utiliser la autoread option conjointement avec checktime :

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

Pour appeler checktime, nous pouvons utiliser un autocmd qui est exécuté à chaque fois qu'un tampon est écrit dans un fichier. Mais comme la syntaxe utilise son propre autocmd sur le même événement, BufWritePostnous devons ajouter notre autocmd après que la syntaxe ait ajouté le sien. J'ai trouvé que c'est le cas lorsque nous ajoutons notre autocmd sur VimEnter:

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

Donc, après avoir ajouté les trois parties à votre .vimrcvim, vous devez vous comporter comme prévu (peluches et correction automatique lors de l'enregistrement du fichier :w).

JepZ
la source
7

La solution donnée dans la réponse de Jepz n'a pas complètement fonctionné pour moi. eslinta été correctement appelé avec l' --fixoption. Cependant, c'est peut-être à cause des internes qui ont changé, mais il semble avoir checktimeété appelé avant la fin de eslint --fix, donc le rechargement du fichier n'a pas fonctionné correctement, déclenchant un file has changed, are you sure you want to write to it?lors de la prochaine sauvegarde.

Cependant, en creusant dans les problèmes, j'ai découvert un hook caché qui semble se déclencher après la fin des vérifications Syntastic, appelé SyntasticCheckHook( source ).

Avec cela, vous pouvez simplement appeler checktimeaprès l'exécution des vérifications Syntastic.

Voici mon code final:

set autoread

let g:syntastic_javascript_checkers = ['eslint']

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

Edit: j'ai personnellement opté ALEpour le linting, qui prend en charge la correction automatique en natif.

Jerska
la source