Як автоматично виправити поширені помилки зв’язування, повідомлені за допомогою синтастичних?


13

Я почав використовувати синтастичний плагін з vim для повідомлення про помилки в моєму javascriptкоді.

Я також інтегрував eslint з синтастичним , і він показує мені приємні помилки, попередження у випадку, якщо вони присутні відповідно до правил, написаних у моєму файлі .eslintrc .

Чи є спосіб, за допомогою якого я можу виправити деякі поширені помилки, наприклад, відсутність крапки з двокрапкою, пропущений пробіл тощо тощо?

Редагувати:

Я виявив, що у eslint є варіант

  --fix Automatically fix problems

які можуть бути використані для таких випадків. Мені потрібно запустити цю команду, щоб дозволити eslint виправити ці проблеми

eslint --fix -c myconfig file.js

Я хочу знати, як це можна інтегрувати з vim ?


5
1. Цей плагін вам не потрібен для перевірки синтаксису. 2. Автоматичне виправлення помилок - дуже погана ідея.
romainl

1
Не всі помилки Я говорю про такі помилки, як простір навколо =, пробіл, якщо блок, відступ тощо. Це помилки, пов'язані зі стилями коду, а не фактичні помилки.
WitVault

1
Коротка відповідь - так, звичайно, можна. Вам потрібно буде визначити спеціальну функцію для розбору рядків у швидкому виправлення, шукаючи конкретні помилки, які ви хотіли виправити, та виконати команду на основі цих помилок. Ви можете легко скористатися цим виправленням, щоб перевезти вас також до кожної помилки. Потім ви будете відображати функцію на натискання клавіші. map <C-j> call Function()<CR>Але це була б дуже спеціальна спеціалізована функція, яку потрібно писати відповідно до ваших потреб. І річ Романля полягає в тому, що якщо ти зробиш щось не так, ти можеш легко зробити більше шкоди, ніж користі. Рекомендується обережність
Tumbler41

1
Використовуйте гарний принтер для забезпечення послідовного форматування.
lcd047

1
Всі IDE підтримують якесь автоматичне форматування, я не розумію тут ненависті. Моя компанія використовує гачок eslint --fix, який попередньо здійснює , я б швидше вважав це на рівні редактора.
Жерська

Відповіді:


11

Як зазначалося в коментарях, будьте в курсі наслідків, які ця модифікація спричиняє для вас робоче середовище (точно знайте, які правила еслінт ви використовуєте для "виправлення" речей).

Щоб відповісти на ваше запитання: додавання параметра до виконання eslint синтаксичним є прямо вперед . Просто додайте це до свого .vimrc:

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

Але оскільки eslint виконується у файлі після того, як vim пише свій буфер у файл, vim не знає про виправлення, які виконує eslint. Тож як-небудь vim доводиться знову завантажувати файл (ручним способом було б просто набрати :eв звичайному / командному режимі). Для цього ми можемо використовувати параметр autooread разом із контрольним часом :

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

Для виклику контрольного часу ми можемо використовувати autocmd, який виконується кожного разу, коли буфер записується у файл. Але оскільки синтаксика використовує власний autocmd для тієї самої події, BufWritePostми повинні додати своє autocmd після того, як синтаксичний додає свій власний. Я виявив, що це так, коли ми додаємо наш autocmd VimEnter:

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

Тож після додавання всіх трьох частин до програми .vimrcvim слід поводитись як очікувалося (вказівка ​​та автокорекція при збереженні файлу :w).


7

Рішення, дане у відповіді Джепца, не повністю спрацювало для мене. eslintбуло правильно викликано за допомогою --fixопції. Однак, можливо, це змінило внутрішні системи, але, схоже, checktimeбуло викликано до кінця eslint --fix, тому перезавантаження файлів не працювало належним чином, викликаючи file has changed, are you sure you want to write to it?наступне збереження.

Однак, розбираючись у проблемах, я виявив прихований гачок, який, здається, спрацьовує після завершення синтастичних перевірок, званий SyntasticCheckHook( джерело ).

З цим ви можете просто зателефонувати checktimeпісля запуску синтастичних перевірок.

Ось мій остаточний код:

set autoread

let g:syntastic_javascript_checkers = ['eslint']

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

Редагувати: я особисто перейшов на ALEвкладиш, яке підтримує автоматичне виправлення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.