C ++ ile akıllı otomatik tamamlama nasıl elde edilir?


43

Otomatik tamamlama işlevi yoksa Emac'ler başka bir IDE ile rekabet edemez. Otomatik tamamlama, beni daha verimli bir programcı yapar. Otomatik Tamamlama Modu uzantısını biliyorum , ancak C ++ ile çalışmıyor.

Otomatik tamamlama

C ++ için akıllı ve verimli bir otomatik tamamlamayı nasıl elde edebilirim?


Bu soru, ilk olarak Malabarba tarafından Alan 51'in önerisi üzerine soruldu : C ++ 'da akıllı otomatik tamamlama nasıl elde edilir?


1
Bu soruyu biraz genişletmek güzel olurdu. Çok fazla potansiyel değeri var, ama şu anda soru sadece başlık.
Malabarba

İroni modu şu anda gitmenin yolu gibi görünüyor.
Sevki

Yanıtlar:


45

Yasal Uyarı: Ben ironi modunun yazarıyım

şirket ironi ekran görüntüsü

Akıllıca otomatik tamamlama yapmak istiyorsanız, ironi modunu firma ironisi ile tavsiye edebilirim .

  • MELPA sayesinde ironi modunun kurulumu kolaydır
  • tamamlama çok doğru ve performans oldukça iyi sayesinde libclang
  • şirket ironisi ile tamamlama biraz zaman alırsa, yolunuza çıkmayacak asenkron bir tamamlama geçmişine sahip olacaksınız
  • şirket-ironi aşırı fonksiyonları destekler ve Yasnippet'in kurulu olması durumunda, fonksiyon argümanları doldurmak için yer tutucu olarak eklenir.
  • projeniz Doxygen kullanıyorsa , tamamlama adayının kısa belgeleri minibuffer'da görüntülenir (ekran görüntüsüne bakın)
  • ironi modu sunucusunun Unix benzeri bir sisteme (Linux, OS X) kurulması kolay olmalıdır. Öte yandan, Windows biraz tweaking gerektirir, ancak wiki belgelenmiştir

Henüz alıntılanmamış bir başka araç emacs-ycmd'dir .


2
Çok teşekkür ederim! Ben erken öğrendim irony-mode
Luke

@GuillaumePapin İroniyi yazdığın için teşekkürler! Herhangi bir zamanlama kriterleri mevcut olur mu? clang_codeCompleteAtAyrıştırılmış bir TU ile yapılan aramaların (ancak kaydedilmemiş değişikliklerin) 3-5 saniye sürdüğünü fark ettim . Bundan irony-modedaha mı hızlı?
Pradhan

1
İroni libclang / clang_codeCompleteAt kullanır, böylece bundan daha iyi zamanlar elde edemezsiniz. İçeriğe bağlı olarak 3-5 saniye çok fazla olabilir (örneğin, küresel kapsamlardaki tamamlamalar diğer kapsamlardan daha fazla zaman alır). Son zamanlarda yaptığım bazı zamanlamalara bakabilirsiniz: github.com/Sarcasm/irony-mode/issues/131#issuecomment-60008803
Guillaume Papin

Gelecekteki okuyucular için İlgili: github.com/Sarcasm/irony-mode/issues/140
Sean Allred 20

İroni modu ve emacs-ycmd rolleri nasıl karşılaştırılır? Birbirlerine alternatifler mi? İkisini birden kullanmak mantıklı mıydı?
Praxeolitic

23

Rehberimi kontrol et . C / C ++ ile otomatik tamamlama için çeşitli yöntemler listeler.

Bu seçenekler:

  • İroni kullanmak . Şiddetle tavsiye edilir, çünkü Clang kullanır ve kurulumu diğer çözümlerle karşılaştırıldığında kolaydır.

  • Yerleşik ayrıştırıcıyı Emacs'tan kullanma. Alabileceğiniz en iyi otomatik tamamlama, Emacs ayrıştırıcısı Semantic içindendir, ancak Linux çekirdeği gibi büyük projelerde yavaş olacaktır.

  • Kullanımı company-modeile paketi company-clang. Clang'dan otomatik olarak yolları alabildiğinden, sistem yerel yolları için kod tamamlama cezası verir, ancak yerel proje için bazı yapılandırmalar yapmak zorundadır.

  • Kullanımı company-modeile company-gtags. GNU Global'den oluşturulan etiket veritabanını tamamlama olarak kullanır. Bunu, projenize yerel olarak eksiksiz kod sağlamak için kullanabilirsiniz. Oluşturulan veritabanındaki her şeyi size fırlattığı için tam olarak akıllı değildir.

  • rtagsCanlı analiz için bir sunucu sağlayarak daha da ileri gidiyor. Ancak, saf Elisp çözümü ile karşılaştırmak karmaşık bir işlemdir.


