การเติมข้อความอัตโนมัติใน Vim


257

สั้นฉันกำลังค้นหาคุณสมบัติการเติมข้อความอัตโนมัติที่ใช้งานได้สำหรับเครื่องมือแก้ไข Vim ฉันได้ถกเถียงกันมาก่อนว่า Vim แทนที่ IDE ภายใต้ Linux อย่างสมบูรณ์และแม้ว่ามันจะเป็นจริง แต่ก็ไม่มีคุณสมบัติที่สำคัญอย่างใดอย่างหนึ่ง: การเติมข้อความอัตโนมัติ

ฉันรู้เกี่ยวกับCtrl+ N, บูรณาการเจริญงอกงาม ctags , Taglist , cppcompleteและOmniCppComplete อนิจจาสิ่งเหล่านี้ไม่ตรงกับคำอธิบายของฉันเกี่ยวกับ“ การเติมข้อความอัตโนมัติที่ทำงาน:”

  • Ctrl+Nทำงานอย่าง (เท่านั้น) ถ้าคุณได้ forgotton วิธีการสะกดหรือclass whileโอ้ดี
  • Ctagsให้ความรู้พื้นฐานแก่คุณ แต่มีข้อเสียมากมาย
  • Taglistเป็นเพียงเสื้อคลุม Ctags และเป็นเช่นนั้นสืบทอดส่วนใหญ่ของข้อเสีย (แม้ว่ามันจะทำงานได้ดีสำหรับการประกาศรายการ )
  • cppcompleteใช้งานไม่ได้ตามที่สัญญาและฉันไม่สามารถเข้าใจได้ว่าฉันทำอะไรผิดหรือหาก "ทำงาน" ถูกต้องและข้อ จำกัด นั้นเกิดจากการออกแบบ
  • OmniCppCompleteดูเหมือนจะมีปัญหาเช่นเดียวกับ cppcomplete เช่นการเติมข้อมูลอัตโนมัติไม่ทำงานอย่างถูกต้อง นอกจากนี้tagsไฟล์จะต้องได้รับการอัพเดตอีกครั้งด้วยตนเอง

ฉันตระหนักถึงความจริงที่ว่าแม้แต่ IDE ที่ทันสมัยและเต็มไปด้วยลมหายใจนั้นก็ไม่ได้นำเสนอโค้ด C ++ ที่สมบูรณ์ นั่นเป็นเหตุผลที่ฉันยอมรับการขาด Vim ในพื้นที่นี้จนถึงขณะนี้ แต่ฉันคิดว่าระดับพื้นฐานของการเติมโค้ดให้สมบูรณ์นั้นไม่ได้ถามมากเกินไปและในความเป็นจริงนั้นจำเป็นสำหรับการใช้งานอย่างมีประสิทธิภาพ ดังนั้นฉันกำลังค้นหาสิ่งที่สามารถทำได้อย่างน้อยสิ่งต่อไปนี้

  • การรับรู้ไวยากรณ์ cppcomplete สัญญา (แต่ไม่ส่งมอบให้ฉัน) ถูกต้องขอบเขตตระหนักถึงการเติมอัตโนมัติต่อไปนี้:

    variableName.abc
    variableName->abc
    typeName::abc
    

    และจริงๆแล้วสิ่งอื่นใดก็ไร้ประโยชน์อย่างสมบูรณ์

  • configurability ฉันต้องระบุ (อย่างง่าย) ที่แหล่งไฟล์อยู่และด้วยเหตุนี้ที่สคริปต์ได้รับข้อมูลการทำให้สมบูรณ์อัตโนมัติจาก ในความเป็นจริงฉันมี Makefile ในไดเรกทอรีซึ่งระบุเส้นทางที่ต้องการรวม Eclipse สามารถตีความข้อมูลที่พบในนั้นทำไมไม่ใช้ Vim script เช่นกัน?

  • up-to-dateness ทันทีที่ฉันเปลี่ยนบางสิ่งในไฟล์ของฉันฉันต้องการให้การเติมข้อมูลอัตโนมัติสมบูรณ์เพื่อสะท้อนสิ่งนี้ ฉันไม่ต้องการที่จะทริกเกอร์ด้วยตนเองctags(หรือสิ่งที่เทียบเท่า) นอกจากนี้การเปลี่ยนแปลงควรเพิ่มขึ้นเช่นเมื่อฉันเปลี่ยนไฟล์เพียงไฟล์เดียวก็ไม่สามารถยอมรับได้อย่างสมบูรณ์สำหรับctagsการแยกวิเคราะห์แผนผังไดเรกทอรีทั้งหมด (ซึ่งอาจมีขนาดใหญ่)

