Bagaimana cara mendapatkan penyelesaian otomatis yang cerdas di C ++?


43

Emacs tidak dapat bersaing dengan IDE lain jika tidak memiliki fungsi penyelesaian otomatis. Pelengkapan otomatis hanya membuat saya seorang programmer yang lebih efisien. Saya tahu ekstensi Mode Lengkap Otomatis , tetapi tidak bekerja dengan C ++.

autocomplete

Bagaimana saya bisa mencapai pelengkapan otomatis yang cerdas dan efisien untuk C ++?


Pertanyaan ini awalnya ditanyakan oleh Malabarba pada proposal Area 51: Bagaimana cara mendapatkan penyelesaian otomatis yang cerdas di C ++?


1
Akan menyenangkan untuk sedikit memperluas pertanyaan ini. Ini memiliki banyak nilai potensial, tetapi sekarang pertanyaannya hanyalah judulnya.
Malabarba

Mode ironis tampaknya menjadi cara untuk pergi saat ini.
Sevki

Jawaban:


45

Penafian: Saya penulis ironi-mode

tangkapan layar company-irony

Jika Anda hanya ingin penyelesaian otomatis pintar, saya dapat merekomendasikan ironi-mode dengan ironi perusahaan .

  • ironi-mode mudah dipasang berkat MELPA
  • yang selesai sangat akurat dan kinerja cukup layak berkat libclang
  • dengan ironi perusahaan Anda memiliki backend penyelesaian asinkron yang tidak akan menghalangi Anda jika penyelesaian membutuhkan waktu
  • ironi perusahaan mendukung fungsi kelebihan beban dan jika Anda menginstal Yasnippet, argumen fungsi dimasukkan sebagai placeholder untuk diisi
  • jika proyek Anda menggunakan Doxygen, dokumentasi singkat dari kandidat yang selesai ditampilkan dalam minibuffer (lihat tangkapan layar)
  • pemasangan server mode-ironi pada sistem mirip Unix (Linux, OS X) harus mudah. Windows di sisi lain membutuhkan sedikit penyesuaian tetapi didokumentasikan dalam wiki

Alat lain yang belum dikutip adalah emacs-ycmd .


2
Terima kasih banyak! Seandainya saya tahu lebih cepat tentangirony-mode
Luke

@GuillaumePapin Terima kasih telah menulis ironi! Apakah Anda memiliki tolok ukur waktu yang tersedia? Saya perhatikan bahwa panggilan ke clang_codeCompleteAtdengan TU yang diuraikan (tetapi perubahan yang belum disimpan) membutuhkan waktu 3-5 detik. Apakah irony-modelebih cepat dari ini?
Pradhan

1
Irony menggunakan libclang / clang_codeCompleteAt, jadi Anda tidak akan mendapatkan waktu yang lebih baik dari itu. 3-5 detik mungkin terlalu banyak tergantung pada konteksnya (mis. Penyelesaian pada lingkup global membutuhkan lebih banyak waktu daripada lingkup lainnya). Anda dapat melihat beberapa pengaturan waktu yang saya lakukan baru-baru ini: github.com/Sarcasm/irony-mode/issues/131#issuecomment-60008803
Guillaume Papin

Terkait, untuk pembaca masa depan: github.com/Sarcasm/irony-mode/issues/140
Sean Allred

Bagaimana peran ironi-mode dan emacs-ycmd dibandingkan? Apakah mereka alternatif satu sama lain? Apakah masuk akal untuk menggunakan keduanya?
Praxeolitic

23

Lihat panduan saya . Ini mencantumkan beberapa metode untuk pelengkapan otomatis dalam C / C ++.