Rtags kurmanın saf emacs lisp çözümünden daha karmaşık olduğu konusunda hemfikir değilim. Saf emacs lisp çözümü genellikle cmake / build dosyalarını göz önünde bulundurmaz ve herhangi bir başlık bulamaz . Rtags karşılaştırmasıyla kurulumu oldukça kolaydır. Çok iyi bir test kapsamı olmayan, bir proje olarak hala biraz genç.
baol

Tuhdo'nun rehberine güzel bir ekleme: syamajala.github.io/c-ide.html
Victor,

9

RTags + Company ile çok başarılı oldum .

RTag'lerin rdmkod tamamlama, kod gezinme ve yeniden düzenleme için clang kullanan ayrı bir arka plan programı çalıştırması gerekir . rdmayrıca, sembollerin bir veritabanı olarak işlev görür, yani otomatik tamamlama doğrudan arama yapmaktan herhangi bir çözümden çok daha hızlıdır clang_codeCompleteAt.

Rdm bir güçlük olabilir projeleriniz için derleme bayrakları bilgi ihtiyacı, ancak tavsiye izlerseniz RTags sayfa ve sembolik bir link gcc-rtags-wrapper.shiçin gcc, g++, ccve c++rdm otomatik recompile yeni derleme bayraklarla güncellenir.


Sadece ironi modundan rtag'lere geçtim. İroni modu sürekli çöküyor ve yaklaşık 15 dakika sonra çalışmayı durduruyor. Rtags şu ana kadar oldukça iyi görünüyor ve yasnippet ile daha temiz bir entegrasyona sahip.
nenchev

6

1. Çözüm: şirket modu + clang

Tek sorun, şirket kipine projenizin c / c ++ başlık dosyalarını nerede arayacağınızı söylemeniz.

Cmake kullanıyorsanız, https://github.com/redguardtoo/cpputils-cmake'ın sizin için ayarları yapmasına izin verebilirsiniz (İPUCU: cpputils-cmake'nin yazarıyım).

VEYA

2. Çözüm: şirket modu + gnu global

Söyleyecek başka bir şey yok, başkalarının da söylediği gibi, etiketleri gnu global cli aracıyla oluşturmalısınız.


1

Rtags, flycheck, irony ve company-clang'ı yapılandırmak için cmake-ide kullanıyorum .

Artık derleme sisteminizi ve favori statik analiz emacs eklentilerinizi aynı anda yapılandırabilirsiniz !

EDIT: Şirket klanının aradığınız özellik olan otomatik tamamlamaları sağladığını unutmayın. cmake-ide, IDE'ye benzer birkaç özellik daha ekleyen köprü ve rtag'leri de yapılandırabilir.


1
Lütfen bunun C ++ otomatik tamamlamanın nasıl sağlanacağı sorusuna nasıl cevap verdiğini açıklayın.
Drew,

@Drew şirket clang tamamlama sağlar
AnimatedRNG

Lütfen cevabınıza yazınız. Teşekkür.
Drew

0

Mx semantik mod

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

&&

Etiketler Tablolar

Bul -ismi "*. [chCH]" -print | etags -

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

etags , ctags - Emacs, vi için etiket dosyası oluşturun

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

CMi (veya M-TAB) noktada tamamlama. Anlamsal mod etkinse, Anlamsal ayrıştırıcı verisini kullanmaya çalışır. Anlamsal mod devre dışı bırakılırsa veya başarısız olursa, seçilen etiketler tablosunu kullanarak tamamlamaya çalışır (bkz. Etiketler).

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

M-. (find-tag) etiket adı ister ve & tanımına atlar

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.