วิธีการแก้ไขข้อผิดพลาดทั่วไปของ linting โดยอัตโนมัติที่รายงานผ่าน syntastic


13

ฉันเริ่มใช้ปลั๊กอินsyntasticกับกลุ่มเพื่อรายงานข้อผิดพลาดผ้าสำลีในjavascriptรหัสของฉัน

ฉันยังรวมeslintกับsyntasticและมันแสดงให้ฉันเห็นข้อผิดพลาดที่ดีคำเตือนในกรณีที่พวกเขามีอยู่ตามกฎที่เขียนไว้ในไฟล์. eslintrcของฉัน

มีวิธีใดบ้างที่ฉันสามารถแก้ไขข้อผิดพลาดทั่วไปบางอย่างเช่นขาดเซมิโคลอนไม่มีที่ว่างและอื่น ๆ ด้วยการกดคีย์

แก้ไข:

ฉันได้พบว่าeslintมีตัวเลือก

  --fix Automatically fix problems

ซึ่งสามารถใช้สำหรับกรณีดังกล่าว ฉันต้องเรียกใช้คำสั่งนี้เพื่อให้ eslint แก้ไขปัญหาเหล่านั้น

eslint --fix -c myconfig file.js

ฉันต้องการทราบว่าสามารถรวมเข้ากับกลุ่มได้อย่างไร


5
1. คุณไม่จำเป็นต้องใช้ปลั๊กอินนั้นสำหรับการตรวจสอบไวยากรณ์ 2. การแก้ไขข้อผิดพลาดอัตโนมัติเป็นความคิดที่แย่มาก
romainl

1
ไม่ใช่ข้อผิดพลาดทั้งหมดที่ฉันกำลังพูดถึงข้อผิดพลาดเช่นช่องว่างรอบ =, ช่องว่างรอบ ๆ ถ้าบล็อก, การเยื้อง ฯลฯ เหล่านี้เป็นข้อผิดพลาดที่เกี่ยวข้องกับรูปแบบรหัสไม่ใช่ข้อผิดพลาดที่เกิดขึ้นจริง
WitVault

1
คำตอบสั้น ๆ คือใช่แน่นอนคุณทำได้ คุณจะต้องกำหนดฟังก์ชั่นที่กำหนดเองเพื่อแยกบรรทัดใน Quickfix เพื่อค้นหาข้อผิดพลาดเฉพาะที่คุณต้องการแก้ไขและดำเนินการคำสั่งตามข้อผิดพลาดเหล่านั้น คุณสามารถใช้ตัวแก้ไขด่วนเพื่อนำคุณไปยังตำแหน่งของข้อผิดพลาดแต่ละรายการได้อย่างง่ายดาย จากนั้นคุณจะแมปฟังก์ชันกับการกดแป้น map <C-j> call Function()<CR>แต่นี่จะเป็นฟังก์ชั่นที่ปรับแต่งตามความต้องการของคุณซึ่งคุณต้องเขียนให้เหมาะกับความต้องการของคุณ และจุดสำคัญของ romainl คือถ้าคุณทำอะไรผิดคุณสามารถลงเอยด้วยการทำอันตรายมากกว่าดีได้อย่างง่ายดาย ขอแนะนำข้อควรระวัง
Tumbler41

1
ใช้เครื่องพิมพ์สวยเพื่อบังคับใช้การจัดรูปแบบที่สอดคล้องกัน
lcd047

1
IDEs ทั้งหมดสนับสนุนการกำหนดรูปแบบอัตโนมัติบางอย่างฉันไม่เข้าใจความเกลียดชังที่นี่ บริษัท ของฉันใช้การผูกมัดล่วงหน้ากับeslint --fixฉันฉันอยากได้สิ่งนี้ในระดับบรรณาธิการ
Jerska

คำตอบ:


11

ดังที่ได้กล่าวไว้ในความคิดเห็นให้ตระหนักถึงผลกระทบที่เกิดขึ้นจากการปรับเปลี่ยนนี้ที่มีต่อสภาพแวดล้อมการทำงานของคุณ (รู้ว่ากฎ eslint ใดที่คุณใช้ในการ

เพื่อที่จะตอบคำถามของคุณ: การเพิ่มตัวเลือกในการดำเนินการ eslint กับประโยคคือตรงไปตรงมา เพียงเพิ่มลงในของคุณ.vimrc:

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

แต่เมื่อ eslint ทำงานบนไฟล์หลังจากที่ vim เขียนบัฟเฟอร์ไปยังไฟล์ vim ไม่ทราบเกี่ยวกับการแก้ไข eslint ดังนั้นกลุ่มใดก็ตามที่มีการโหลดไฟล์อีกครั้ง (วิธีคู่มือจะเป็นเพียงแค่พิมพ์:eในโหมดปกติ / คำสั่ง) ในการทำเช่นนั้นเราสามารถใช้ตัวเลือกการตอบกลับอัตโนมัติพร้อมกับเวลาเช็คอิน :

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

ในการเรียก checktime เราสามารถใช้autocmdซึ่งจะถูกประมวลผลทุกครั้งที่บัฟเฟอร์ถูกเขียนไปยังไฟล์ แต่เนื่องจากวากยสัมพันธ์กำลังใช้ autocmd ของตัวเองในเหตุการณ์เดียวกันBufWritePostเราต้องเพิ่ม autocmd ของเราหลังจาก syntactic เพิ่มของมันเอง ฉันพบว่านี่เป็นกรณีเมื่อเราเพิ่ม autocmd ของเราในVimEnter:

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

ดังนั้นหลังจากเพิ่มทั้งสามส่วนใน.vimrcเสียงเรียกเข้าของคุณควรทำงานตามที่คาดไว้ (ผ้าสำลีและแก้ไขอัตโนมัติเมื่อบันทึกไฟล์:w)


7

โซลูชันที่ให้ไว้ในคำตอบของ Jepz ไม่ได้ผลสำหรับฉันอย่างสมบูรณ์ eslintถูกเรียกอย่างถูกต้องด้วย--fixตัวเลือก อย่างไรก็ตามอาจเป็นเพราะภายในมีการเปลี่ยนแปลง แต่ดูเหมือนว่าchecktimeถูกเรียกมาก่อนที่จะสิ้นสุดeslint --fixดังนั้นการโหลดไฟล์ไม่ทำงานอย่างถูกต้องก่อให้เกิดfile has changed, are you sure you want to write to it?การบันทึกครั้งต่อไป

อย่างไรก็ตามโดยการขุดเป็นปัญหาฉันได้ค้นพบตะขอซ่อนที่ดูเหมือนว่าจะก่อให้เกิดหลังจากการตรวจสอบ Syntastic เสร็จสมบูรณ์เรียกว่าSyntasticCheckHook(ที่มา )

ด้วยวิธีนี้คุณสามารถโทร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สำหรับผ้าสำลีซึ่งรองรับการคำนวณแบบอัตโนมัติ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.