Sözdizimi ile bildirilen yaygın linting hataları nasıl otomatik olarak düzeltilir?


13

Kodumdaki tiftik hataları bildirmek için vim ile sözdizimi eklentisi kullanmaya başladımjavascript .

Ben de entegre eslint ile syntastic ve ihtiyaç halinde uyarılar onlar benim yazılı kurallara göre mevcut, bana güzel hataları gösterir .eslintrc dosyası.

Bazı noktalı hataları, örneğin noktalı virgül, eksik alan vb.

Düzenle:

Eslint'in bir seçeneği olduğunu gördüm

  --fix Automatically fix problems

Bu gibi durumlar için kullanılabilir. Eslint bu sorunları düzeltmek için bu komutu çalıştırmak gerekiyor

eslint --fix -c myconfig file.js

Bunun vim ile nasıl bütünleştirilebileceğini bilmek istiyorum ?


5
1. Sözdizimi denetimi için bu eklentiye ihtiyacınız yoktur. 2. Otomatik düzeltme hataları çok kötü bir fikirdir.
romainl

1
Etrafta boşluklar = blok, girinti vb. Boşluk gibi hatalardan bahsettiğim tüm hatalar değil. Bunlar kod hatalarıyla ilgili hatalar, gerçek hatalar değil.
WitVault

1
Kısa cevap evet, tabii ki yapabilirsiniz. Düzeltmek istediğiniz belirli hataları arayan hızlı düzeltmedeki satırları ayrıştırmak ve bu hatalara dayalı bir komut yürütmek için özel bir işlev tanımlamanız gerekir. Sizi her hatanın konumuna götürmek için hızlı düzeltmeyi kolayca kullanabilirsiniz. Daha sonra işlevi bir tuşa eşlersiniz. map <C-j> call Function()<CR>Ancak bu, ihtiyaçlarınıza uygun olarak yazmanız gereken çok özel uyarlanmış bir işlev olacaktır. Ve romainl'in amacı, yanlış bir şey yaparsanız kolayca faydadan daha fazla zarar verebilmenizdir. Dikkat önerilir
Tumbler41

1
Tutarlı biçimlendirme uygulamak için güzel bir yazıcı kullanın.
lcd047

1
IDE'lerin hepsi bir tür otomatik formasyonu destekliyor, burada nefreti anlamıyorum. Şirketim ön taahhütlü bir kanca kullanıyor eslint --fix, bunu editör düzeyinde tercih ederim.
Jerska

Yanıtlar:


11

Yorumlarda belirtildiği gibi, bu modifikasyonun çalışma ortamınızdaki sonuçlarının farkında olun (şeyleri "düzeltmek" için hangi eslint kurallarını kullandığınızı tam olarak bilin).

Sorunuzu cevaplamak için: sözdizimsel ile eslint yürütme seçeneği eklemek basittir . Bunu aşağıdakilere eklemeniz yeterlidir .vimrc:

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

Ancak vim arabelleğini dosyaya yazdıktan sonra eslint dosyada yürütüldüğünden, vim eslint'in yaptığı düzeltmeler hakkında bilgi sahibi değildir. Yani bir şekilde vim dosyayı tekrar yüklemek zorunda (manuel yol sadece :enormal / komut modunda yazmak olacaktır). Bunu yapmak için, autoread seçeneğini checktime ile birlikte kullanabiliriz :

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

Kontrol zamanını çağırmak için, bir dosyaya her arabellek yazıldığında yürütülen bir autocmd kullanabiliriz . Ancak sözdizimsel kendi autocmd'sini aynı olayda kullandığından, sözdizimsel kendi BufWritePostekledikten sonra autocmd eklememiz gerekir. Ben autocmd bizim eklemek zaman böyle olduğunu gördüm VimEnter:

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

Bu nedenle, .vimrcvim'inize her üç parçayı da ekledikten sonra beklendiği gibi davranmalıdır (dosya kaydetme sırasında tüy bırakmayan ve otomatik düzeltme :w).


7

Jepz'in cevabında verilen çözüm benim için tamamen işe yaramadı. seçeneği eslintile doğru şekilde çağrıldı --fix. Ancak, belki de içsel değişimler nedeniyle, ama checktimesonuna kadar denir gibi görünüyor eslint --fix, bu yüzden dosya yeniden yükleme düzgün çalışmadı, bir file has changed, are you sure you want to write to it?sonraki kayıtta bir tetikleme .

Ancak, sorunlara girerek, sözdizimsel kontroller tamamlandıktan sonra tetiklenen gibi görünen gizli bir kanca keşfettim SyntasticCheckHook( kaynak ).

Bununla, sadece checktimeSyntastic kontrolleri yapıldıktan sonra arayabilirsiniz .

İşte son kodum:

set autoread

let g:syntastic_javascript_checkers = ['eslint']

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

Düzenleme: Ben şahsen ALEotomatik olarak yerel sabitleme destekleyen linting için geçtim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.