ฉันลืมอะไรไปหรือเปล่า อย่าลังเลที่จะอัปเดต

ฉันพอใจกับการกำหนดค่าค่อนข้างมากและ / หรือการแก้ไข แต่ฉันไม่ต้องการเขียนโปรแกรมตั้งแต่ต้นและฉันไม่สามารถดีบักสคริปต์ Vim ได้ดี

บันทึกย่อสุดท้ายฉันชอบสิ่งที่คล้ายกันสำหรับ Java และ C # แต่ฉันเดาว่ามันมากเกินกว่าที่จะคาดหวัง: ctagsเฉพาะแจงไฟล์โค้ดและทั้ง Java และ C # มีเฟรมเวิร์กที่เตรียมไว้ล่วงหน้าจำนวนมากที่จะต้องทำดัชนี น่าเสียดายที่การพัฒนา. NET ที่ไม่มี IDEนั้นเป็น PITA มากกว่า C ++


4
เป็นเวลานานมากแล้วที่คุณถามคำถามนี้ในที่สุดคุณก็ได้พบสิ่งที่ดีหรือไม่? ฉันถามเพราะฉันไม่เห็นคำตอบที่ยอมรับได้ โดยส่วนตัวแล้วฉันต้องยอมรับว่าฉันใช้คำนำหน้าตัวแปร / ฟังก์ชั่น ตัวอย่างเช่นพวกเขาทั้งหมดเริ่มต้นด้วยsh(หมายถึงมันอยู่ในห้องสมุดของฉัน) และตามด้วยตัวย่อของชั้นเรียนของฉัน ตัวอย่างเช่นshPสำหรับParserชั้นเรียน จากนั้นสิ่งที่คุณต้องทำคือเขียนshPและกด CTRL + p (หรือ CTRL + n ถ้าคุณต้องการ) และรับสมาชิกชั้นเรียนจากการใช้งานครั้งสุดท้ายเป็นครั้งแรก (หรือคนแรกไปจนถึงสุดท้ายถ้า CTRL + n)
Shahbaz

4
@Shahbaz ที่จริงแล้วฉันเชื่อว่าในตอนนี้ยังไม่มีทางออกที่ดีพอ clang_completeเป็นเทคนิคที่ดีที่สุด แต่ช้าเกินไปเนื่องจากไม่มีการแคชผลลัพธ์และการคอมไพล์บางส่วน ฉันต้องยอมรับว่าฉันไม่ได้ลองคำตอบทั้งหมดเพราะบางคนต้องการการตั้งค่าที่ซับซ้อนและใช้เวลานาน ฉันจะกลั้นลมหายใจของฉันสำหรับปลั๊กอินที่ใช้งานได้ในขณะนั้นเสียงดังกราวในที่สุดช่วยให้นักพัฒนาสามารถสร้าง AST จากแหล่ง C ++ (จนถึงขณะนี้ไม่มีตัวแยกวิเคราะห์ฟรีที่ดีสำหรับ C ++ ที่มี)
Konrad Rudolph

2
คุณเคยลองclang_completeมาแล้วหรือยัง? มันสามารถใช้libclangกับการแคชตอนนี้และควรเร็วขึ้น
Jan Larres

@Jan ขอบคุณสำหรับข้อมูล เมื่อฉันลองดูครั้งล่าสุดการสนับสนุน libclang ยังคงไม่สมบูรณ์ ฉันน่าจะลองใหม่อีกครั้งเมื่อฉันมีเวลา
Konrad Rudolph

