Como corrigir automaticamente erros comuns de limpeza relatados via sintáticos?

13

Comecei a usar o plug- in sintático com o vim para relatar erros de cotão no meu javascriptcódigo.

Também integrei o eslint com o sintático , e ele me mostra bons erros, avisos caso estejam presentes de acordo com as regras escritas no meu arquivo .eslintrc .

Existe alguma maneira de corrigir alguns erros comuns, por exemplo, falta de ponto-e-vírgula, falta de espaço etc. com um toque de tecla?

Editar:

Eu descobri que o eslint tem uma opção

  --fix Automatically fix problems

que pode ser usado para esses casos. Preciso executar este comando para permitir que o eslint corrija esses problemas

eslint --fix -c myconfig file.js

Quero saber como isso pode ser integrado ao vim ?

WitVault
fonte
5
1. Você não precisa desse plug-in para verificação de sintaxe. 2. Erros de correção automática são uma péssima idéia.
romainl
1
Nem todos os erros que eu estou falando sobre erros como space around =, space around if block, recuo etc. Estes são erros relacionados a estilos de código, não erros reais.
WitVault
1
A resposta curta é sim, é claro que você pode. Você precisaria definir uma função customizada para analisar as linhas no quickfix procurando os erros específicos que desejava corrigir e executar um comando com base nesses erros. Você pode facilmente usar o quickfix para levá-lo ao local de cada erro também. Em seguida, você mapeia a função com um pressionamento de tecla. map <C-j> call Function()<CR>Mas essa seria uma função personalizada que você precisaria escrever para atender às suas necessidades. E o argumento de romainl é que, se você fizer algo errado, poderá acabar causando mais mal do que bem. É aconselhável ter cuidado
Tumbler41
1
Use uma impressora bonita para impor formatação consistente.
Lcd047
1
Todos os IDEs suportam algum tipo de formatação automática, não entendo o ódio aqui. Minha empresa usa um gancho de pré-confirmação para eslint --fix, eu prefiro ter isso no nível do editor.
Jerska

Respostas:

11

Conforme mencionado nos comentários, esteja ciente das conseqüências que essa modificação tem no ambiente de trabalho (saiba exatamente quais regras de restrição você usa para "consertar" as coisas).

Para responder à sua pergunta: adicionar a opção à execução do eslint com o sintático é direto . Basta adicionar isso ao seu .vimrc:

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

Mas como o eslint é executado no arquivo depois que o vim grava seu buffer no arquivo, o vim não sabe sobre as correções que o eslint faz. Então, de alguma forma, o vim precisa carregar o arquivo novamente (a maneira manual seria simplesmente digitar :eno modo normal / comando). Para fazer isso, podemos usar a opção autoread junto com o horário da verificação :

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

Para chamar a hora da verificação, podemos usar um autocmd que é executado toda vez que um buffer é gravado em um arquivo. Mas, como o sintático está usando seu próprio autocmd no mesmo evento BufWritePost, temos que adicionar nosso autocmd depois que o sintático adicionar o seu. Eu descobri que esse é o caso quando adicionamos nosso autocmd em VimEnter:

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

Portanto, após adicionar as três partes ao seu .vimrcvim, ele deve se comportar conforme o esperado (fiapos e correção automática ao salvar o arquivo :w).

JepZ
fonte
7

A solução dada na resposta de Jepz não funcionou completamente para mim. eslintfoi chamado corretamente com a --fixopção No entanto, talvez seja por causa de alterações internas, mas parece que ele checktimefoi chamado antes do final de eslint --fix, para que o recarregamento do arquivo não funcionasse corretamente, acionando um file has changed, are you sure you want to write to it?salvamento no próximo.

No entanto, ao investigar problemas, descobri um gancho oculto que parece disparar após a conclusão das verificações do Syntastic, denominada SyntasticCheckHook( origem ).

Com isso, você pode simplesmente ligar checktimedepois que as verificações do Syntastic forem executadas.

Aqui está o meu código final:

set autoread

let g:syntastic_javascript_checkers = ['eslint']

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

Edit: Eu mudei pessoalmente para o ALElinting, que suporta autofixing nativamente.

Jerska
fonte