Jak automatycznie naprawić najczęściej występujące błędy podszywania zgłaszane przez syntastic?

13

Zacząłem używać syntastic wtyczki z vim do błędów szarpie raport w moim javascriptkodzie.

Zintegrowałem również eslint z syntastic , i pokazuje mi ładne błędy, ostrzeżenia na wypadek, gdyby były obecne zgodnie z regułami zapisanymi w moim pliku .eslintrc .

Czy jest jakiś sposób, w jaki mogę naprawić niektóre typowe błędy, np. Brak średnika, brak miejsca itp. Za pomocą naciśnięcia klawisza?

Edytować:

Odkryłem, że eslint ma opcję

  --fix Automatically fix problems

które mogą być wykorzystane w takich przypadkach. Muszę uruchomić to polecenie, aby eslint mógł rozwiązać te problemy

eslint --fix -c myconfig file.js

Chcę wiedzieć, jak można to zintegrować z vimem ?

WitVault
źródło
5
1. Nie potrzebujesz tej wtyczki do sprawdzania składni. 2. Błędy automatycznego naprawiania to bardzo zły pomysł.
romainl
1
Nie wszystkie błędy Mówię o błędach takich jak spacja dookoła, spacja dookoła bloku, wcięcie itp. Są to błędy związane ze stylami kodu, a nie rzeczywiste błędy.
WitVault,
1
Krótka odpowiedź brzmi: tak, oczywiście, że możesz. Musisz zdefiniować niestandardową funkcję, aby przeanalizować wiersze w szybkiej poprawce w poszukiwaniu konkretnych błędów, które chcesz naprawić, i wykonać polecenie na podstawie tych błędów. Można łatwo użyć tej poprawki, aby zabrać Cię również do miejsca każdego błędu. Następnie przypisałeś funkcję do naciśnięcia klawisza. map <C-j> call Function()<CR>Ale byłaby to bardzo niestandardowa funkcja, którą musisz napisać, aby dopasować ją do swoich potrzeb. Romainl ma na myśli to, że jeśli zrobisz coś złego, możesz łatwo wyrządzić więcej szkody niż pożytku. Zaleca się ostrożność
Tumbler41
1
Użyj ładnej drukarki, aby wymusić spójne formatowanie.
lcd047
1
Wszystkie IDE obsługują pewnego rodzaju automatyczne formowanie, nie rozumiem tutaj nienawiści. Moja firma używa haczyka przed zatwierdzeniem eslint --fix, wolałbym mieć to na poziomie edytora.
Jerska

Odpowiedzi:

11

Jak wspomniano w komentarzach, należy pamiętać o konsekwencjach, jakie ta modyfikacja ma dla środowiska pracy (dokładnie wiedzieć, jakich zasad eslint używa się do „naprawy” rzeczy).

Aby odpowiedzieć na twoje pytanie: dodanie opcji do wykonania eslint za pomocą syntactic jest proste . Po prostu dodaj to do .vimrc:

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

Ale ponieważ eslint jest wykonywany na pliku po tym, jak vim zapisze w nim swój bufor, vim nie wie o poprawkach, które robi eslint. Więc w jakiś sposób vim musi ponownie załadować plik (ręcznym sposobem byłoby po prostu wpisanie :ew trybie normalnym / poleceń). Aby to zrobić, możemy użyć opcji autoreadowania razem z Checktime :

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

Zadzwonić checktime możemy użyć autocmd który zostanie wykonany za każdym razem, gdy bufor jest zapisywane w pliku. Ale ponieważ syntactic używa własnego autocmd na tym samym zdarzeniu, BufWritePostmusimy dodać nasz autocmd po tym, jak syntactic doda własne. Odkryłem, że dzieje się tak, gdy dodajemy nasz autocmd do VimEnter:

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

Tak więc po dodaniu wszystkich trzech części do twojego .vimrcvima powinno zachowywać się zgodnie z oczekiwaniami (kłaczki i autokorekta przy zapisywaniu pliku :w).

JepZ
źródło
7

Rozwiązanie podane w odpowiedzi Jepza nie działało dla mnie całkowicie. eslintzostał poprawnie wywołany z --fixopcją. Być może jest to spowodowane zmianami wewnętrznymi, ale wygląda na to, że checktimezostał wywołany przed końcem eslint --fix, więc przeładowanie pliku nie działało poprawnie, powodując uruchomienie file has changed, are you sure you want to write to it?następnego zapisu.

Jednak zagłębiając się w problemy, odkryłem ukryty hak, który wydaje się uruchamiać po zakończeniu kontroli syntastycznych, o nazwie SyntasticCheckHook( źródło ).

Dzięki temu możesz po prostu zadzwonić checktimepo uruchomieniu kontroli Syntastic.

Oto mój końcowy kod:

set autoread

let g:syntastic_javascript_checkers = ['eslint']

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

Edycja: Osobiście przełączyłem się ALEna zbieranie włókien, które natywnie obsługują autofiksowanie.

Jerska
źródło