(เหตุผลในการแก้ไขการย้อนกลับ: ชื่อผลิตภัณฑ์ไม่ใช่รหัส แต่ไม่ใช่ของformatted like this)
Konrad Rudolph

คำตอบ:


171

ลองYouCompleteMe มันใช้เสียงดังกราวผ่านอินเทอร์เฟซ libclang ซึ่งให้ความหมายของ C / C ++ / Objective-C มันเหมือน clang_complete แต่เร็วกว่ามากและมีการจับคู่แบบคลุมเครือ

นอกเหนือจากข้างต้นแล้ว YCM ยังมีการเติมความหมายสำหรับ C #, Python, Go, TypeScript และอื่น ๆ อีกมากมายนอกจากนี้ยังให้ความสมบูรณ์แบบไม่ใช้ความหมายตามตัวบ่งชี้สำหรับภาษาที่ไม่มีการสนับสนุนความหมาย


69
อันที่จริงฉันจะยอมรับวิธีนี้ ในที่สุดปลั๊กอินที่ให้ ฉันใช้มันมาหลายวันแล้ว ใช้เวลาเพียงสี่ปีในการตอบคำถามนี้ ;-)
Konrad Rudolph

5
งานที่ยอดเยี่ยมกับ YouCompletMe valloric! ขอแสดงความยินดี
statquant

5
น่าเสียดายที่ YouCompleteMe เป็น PITA ที่สมบูรณ์ในการติดตั้งบน Windows :(
xx

2
@DrTwox จาก readme: "YCM ไม่มีการสนับสนุนอย่างเป็นทางการสำหรับ Windowsแต่นั่นไม่ได้หมายความว่าคุณจะไม่สามารถใช้งานได้ที่นั่นดูหน้า wiki ของคู่มือการติดตั้ง Windows รู้สึกฟรีเพื่อเพิ่ม"
user456584

7
โพสต์นี้ควรพูดถึงว่าคุณเป็นผู้เขียนเนื่องจากนี่คือการโปรโมตตัวเองตามแนวชายแดน (แม้ว่าฉันจะไม่เถียงว่าจะตอบคำถามคุณควรมีข้อจำกัดความรับผิดชอบ)
EntangledLoops

36

นอกจากนี้ยังมีclang_completeซึ่งใช้clangคอมไพเลอร์เพื่อจัดทำโค้ดให้สมบูรณ์สำหรับโครงการ C ++ มีอีกคำถามหนึ่งที่มีคำแนะนำการแก้ไขปัญหาสำหรับปลั๊กอินนี้

ปลั๊กอินดูเหมือนว่าจะทำงานได้ค่อนข้างดีตราบใดที่โครงการคอมไพล์ แต่ช้ากว่าห้ามสำหรับโครงการขนาดใหญ่ (เนื่องจากพยายามรวบรวมแบบเต็มเพื่อสร้างรายการแท็ก)


clang_completeปลั๊กอินทำงานอย่างบน Cygwin และ Windows ไม่สามารถพูดอะไรเกี่ยวกับโครงการขนาดใหญ่เพราะฉันไม่มี :)
Lumi

ดูเหมือนว่า clang_complete โดยใช้ libclang ทำการแคชแล้ว นี่ควรเป็นคำตอบที่ยอมรับแล้ว คุณลอง clang_complete บนเคอร์เนล Linux แล้วหรือยัง การจัดทำดัชนีที่ดีที่สุดที่ฉันเคยเห็นสำหรับเคอร์เนลคือการใช้ Eclipse CDT ถ้า clang_complete สามารถจัดการเคอร์เนลได้มันควรจะทำอะไรให้เสร็จ
dashesy

clang_complete เป็นปลั๊กอิน Vim ที่ดีที่สุดที่ฉันใช้
Cromulent

1
@Cromulent Ah ตรวจสอบ YouCompleteMe มันดีกว่ามาก
Konrad Rudolph

@ KonradRudolph ขอบคุณ ฉันจะตรวจสอบมันออก
Cromulent

