Come riparare automaticamente gli errori di lanugine comuni segnalati tramite sintetico?


13

Ho iniziato a utilizzare il plug-in sintetico con vim per segnalare errori di lanugine nel mio javascriptcodice.

Ho anche integrato eslint con sintetico , e mi mostra dei bei errori, avvisi nel caso siano presenti secondo le regole scritte nel mio file .eslintrc .

Esiste un modo in cui posso correggere alcuni errori comuni, ad esempio punti e virgola mancanti, spazio mancante, ecc. Con la pressione di un tasto?

Modificare:

Ho scoperto che eslint ha un'opzione

  --fix Automatically fix problems

che può essere utilizzato per tali casi. Devo eseguire questo comando per consentire a eslint di risolvere questi problemi

eslint --fix -c myconfig file.js

Voglio sapere come può essere integrato con vim ?


5
1. Non è necessario quel plug-in per il controllo della sintassi. 2. Gli errori di correzione automatica sono una pessima idea.
Romainl,

1
Non tutti gli errori di cui sto parlando sono errori come spazio intorno a =, spazio intorno a se blocco, rientro ecc. Questi sono errori relativi agli stili di codice, non errori reali.
WitVault,

1
La risposta breve è sì, certo che puoi. Dovresti definire una funzione personalizzata per analizzare le righe nella correzione rapida cercando gli errori specifici che volevi correggere ed eseguire un comando basato su quegli errori. Puoi facilmente usare la correzione rapida per portarti anche nella posizione di ogni errore. Dovresti quindi mappare la funzione su una sequenza di tasti. map <C-j> call Function()<CR>Ma questa sarebbe una funzione su misura molto personalizzata che dovresti scrivere per soddisfare le tue esigenze. E il punto di vista di Romainl è che se fai qualcosa di sbagliato puoi facilmente finire per fare più male che bene. Si consiglia cautela
Tumbler41,

1
Usa una stampante carina per imporre una formattazione coerente.
lcd047,

1
Tutti gli IDE supportano una sorta di formattazione automatica, non capisco l'odio qui. La mia azienda usa un hook pre-commit eslint --fix, preferirei avere questo a livello di editor.
Jerska,

Risposte:


11

Come menzionato nei commenti, sii consapevole delle conseguenze che questa modifica ha sul tuo ambiente di lavoro (conosci esattamente quali regole eslint usi per "riparare" le cose).

Per rispondere alla tua domanda: aggiungere l'opzione all'esecuzione di eslint con sintattica è semplice . Aggiungilo semplicemente al tuo .vimrc:

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

Ma poiché eslint viene eseguito sul file dopo che vim scrive il suo buffer nel file, vim non è a conoscenza delle correzioni che eslint fa. Quindi in qualche modo vim deve caricare di nuovo il file (il modo manuale sarebbe semplicemente digitare :ein modalità normale / comando). Per fare ciò, possiamo usare l' opzione di autoread insieme al checktime :

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

Per chiamare il checktime possiamo usare un autocmd che viene eseguito ogni volta che un buffer viene scritto in un file. Ma poiché sintattica sta usando la propria autocmd nello stesso evento, BufWritePostdobbiamo aggiungere la nostra autocmd dopo che la sintattica ne aggiunge la propria. Ho scoperto che questo è il caso quando aggiungiamo il nostro autocmd su VimEnter:

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

Quindi dopo aver aggiunto tutte e tre le parti al tuo .vimrcvim dovrebbe comportarti come previsto (lint e correzione automatica al salvataggio del file :w).


7

La soluzione fornita nella risposta di Jepz non ha funzionato completamente per me. eslintè stato chiamato correttamente con l' --fixopzione. Tuttavia, forse è a causa degli interni che sono cambiati, ma sembra che sia checktimestato chiamato prima della fine di eslint --fix, quindi il ricaricamento dei file non ha funzionato correttamente, innescando un file has changed, are you sure you want to write to it?al prossimo salvataggio.

Tuttavia, scavando nei problemi, ho scoperto un hook nascosto che sembra attivarsi dopo che i controlli Syntastic sono stati completati, chiamato SyntasticCheckHook( source ).

Con questo, puoi semplicemente chiamare checktimedopo aver eseguito i controlli Syntastic.

Ecco il mio codice finale:

set autoread

let g:syntastic_javascript_checkers = ['eslint']

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

Modifica: sono passato personalmente a ALEper i pelucchi, che supporta la correzione automatica in modo nativo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.