วิธีรับการเติมข้อความอัตโนมัติอัจฉริยะใน C ++ ได้อย่างไร


43

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

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

ฉันจะได้รับการเติมข้อความอัตโนมัติที่ชาญฉลาดและมีประสิทธิภาพสำหรับ C ++ ได้อย่างไร


แต่เดิมคำถามนี้ถูกถามโดยMalabarbaเกี่ยวกับข้อเสนอ Area 51: จะทำให้การเติมข้อมูลอัตโนมัติอัจฉริยะได้อย่างไรใน C ++


1
มันคงจะดีถ้าขยายคำถามนี้ออกไปสักหน่อย มันมีค่าที่เป็นไปได้มากมาย แต่ตอนนี้คำถามก็แค่ชื่อ
Malabarba

โหมดประชดน่าจะเป็นวิธีที่จะไปในเวลานี้
Sevki

คำตอบ:


45

คำเตือน: ฉันเป็นผู้สร้างโหมดประชด

ภาพหน้าจอ บริษัท ประชด

ถ้าคุณเพียงต้องการสมาร์ทอัตโนมัติเสร็จจะสามารถแนะนำประชดโหมดกับบริษัท ประชด

  • ประชดโหมดติดตั้งง่ายต้องขอบคุณMELPA
  • ความสมบูรณ์นั้นแม่นยำมากและประสิทธิภาพค่อนข้างดีขอบคุณlibclang
  • ด้วยการประชดประชันของ บริษัท คุณจะมีแบ็กเอนด์แบบอะซิงโครนัสเสร็จสมบูรณ์ซึ่งจะไม่เข้าทางของคุณหากการดำเนินการใช้เวลาพอสมควร
  • Company-irony รองรับฟังก์ชั่นที่ใช้งานมากเกินไปและหากคุณติดตั้ง Yasnippet แล้วอาร์กิวเมนต์ของฟังก์ชันจะถูกแทรกเป็นตัวยึดตำแหน่งสำหรับการเติม
  • ถ้าโครงการของคุณใช้ Doxygen เอกสารย่อของผู้สมัครที่สำเร็จจะปรากฏใน minibuffer (ดูภาพหน้าจอ)
  • การติดตั้งเซิร์ฟเวอร์โหมด irony บนระบบ Unix-like (Linux, OS X) น่าจะง่าย ในทางกลับกัน Windows ต้องการการปรับแต่งเล็กน้อย แต่มีการบันทึกไว้ในวิกิ

เครื่องมือที่ยังไม่ได้รับการอ้างถึงเลยก็คือemacs-ycmd


2
ขอบคุณมาก! หวังว่าฉันจะรู้เร็วเกี่ยวกับirony-mode
ลุค

@ GuillaumePapin ขอบคุณสำหรับการเขียนประชด! คุณจะมีเกณฑ์มาตรฐานเวลาใดบ้างหรือไม่ ฉันสังเกตเห็นว่าการเรียกไปที่clang_codeCompleteAtมีการแยกวิเคราะห์ TU (แต่การเปลี่ยนแปลงที่ไม่ได้บันทึก) ใช้เวลา 3-5 วินาที คือirony-modeเร็วกว่านี้หรือไม่?
Pradhan

1
Irony ใช้ libclang / clang_codeCompleteAt ดังนั้นคุณจะไม่ได้เวลาที่ดีไปกว่านี้ 3-5 วินาทีอาจมากเกินไปขึ้นอยู่กับบริบท (เช่นความสมบูรณ์ที่ขอบเขตทั่วโลกใช้เวลามากกว่าขอบเขตอื่น ๆ ) คุณสามารถดูการกำหนดเวลาที่ฉันทำเมื่อเร็ว ๆ นี้: github.com/Sarcasm/irony-mode/issues/131#issuecomment-60008803
Guillaume Papin

ที่เกี่ยวข้องสำหรับผู้อ่านในอนาคต: github.com/Sarcasm/irony-mode/issues/140
Sean Allred

บทบาทของโหมดประชดและ emacs-ycmd เปรียบเทียบกันอย่างไร? พวกเขามีทางเลือกซึ่งกันและกันหรือไม่? มันจะสมเหตุสมผลไหมที่จะใช้ทั้งสองอย่าง?
Praxeolitic

23

ตรวจสอบคำแนะนำของฉัน มันแสดงวิธีการหลายอย่างสำหรับการเติมข้อมูลอัตโนมัติใน C / C ++

ตัวเลือกเหล่านั้นคือ:

  • ใช้Irony แนะนำเป็นอย่างยิ่งเนื่องจากใช้ Clang และติดตั้งง่ายเมื่อเทียบกับโซลูชันอื่น ๆ

  • ใช้ parser ในตัวจาก Emacs มันเป็นระบบเติมข้อความอัตโนมัติที่ดีที่สุดที่คุณจะได้รับจากภายใน Emacs parser, Semantic แต่มันจะช้าในโครงการขนาดใหญ่เช่นเคอร์เนล Linux

  • ใช้แพคเกจด้วยcompany-mode company-clangจัดเตรียมการปรับโค้ดให้สมบูรณ์สำหรับระบบรวมพา ธ เนื่องจากสามารถรับพา ธ จากเสียงดังกราวได้โดยอัตโนมัติ แต่ต้องทำการกำหนดค่าบางอย่างสำหรับโปรเจ็กต์ท้องถิ่น

  • ใช้กับcompany-mode company-gtagsมันใช้ฐานข้อมูลแท็กที่สร้างจาก GNU Global เป็นความสำเร็จ คุณสามารถใช้สิ่งนี้เพื่อระบุรหัสที่สมบูรณ์ภายในโครงการของคุณ มันไม่ฉลาดอย่างแน่นอนเพราะมันจะโยนทุกอย่างภายในฐานข้อมูลที่สร้างให้คุณ

  • rtagsไปไกลกว่านี้ด้วยการจัดหาเซิร์ฟเวอร์สำหรับการวิเคราะห์สด แต่การติดตั้งนั้นซับซ้อนกว่าเมื่อเปรียบเทียบกับโซลูชัน Elisp แท้


