Как автоматически исправить распространенные ошибки линтинга, о которых сообщается через syntastic?

13

Я начал использовать синтетический плагин с vim для сообщения об ошибках lint в моем javascriptкоде.

Я также интегрировал eslint с syntastic , и он показывает мне хорошие ошибки, предупреждения, если они присутствуют согласно правилам, написанным в моем файле .eslintrc .

Есть ли способ, которым я могу исправить некоторые распространенные ошибки, например, отсутствие точки с запятой, отсутствие пробела и т. Д. С помощью нажатия клавиши?

Редактировать:

Я обнаружил, что у eslint есть опция

  --fix Automatically fix problems

который может быть использован для таких случаев. Мне нужно запустить эту команду, чтобы позволить eslint исправить эти проблемы

eslint --fix -c myconfig file.js

Я хочу знать, как это можно интегрировать с Vim ?

WitVault
источник
5
1. Вам не нужен этот плагин для проверки синтаксиса. 2. Авто исправление ошибок - очень плохая идея.
Ромен
1
Не все ошибки Я говорю об ошибках, таких как пробел вокруг =, пробел вокруг блока, отступы и т. Д. Это ошибки, связанные со стилями кода, а не фактические ошибки.
WitVault
1
Короткий ответ - да, конечно, вы можете. Вам нужно определить пользовательскую функцию для анализа строк в быстром исправлении, чтобы найти конкретные ошибки, которые вы хотите исправить, и выполнить команду на основе этих ошибок. Вы можете легко использовать быстрое исправление, чтобы перенести вас к месту каждой ошибки. Затем вы сопоставили бы функцию нажатию клавиши. map <C-j> call Function()<CR>Но это будет очень индивидуально подобранная функция, которую вам нужно будет написать в соответствии с вашими потребностями. И точка зрения Роменля в том, что если вы делаете что-то не так, вы легко можете принести больше вреда, чем пользы. Рекомендуется осторожность
Tumbler41
1
Используйте симпатичный принтер для обеспечения согласованного форматирования.
lcd047
1
Все IDE поддерживают какое-то автоматическое форматирование, я не понимаю здесь ненависти. Моя компания использует предварительную фиксацию eslint --fix, я бы предпочел иметь это на уровне редактора.
Йерска

Ответы:

11

Как упомянуто в комментариях, следует помнить о последствиях, которые эта модификация имеет для вашей рабочей среды (точно знать, какие правила eslint вы используете, чтобы «исправить» вещи).

Чтобы ответить на ваш вопрос: добавить опцию к выполнению eslint с помощью синтаксиса просто . Просто добавьте это к себе .vimrc:

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

Но поскольку eslint выполняется в файле после того, как vim записывает в него свой буфер, vim не знает об исправлениях, которые делает eslint. Так что каким-то образом vim должен снова загрузить файл (ручной способ - просто набрать текст :eв обычном / командном режиме). Для этого мы можем использовать опцию autoread вместе с checktime :

" 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 должен вести себя как положено (lint и автозамена при сохранении файла :w).

JepZ
источник
7

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

Однако, копаясь в проблемах, я обнаружил скрытый хук, который, кажется, срабатывает после завершения проверки Syntastic, называется SyntasticCheckHook( source ).

При этом вы можете просто позвонить checktimeпосле проверки Syntastic.

Вот мой окончательный код:

set autoread

let g:syntastic_javascript_checkers = ['eslint']

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

Редактировать: я лично переключился ALEна linting, который поддерживает автофиксирование изначально.

Jerska
источник