Pilihan tersebut adalah:

  • Menggunakan Irony . Sangat direkomendasikan, karena menggunakan dentang dan mudah diatur dibandingkan dengan solusi lain.

  • Menggunakan parser bawaan dari Emacs. Ini adalah pelengkapan otomatis terbaik yang bisa Anda dapatkan dari dalam parser Emacs, Semantic, tetapi itu akan lambat pada proyek besar seperti kernel Linux.

  • Menggunakan company-modepaket dengan company-clang. Memberikan denda penyelesaian kode untuk sistem termasuk jalur karena dapat secara otomatis mendapatkan jalur dari Dentang, tetapi harus melakukan beberapa konfigurasi untuk proyek lokal

  • Menggunakan company-modedengan company-gtags. Ia menggunakan basis data tag yang dihasilkan dari GNU Global sebagai penyelesaian. Anda dapat menggunakan ini untuk memberikan kode lengkap secara lokal untuk proyek Anda. Ini tidak sepenuhnya cerdas karena ia melempar semua yang ada di dalam database yang dihasilkan kepada Anda.

  • rtagsmelangkah lebih jauh dengan menyediakan server untuk analisis langsung. Tetapi rumit untuk setup dibandingkan dengan solusi Elisp murni.


Saya tidak akan setuju bahwa pengaturan rtag lebih rumit daripada solusi emacs lisp murni. Solusi lisp emacs murni biasanya tidak mempertimbangkan file cmake / build dan sulit menemukan header apa pun . Rtags cukup mudah untuk diatur sebagai perbandingan. Itu masih agak muda sebagai proyek, dengan cakupan tes yang tidak terlalu baik.
baol

Tambahan yang bagus untuk panduan Tuhdo
Victor

9

Saya telah sukses besar dengan RTags + Company .

RTags membutuhkan daemon terpisah yang rdmberjalan yang menggunakan dentang untuk penyelesaian kode, navigasi kode dan refactoring. rdmjuga berfungsi sebagai basis data simbol, yang berarti pelengkapan otomatis jauh lebih cepat daripada solusi apa pun yang langsung menelepon clang_codeCompleteAt.

Rdm membutuhkan info bendera kompilasi untuk proyek-proyek Anda yang bisa merepotkan, tetapi jika Anda mengikuti saran dari RTags halaman dan symlink gcc-rtags-wrapper.shuntuk gcc, g++, ccdan c++rdm otomatis akan diperbarui dengan bendera kompilasi baru pada mengkompilasi ulang.


Saya baru saja beralih dari ironi-mode ke rtags. Mode irony terus-menerus hancur dan berhenti bekerja setelah sekitar 15 menit atau lebih. Rtags tampaknya cukup bagus sejauh ini, dan memiliki integrasi yang lebih bersih dengan yasnippet.
nenchev

6

Solusi 1: mode-perusahaan + dentang

Satu-satunya masalah adalah Anda perlu memberi tahu mode perusahaan tempat mencari file header c / c ++ proyek Anda.

Jika Anda menggunakan cmake, Anda dapat membiarkan https://github.com/redguardtoo/cpputils-cmake untuk melakukan pengaturan untuk Anda (PETUNJUK: Saya penulis cpputils-cmake).

ATAU

Solusi 2: mode perusahaan + gnu global

Tidak ada lagi yang perlu dikatakan, Anda perlu membuat tag dengan alat global cli gnu, seperti yang disebutkan lainnya.


1

Saya telah menggunakan cmake-ide untuk mengkonfigurasi rtag, flycheck, ironi, dan dentang perusahaan.

Sekarang Anda dapat mengkonfigurasi sistem build Anda dan plugin emacs analisis statis favorit Anda secara bersamaan!

EDIT: Perhatikan bahwa dentang perusahaan menyediakan pelengkapan otomatis, yang merupakan fitur yang Anda cari. cmake-ide juga dapat mengkonfigurasi flycheck dan rtags, yang menambahkan beberapa fitur seperti IDE.


1
Tolong jelaskan bagaimana ini menjawab pertanyaan tentang cara mendapatkan pelengkapan otomatis C ++.
Drew

@Drew company-clang menyediakan pelengkap
AnimatedRNG

Tolong tuliskan di jawaban Anda. Terima kasih.
Drew

0

Mode semantik Mx

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

&&

Tag Tabel

Temukan . -nama "*. [chCH]" -print | etag -

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

etags , ctags - menghasilkan file tag untuk Emacs, vi

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

Penyelesaian CMi (atau M-TAB) pada titik. Jika mode Semantik diaktifkan, coba gunakan data pengurai Semantic. Jika mode Semantic dinonaktifkan atau gagal, coba selesaikan menggunakan tabel tag yang dipilih (lihat Tag)

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

M- (cari-tag) meminta nama tag && melompat ke definisi

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.