7

ตามที่ร้องขอนี่คือความคิดเห็นที่ฉันให้ไว้ก่อนหน้านี้:

ดูที่นี้:

ลิงค์นี้จะช่วยคุณหากคุณต้องการใช้ monodevelop บน MacOSX

ขอให้โชคดีและการเข้ารหัสที่มีความสุข


ลิงก์ OmniCompletion ใช้งานไม่ได้
dotoree

1
ฉันขอแนะนำgithub.com/nosami/OmniSharpServerกับ YouCompleteMe สำหรับ C # ตามที่แนะนำไว้ข้างต้น
rafee

6

ฉันเพิ่งพบโครงการEclimเชื่อมโยงในคำถามอื่น สิ่งนี้ดูมีแนวโน้มอย่างน้อยสำหรับการรวม Java


คุณทดสอบแล้วหรือยัง ดูเหมือนว่าน่าสนใจ
Pacane

@Pacane: ไม่ ฉันไม่ได้ใช้จาวาในหลายเดือนและไม่มีเวลาว่างในการทดสอบ
Konrad Rudolph

1
Eclim น่าจะเป็นทางออกที่ดีสำหรับ Java แม้ว่า Eclipse ยังคงสัตว์โหลดแม้ในการติดตั้งหัวขาด
Drupad Panchal

2
สำหรับ Java คุณสามารถใช้Vrapper ฉันพบว่าปกติแล้วมันก็โอเคกับการเติมอัตโนมัติที่ยอดเยี่ยม สำหรับการแก้ไขข้อความที่หนักเป็นครั้งคราวฉันสามารถเปิด Vim จริงเป็นเครื่องมือภายนอก
kizzx2


2

สิ่งที่คุณกำลังมองหาบางอย่างเช่น intellisense?

insevimดูเหมือนจะแก้ไขปัญหา

เชื่อมโยงไปยังภาพหน้าจอที่นี่


2
นี่คือสิ่งที่ฉันกำลังมองหาใช่ น่าเสียดายที่มันทำงานบน Windows เท่านั้น (ฉันใช้ OS X) นอกจากนี้ดูเหมือนว่าจะมีการอัปเดตครั้งล่าสุดราวปี 2003 :-(
Konrad Rudolph

ดีที่คุณจะได้รับซอร์สโค้ด :) ถ้าไม่ใช่อย่างนั้นสิ่งเดียวที่ฉันคิดได้คือ omnicompletion .. หรือดูที่นี่: ankitjain.org/blog/2007/06/30/integrating-vim-with-monodevelopสำหรับสิ่งสุทธิอย่างน้อย ..
เฟรเดอโตเกียว

Ric โปรดให้ความเห็นของคุณเป็นคำตอบที่แยกกันสองคำพวกเขาประเมินค่าไม่ได้และฉันต้องการให้เกียรติอย่างถูกต้อง ที่กล่าวว่า MonoDevelop ใช้ไม่ได้กับ OS X ณ ตอนนี้และตอนนี้ฉันกำลังมองหา OmniCppComplete
Konrad Rudolph

ฮ่า ๆ นี่เป็นหน้าต่างเท่านั้น! :( ทำไมมึงควรต้องการนี้บน windows ที่ u มี VS .. ฉันกำลังมองหาวิธีการแก้ปัญหาบน Linux.
นิลส์

นิลส์: ไม่ใช่ทุกคนที่สามารถเข้าถึง Visual Studio ได้นอกจากนี้ยังมีคนจำนวนมากที่มีทักษะ vi ที่ต้องการนำไปใช้ในระบบ Windows มีพอร์ตไปยัง Linux แต่กำลังทำงานอยู่ ไม่ว่าในกรณีใดคุณพยายามทำอะไรให้สำเร็จ คุณแน่ใจหรือไม่ว่าคุณไม่ต้องการเพียงฟังก์ชั่นอัตโนมัติเริ่มต้น linux.org/docs/ldp/howto/C-editing-with-VIM-HOWTO/ …
Ric โตเกียว

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