Làm thế nào để tự động sửa các lỗi linting phổ biến được báo cáo qua cú pháp?


13

Tôi bắt đầu sử dụng plugin cú pháp với vim để báo cáo lỗi lint trong javascriptmã của mình .

Tôi cũng đã tích hợp eslint với cú pháp và nó cho tôi thấy các lỗi hay, cảnh báo trong trường hợp chúng có mặt theo các quy tắc được ghi trong tệp .eslintrc của tôi .

Có cách nào để tôi có thể sửa một số lỗi phổ biến không, ví dụ như thiếu dấu hai chấm, thiếu không gian, v.v.

Biên tập:

Tôi đã thấy rằng eslint có một tùy chọn

  --fix Automatically fix problems

có thể được sử dụng cho các trường hợp như vậy. Tôi cần chạy lệnh này để eslint khắc phục những sự cố đó

eslint --fix -c myconfig file.js

Tôi muốn biết làm thế nào có thể được tích hợp với vim ?


5
1. Bạn không cần plugin đó để kiểm tra cú pháp. 2. Tự động sửa lỗi là một ý tưởng rất xấu.
romainl

1
Không phải tất cả các lỗi tôi đang nói về các lỗi như khoảng trắng xung quanh =, khoảng trống xung quanh nếu khối, thụt lề, v.v ... Đây là các lỗi liên quan đến kiểu mã, không phải lỗi thực tế.
WitVault

1
Câu trả lời ngắn gọn là có, tất nhiên bạn có thể. Bạn cần xác định một hàm tùy chỉnh để phân tích các dòng trong quickfix tìm kiếm các lỗi cụ thể mà bạn muốn sửa và thực thi một lệnh dựa trên các lỗi đó. Bạn cũng có thể dễ dàng sử dụng quickfix để đưa bạn đến vị trí của từng lỗi. Sau đó, bạn sẽ ánh xạ chức năng đến một tổ hợp phím. map <C-j> call Function()<CR>Nhưng đây sẽ là một chức năng được tùy chỉnh rất tùy chỉnh mà bạn sẽ cần phải viết cho phù hợp với nhu cầu của bạn. Và quan điểm của romainl là nếu bạn làm sai điều gì đó, bạn có thể dễ dàng gây hại nhiều hơn là tốt. Cần thận trọng
Tumbler41

1
Sử dụng một máy in đẹp để thực thi định dạng nhất quán.
lcd047

1
Các IDE đều hỗ trợ một số loại định dạng tự động, tôi không hiểu sự ghét ở đây. Công ty của tôi sử dụng một hook hook trước eslint --fix, tôi muốn có cái này ở cấp độ biên tập viên.
Jerska

Câu trả lời:


11

Như đã đề cập trong các ý kiến, hãy nhận thức được hậu quả của việc sửa đổi này đối với môi trường làm việc của bạn (biết chính xác những quy tắc eslint nào bạn sử dụng để "sửa chữa" mọi thứ).

Để trả lời câu hỏi của bạn: việc thêm tùy chọn vào thực thi eslint với cú pháp là đơn giản . Chỉ cần thêm cái này vào .vimrc:

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

Nhưng vì eslint được thực thi trên tệp sau khi vim ghi bộ đệm của nó vào tệp, vim không biết về các bản sửa lỗi mà eslint thực hiện. Vì vậy, bằng cách nào đó vim phải tải lại tệp (cách thủ công sẽ chỉ đơn giản là gõ :eở chế độ bình thường / lệnh). Để làm điều đó, chúng ta có thể sử dụng autoread tùy chọn cùng với checktime :

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

Để gọi thời gian kiểm tra, chúng ta có thể sử dụng một autocmd được thực thi mỗi khi bộ đệm được ghi vào một tệp. Nhưng vì cú pháp đang sử dụng autocmd của chính nó trong cùng một sự kiện, BufWritePostchúng ta phải thêm autocmd của mình sau khi cú pháp thêm chính nó. Tôi thấy rằng đây là trường hợp khi chúng tôi thêm autocmd của chúng tôi vào VimEnter:

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

Vì vậy, sau khi thêm cả ba phần vào .vimrcvim của bạn sẽ hoạt động như mong đợi (lint và tự động sửa khi lưu tệp :w).


7

Giải pháp được đưa ra trong câu trả lời của Jepz không hoàn toàn hiệu quả với tôi. eslintđã được gọi chính xác với --fixtùy chọn. Tuy nhiên, có thể đó là do các phần bên trong đã thay đổi, nhưng có vẻ như nó checktimeđã được gọi trước khi kết thúc eslint --fix, do đó, việc tải lại tệp không hoạt động đúng, kích hoạt file has changed, are you sure you want to write to it?lần lưu tiếp theo.

Tuy nhiên, bằng cách đào sâu vào các vấn đề, tôi đã phát hiện ra một cái móc ẩn dường như kích hoạt sau khi kiểm tra Syntastic hoàn thành, được gọi là SyntasticCheckHook( nguồn ).

Với điều này, bạn có thể chỉ cần gọi checktimesau khi kiểm tra Syntastic đã chạy.

Đây là mã cuối cùng của tôi:

set autoread

let g:syntastic_javascript_checkers = ['eslint']

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

Chỉnh sửa: Cá nhân tôi đã chuyển sang ALEdùng linting, hỗ trợ tự động trộn tự nhiên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.