นี่เป็นคำถามเก่า แต่ฉันกลับมาหามันทุกเวลาแล้วด้วยความหวังอันเลือนลางโดยคิดว่าวันหนึ่งฉันจะพบการผสมผสานที่ถูกต้องของปลั๊กอินเพื่อให้การเติมข้อความอัตโนมัติสมบูรณ์แบบใน Vim การค้นหาดำเนินการต่อ แต่นี่คืองานวิจัยทั้งหมดที่ฉันทำในช่วงหลายปีที่ผ่านมา
ก่อนอื่นคุณต้องเข้าใจว่าVim เป็นตัวแก้ไขข้อความไม่ใช่โปรแกรมแก้ไขรหัส เครื่องมือแก้ไขรหัส IDES เป็นเครื่องมือเช่นชุดเครื่องมือ Jetbrains, Visual Studio Code, Eclipse และอื่น ๆ
เป็นกลุ่มพื้นฐานไม่สามารถรหัส "เติมข้อความอัตโนมัติ" ได้อย่างถูกต้อง การเติมข้อความอัตโนมัติต้องมีการตรวจสอบซอร์สโค้ดของคุณและวิเคราะห์ AST พิจารณาว่า Vim ไม่สามารถดำเนินการแบบอะซิงโครนัสได้จนกว่า Vim 8 จะเปิดตัวในปี 2559 ดังนั้นการพยายามเรียกใช้ซอฟต์แวร์การสอดแทรกรหัสใด ๆ ในปลั๊กอิน Vim จะเป็นฝันร้าย มันถูกอบเข้าสู่ประวัติศาสตร์ของระบบนิเวศ Vim ที่จะไม่ทำเช่นนี้ และทุกคนที่พยายามทำสิ่งนี้เช่น Tern For Vim นั้นเป็นฝันร้ายที่จะใช้จริง ๆ
โปรแกรมแก้ไขข้อความที่ดีที่สุดสามารถทำได้คือตัวอย่างและทำคำ / บรรทัด / ฯลฯ ให้เหมือนกัน หากคุณกำลังมองหาการเติมข้อความอัตโนมัติคุณควรใช้โปรแกรมแก้ไขรหัสไม่ใช่โปรแกรมแก้ไขข้อความ
นี่คือตัวเลือกของคุณซึ่งฉันได้ลองทั้งหมด:
แป้นพิมพ์ลัดที่มีประโยชน์สองแบบคือCtrl- nซึ่งจะเติมคำให้สมบูรณ์โดยอัตโนมัติตามบัฟเฟอร์ปัจจุบันที่คุณเปิด (ไม่มีการแทรกโค้ด) และCtrl- xCtrl- lซึ่งจะเติมข้อความเต็มบรรทัดโดยอัตโนมัติหากคุณต้องการทำซ้ำ คุณอาจจะรู้Ctrl- xCtrl- ซึ่งจะทำให้สมบูรณ์อัตโนมัติชื่อไฟล์รวมทั้งเส้นทางเทียบกับปัจจุบันf รูปแบบที่สมบูรณ์ปลั๊กอินจะมีประโยชน์อย่างอ่อนโยนถ้าคุณไม่ได้ค้นหาด้วย:pwd
/\v
สร้างขึ้นใน Vim " Omnicompletion " ซึ่งถูกเรียกใช้โดยCtrl- x, Ctrl- o(นั่นคือสิ่งที่ผู้เขียน Vim ต้องการให้คุณพิมพ์ทุกครั้ง) พร้อมกับปลั๊กอินภาษาเฉพาะจำนวนมากหากมีอยู่ คุณสามารถ:echo &omnifunc
ในไฟล์เพื่อดูว่าคุณมีการตั้งค่า Omnicompletion โดย Vim ไว้ในไฟล์ที่คุณเลือกหรือไม่
AutoComplPopสำหรับเปิดเมนู Omnicompletion ด้านบนโดยอัตโนมัติเมื่อพิมพ์
SuperTabที่ให้คุณกดTabเพื่อเรียกใช้ Vim ที่สร้างเสร็จ
NeoComplCacheซึ่งเป็นการเติมคำหลัก (ไม่ได้ระบุว่าแตกต่างจาก Vim ที่สร้างเสร็จแล้วหรือไม่) การ.vimrc
ตั้งค่าที่ซับซ้อนและNeoSnippetสำหรับการทำตัวอย่างข้อมูล
การรวมกันของสัตว์ประหลาดexuberant-ctags
และDoctorJS
(โครงการ Mozilla ที่ตายไปแล้วเป็นเวลาหนึ่งปี) TagBarและสิ่งที่ปลูกเองในบ้านเพื่อดึงไฟล์ที่สมบูรณ์ออกจากไฟล์แท็ก
SnipMateซึ่งเป็นปลั๊กอินเสริมการแท็กพื้นฐานพร้อมด้วยตัวอย่างและคิดวิธีการเพิ่มตัวอย่างของคุณเองเนื่องจากมันค่อนข้างยุ่งยาก
UltiSnipsพร้อมกับUltiSnips-Snippetsซึ่งแตกต่างจากตัวอย่างด้านบน
Tern for Vimเป็นห้องสมุดที่มีแนวโน้มที่จะทำการวิปัสสนารหัสจริง ๆ เพื่อรับการเติมข้อความอัตโนมัติที่ถูกต้อง อย่างไรก็ตามมันเป็นรถช้ามากมีการรั่วไหลของหน่วยความจำที่จะผิดพลาดเป็นกลุ่มและอาจจะทิ้ง
YouCompleteMeซึ่งเป็นความสมบูรณ์แบบฟัซซี่ในแบบที่คุณเรียกใช้เซิร์ฟเวอร์ในพื้นหลังพร้อมกับฟังก์ชั่นที่ปลูกเองในบ้านเพื่อเติมเต็มข้อมูลโค้ด
Eclim - ความพยายามอันสูงส่งในการรันเซิร์ฟเวอร์ Eclipse ในพื้นหลังและแจ้งให้กลุ่มการเติมข้อความอัตโนมัตินั้นวิปัสสนาวิปัสสนาทันที มันทำงานเกี่ยวกับเช่นเดียวกับนกนางนวล
สุดท้ายClosetagหรือdelimitMateหรือAutoCloseหรือbananagram บ้านปลูกปิดอัตโนมัติของแท็กและวงเล็บโดยอัตโนมัติในการพิมพ์
ปลั๊กอินเกือบทั้งหมดในรายการนี้จะขัดแย้งกับปลั๊กอินอื่นเกือบทั้งหมดในรายการนี้
YouCompleteMe น่าจะเป็นผู้นำของกลุ่ม แต่ฉันไม่เคยได้รับมันเพื่อทำงานอย่างถูกต้องด้วยการเติมแท็กและการเติมโค้ดที่วิปัสสนาสมบูรณ์ยังไม่ได้พิสูจน์ว่ามีประสิทธิภาพ
ความคิดเห็นส่วนตัวของฉันคือสถานะปัจจุบันของการเติมข้อความอัตโนมัติของกลุ่ม Vim นั้นอยู่ในสภาพที่ไม่ดี สำหรับโครงการขนาดเล็กคุณอาจใช้วิธีการแก้ปัญหาข้างต้นอย่างใดอย่างหนึ่ง หากคุณกำลังจัดการกับ API อย่างง่ายคุณสามารถเก็บไว้ในหัวของคุณเป็นส่วนใหญ่ความสมบูรณ์ที่ไม่ใช่โค้ด หากคุณกำลังจัดการกับโครงการขนาดใหญ่หรือต้องการประโยชน์ด้านความปลอดภัยของประเภทขณะเขียนโปรแกรม IDE แบบเต็ม ( Eclipse , Visual Studio , WebStorm ) จะเหมาะกับคุณมากกว่า Vim
แน่นอนว่าข้อเสียของ IDE ก็คือคุณจะไม่มีพลังของ Vim ในมือของคุณอีกต่อไป ฉันไม่ได้ใช้ IDE เดี่ยวที่มีโหมด Vim ที่ยอมรับได้
Vim มีอคติภาษาปานกลางต่อภาษา C-like ที่ไม่ได้พิมพ์และมีความคาดหวังว่าผู้ใช้จะเพิ่มคุณสมบัติเฉพาะภาษาใด ๆ เป็นปลั๊กอิน น่าเสียดายที่สิ่งนี้นำไปสู่ระบบนิเวศการเติมข้อความอัตโนมัติที่มีเศษซาก ตัวเลือกบางอย่างดี แต่ไม่มีอะไรสมบูรณ์แบบและไม่ค่อยมีผู้นำเสียงข้างมาก / แนวปฏิบัติที่ดีที่สุด
let g:acp_behaviorSnipmateLength=-1
ดู:help autocomplpop
) คุณควรจะเพิ่มใน. vimrc ของคุณคุณเพิ่มหรือไม่