ฉันจะไม่ยอมรับว่าการตั้งค่า rtags นั้นซับซ้อนกว่า emacs lisp solution โซลูชั่นเสียงกระเพื่อม emacs ที่บริสุทธิ์มักจะไม่พิจารณาไฟล์ cmake / build และแทบจะไม่สามารถค้นหาส่วนหัวใด ๆ Rtags ค่อนข้างง่ายต่อการติดตั้งในการเปรียบเทียบ มันก็ยังเด็กไปหน่อยในฐานะโครงการที่มีการทดสอบไม่ครอบคลุมมาก
baol

นอกจากคำแนะนำที่ดีของ Tuhdo: syamajala.github.io/c-ide.html
Victor

9

ผมเคยประสบความสำเร็จที่ดีกับRTags + บริษัท

RTags ต้องการ daemon แยกต่างหากrdmที่ใช้เสียงดังกราวสำหรับการเติมโค้ดให้สมบูรณ์, การนำทางด้วยรหัสและการรีแฟคเตอร์ rdmยังทำหน้าที่เป็นฐานข้อมูลของสัญลักษณ์ที่หมายถึงการเติมข้อความอัตโนมัติที่เร็วกว่าการแก้ปัญหาใด ๆ clang_codeCompleteAtเพียงแค่โทรโดยตรง

RDM ความต้องการข้อมูลของธงสะสมสำหรับโครงการของคุณซึ่งสามารถรบกวน แต่ถ้าคุณทำตามคำแนะนำจากที่RTagsหน้าและ symlink gcc-rtags-wrapper.shไปgcc, g++, ccและc++RDM โดยอัตโนมัติได้รับการปรับปรุงด้วยธงรวบรวมใหม่ในคอมไพล์


ฉันเพิ่งเปลี่ยนจากโหมดประชดเป็น rtags Irony-mode จะออกมาอย่างต่อเนื่องและหยุดทำงานหลังจากนั้นประมาณ 15 นาที Rtags ดูดีมากและมีการผสานที่ดีกว่ากับ yasnippet
nenchev

6

โซลูชันที่ 1: โหมด บริษัท + เสียงดังกราว

ปัญหาเดียวคือคุณต้องบอกโหมด บริษัท ว่าจะค้นหาไฟล์ส่วนหัว c / c ++ ของโครงการของคุณได้อย่างไร

หากคุณใช้ cmake คุณสามารถให้https://github.com/redguardtoo/cpputils-cmakeทำการตั้งค่าให้คุณ (คำแนะนำ: ฉันเป็นผู้เขียน cpputils-cmake)

หรือ

โซลูชันที่ 2: โหมด บริษัท + ทั่วโลก

ไม่มีอะไรจะพูดอีกต่อไปคุณต้องสร้างแท็กด้วยเครื่องมือ gnu global cli ตามที่คนอื่นพูดถึง


1

ฉันใช้cmake-ideเพื่อกำหนดค่า rtags, flycheck, irony และ clang ของ บริษัท

ตอนนี้คุณสามารถกำหนดค่าระบบการสร้างและปลั๊กอินการวิเคราะห์แบบคงที่ที่คุณชื่นชอบในเวลาเดียวกัน!

แก้ไข: โปรดทราบว่า บริษัท เสียงดังกังวานให้บริการเติมข้อความอัตโนมัติซึ่งเป็นคุณสมบัติที่คุณกำลังมองหา cmake-ide ยังสามารถกำหนดค่า flycheck และ rtags ซึ่งเพิ่มคุณสมบัติคล้าย IDE หลายประการ


1
โปรดอธิบายว่าวิธีนี้ตอบคำถามว่าจะรับการเติมข้อความอัตโนมัติ C ++ ได้อย่างไร
ดึง

@Drew company-clang ให้ความสำเร็จ
AnimatedRNG

กรุณาใส่ไว้ในคำตอบของคุณ ขอบคุณ.
ดึง

0

Mx semantic-mode

www.gnu.org/software/emacs/manual/html_node/semantic/Using-Semantic.html#Using-Semantic

&&

แท็กตาราง

หา -name "*. [chCH]" -print | Etags -

www.gnu.org/software/emacs/manual/html_node/emacs/Tags.html

etags , ctags - สร้างไฟล์แท็กสำหรับ Emacs, vi

manpages.debian.org/cgi-bin/man.cgi?query=etags&apropos=0&sektion=0&manpath=Debian+8+jessie&format=html&locale=en

CMi (หรือ M-TAB)เสร็จสิ้น ณ จุด หากเปิดใช้งานโหมด Semantic พยายามใช้ข้อมูลตัวแยกวิเคราะห์ Semantic หากโหมดความหมายปิดใช้งานหรือล้มเหลวให้พยายามใช้ตารางแท็กที่เลือก (ดูแท็ก)

http://www.gnu.org/software/emacs/manual/html_node/emacs/Symbol-Completion.html#index-C_002dM_002di

M- (find-tag)แจ้งให้ชื่อแท็ก && ข้ามไปที่การกำหนด

http://www.gnu.org/software/emacs/manual/html_node/emacs/Find-Tag.html#index-M_002d_002e

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