Wie behebe ich häufig auftretende Fusselfehler, die über die Syntastik gemeldet wurden, automatisch?

13

Ich habe begonnen, syntastische Plugins mit vim zu verwenden, um Fehler in meinem javascriptCode zu melden .

I integriert auch eslint mit syntastic , und es zeigt mir schön Fehler, Warnungen , falls sie gemäß Regeln in meiner schriftlichen vorhanden sind .eslintrc Datei.

Kann ich einige häufig auftretende Fehler, z. B. fehlendes Semikolon, fehlendes Leerzeichen usw., auf irgendeine Weise mit einem Tastendruck beheben?

Bearbeiten:

Ich habe festgestellt, dass eslint eine Option hat

  --fix Automatically fix problems

die für solche Fälle verwendet werden können. Ich muss diesen Befehl ausführen, damit eslint diese Probleme behebt

eslint --fix -c myconfig file.js

Ich möchte wissen, wie das mit vim integriert werden kann ?

WitVault
quelle
5
1. Sie benötigen dieses Plugin nicht für die Syntaxprüfung. 2. Automatische Fehlerbehebung ist eine sehr schlechte Idee.
Romainl
1
Nicht alle Fehler Ich spreche von Fehlern wie Leerzeichen um =, Leerzeichen um, wenn Block, Einrückung usw. Dies sind Fehler, die sich auf Codestile beziehen, nicht auf tatsächliche Fehler.
WitVault
1
Die kurze Antwort lautet: Ja, das können Sie natürlich. Sie müssten eine benutzerdefinierte Funktion definieren, um die Zeilen im Quickfix zu analysieren und nach den spezifischen Fehlern zu suchen, die Sie beheben möchten, und einen auf diesen Fehlern basierenden Befehl ausführen. Mit dem Quickfix können Sie problemlos auch die Position der einzelnen Fehler ermitteln. Sie ordnen die Funktion dann einem Tastendruck zu. map <C-j> call Function()<CR>Dies wäre jedoch eine sehr maßgeschneiderte Funktion, die Sie schreiben müssten, um Ihren Anforderungen zu entsprechen. Und Romainl meint, wenn man etwas falsch macht, kann das leicht mehr schaden als nützen. Vorsicht ist geboten
Tumbler41
1
Verwenden Sie einen hübschen Drucker, um eine konsistente Formatierung zu erzwingen.
lcd047
1
IDEs unterstützen alle eine Art automatisches Formatieren, ich verstehe den Hass hier nicht. Mein Unternehmen verwendet einen Pre-Commit-Hook für eslint --fix. Ich möchte diesen vielmehr auf Editorebene haben.
Jerska

Antworten:

11

Beachten Sie, wie in den Kommentaren erwähnt, die Konsequenzen, die diese Änderung für Ihre Arbeitsumgebung hat (wissen Sie genau, welche Eslint-Regeln Sie verwenden, um Dinge zu "reparieren").

Um Ihre Frage zu beantworten: Das Hinzufügen der Option zur ESLINT-Ausführung mit Syntax ist einfach . Fügen Sie dies einfach zu Ihrem hinzu .vimrc:

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

Da eslint für die Datei ausgeführt wird, nachdem vim seinen Puffer in die Datei geschrieben hat, weiß vim nichts über die von eslint vorgenommenen Korrekturen. Also muss vim die Datei irgendwie neu laden (der manuelle Weg wäre, einfach :eim normalen / Befehlsmodus zu tippen ). Um das zu tun, können wir die Verwendung Autoread - Option zusammen mit checktime :

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

Um checktime aufzurufen, können wir ein autocmd verwenden, das jedes Mal ausgeführt wird, wenn ein Puffer in eine Datei geschrieben wird. Da syntactic jedoch für dasselbe Ereignis eine eigene autocmd verwendet, müssen BufWritePostwir unsere autocmd hinzufügen, nachdem syntactic eine eigene hinzufügt. Ich habe festgestellt, dass dies der Fall ist, als wir unser AutocMD hinzufügen VimEnter:

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

Nach dem Hinzufügen aller drei Teile .vimrcsollte sich Ihr Vim wie erwartet verhalten (fusseln und beim Speichern der Datei automatisch korrigieren :w).

JepZ
quelle
7

Die Lösung in Jepz 'Antwort hat bei mir nicht ganz funktioniert. eslintwurde mit der --fixOption korrekt aufgerufen . Vielleicht liegt es jedoch an Interna, die sich geändert haben, aber anscheinend checktimewurde es vor dem Ende von aufgerufen eslint --fix, sodass das Neuladen der Datei nicht richtig funktionierte und file has changed, are you sure you want to write to it?beim nächsten Speichern einen Fehler auslöste .

Indem ich mich jedoch mit Problemen befasste, entdeckte ich einen versteckten Hook namens SyntasticCheckHook( source ), der nach Abschluss der Syntastic-Prüfungen ausgelöst zu werden scheint .

Mit diesem können Sie einfach aufrufen, checktimenachdem die Syntastic Checks ausgeführt wurden.

Hier ist mein endgültiger Code:

set autoread

let g:syntastic_javascript_checkers = ['eslint']

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

Edit: Ich persönlich habe zum ALEFlusen gewechselt , was das Autofixing von Haus aus unterstützt.

Jerska
quelle