Jak uzyskać inteligentne automatyczne uzupełnianie w C ++?

43

Emacs nie może konkurować z innym IDE, jeśli nie ma funkcji automatycznego uzupełniania. Automatyczne uzupełnianie sprawia, że ​​jestem bardziej wydajnym programistą. Wiem o rozszerzeniu Auto Complete Mode , ale nie działa z C ++.

autouzupełnienie

Jak mogę osiągnąć inteligentne i wydajne autouzupełnianie w C ++?


To pytanie zostało pierwotnie zadane przez Malabarbę w sprawie propozycji Area 51: Jak uzyskać inteligentne autouzupełnianie w C ++?

Łukasz
źródło
1
Przydałoby się trochę rozwinąć to pytanie. Ma wiele potencjalnych wartości, ale w tej chwili pytanie jest tylko tytułem.
Malabarba
W tym momencie wydaje się, że można wybrać tryb ironii .
Sevki

Odpowiedzi:

45

Uwaga: Jestem autorem trybu ironii

zrzut ekranu ironia firmy

Jeśli chcesz tylko inteligentnego automatycznego uzupełniania, mogę polecić tryb ironii z ironią firmy .

  • Tryb ironii jest łatwy w instalacji dzięki MELPA
  • zakończenie jest bardzo dokładne i wydajność całkiem przyzwoite dzięki libclang
  • z ironią firmy masz asynchroniczne zaplecze ukończenia , które nie będzie przeszkadzało, jeśli ukończenie zajmie trochę czasu
  • ironia firmy obsługuje przeciążone funkcje, a jeśli masz zainstalowany Yasnippet, argumenty funkcji są wstawiane jako symbole zastępcze do wypełnienia
  • jeśli twój projekt używa Doxygen, krótka dokumentacja kandydata na ukończenie jest wyświetlana w minibuforze (patrz zrzut ekranu)
  • instalacja serwera w trybie ironii na systemie uniksowym (Linux, OS X) powinna być łatwa. Z drugiej strony Windows wymaga drobnych poprawek, ale jest to udokumentowane na wiki

Kolejnym narzędziem, które nie było jeszcze cytowane, jest emacs-ycmd .

Guillaume Papin
źródło
2
Dziękuję bardzo! Chciałbym dowiedzieć się wcześniejirony-mode
Luke
@GuillaumePapin Dzięki za pisanie ironii! Czy zdarzy ci się mieć jakieś testy porównawcze czasu? Zauważyłem, że wywołania clang_codeCompleteAtz przeanalizowaną JT (ale niezapisane zmiany) trwają 3-5 sekund. Czy jest irony-modeszybszy?
Pradhan
1
Irony używa libclang / clang_codeCompleteAt, więc nie znajdziesz lepszych czasów. 3-5 sekund może być za dużo w zależności od kontekstu (np. Ukończenie w globalnych zakresach zajmuje znacznie więcej czasu niż w innych zakresach). Możesz spojrzeć na niektóre czasy, które ostatnio zrobiłem: github.com/Sarcasm/irony-mode/issues/131#issuecomment-60008803
Guillaume Papin
Powiązane, dla przyszłych czytelników: github.com/Sarcasm/irony-mode/issues/140
Sean Allred
Jaka jest rola trybu ironii i emacsa-ycmda? Czy są dla siebie alternatywą? Czy kiedykolwiek miałoby sens korzystanie z obu?
Praxeolitic
23

Sprawdź mój przewodnik . Wymienia kilka metod automatycznego uzupełniania w C / C ++.

Te opcje to:

  • Korzystanie z ironii . Zdecydowanie zalecane, ponieważ wykorzystuje Clang i jest łatwy w konfiguracji w porównaniu z innymi rozwiązaniami.

  • Korzystanie z wbudowanego parsera Emacsa. Jest to najlepsze automatyczne uzupełnianie, jakie można uzyskać z poziomu parsera Emacsa, Semantic, ale byłoby to powolne w przypadku dużych projektów, takich jak jądro Linuksa.

  • Używanie company-modepakietu z company-clang. Zapewnia dobre uzupełnianie kodu dla ścieżek dołączania do systemu, ponieważ może on automatycznie pobierać ścieżki z Clanga, ale musi dokonać pewnej konfiguracji lokalnego projektu

  • Korzystanie company-modez company-gtags. Jako uzupełnienie wykorzystuje bazę danych znaczników wygenerowaną z GNU Global. Możesz użyć tego, aby dostarczyć kod kompletny lokalnie do twojego projektu. Nie jest do końca inteligentny, ponieważ rzuca ci wszystko w wygenerowanej bazie danych.

  • rtagsidzie dalej, zapewniając serwer do analizy na żywo. Ale konfiguracja jest skomplikowana w porównaniu z czystym rozwiązaniem Elisp.

Do zrobienia
źródło
Nie zgodziłbym się z tym, że konfigurowanie tagów rtag jest bardziej skomplikowane niż samo rozwiązanie emacs lisp. Rozwiązanie Pure Emacs Lisp zwykle nie bierze pod uwagę plików cmake / build i prawie nie jest w stanie znaleźć żadnego nagłówka. Rtags jest dość łatwy do skonfigurowania w porównaniu. Jest jeszcze trochę młody jak na projekt, z niezbyt dobrym zasięgiem testowym.
baol
Miły dodatek do przewodnika Tuhdo
Victor
9

Odniosłem wielki sukces w firmie RTags + Company .

RTags potrzebuje osobnego rdmdziałającego demona, który używa clang do uzupełniania kodu, nawigacji kodu i refaktoryzacji. rdmdziała również jako baza danych symboli, co oznacza, że ​​autouzupełnianie jest znacznie szybsze niż jakiekolwiek rozwiązanie wywołujące bezpośrednio clang_codeCompleteAt.

RDM potrzebuje informacji z flagami kompilacji dla projektów, które mogą być uciążliwe, ale jeśli się porady od RTags strony i podlinkowujemy gcc-rtags-wrapper.shdo gcc, g++, cci c++RDM automatycznie aktualizowany o nowe flagi kompilacja na ponownej kompilacji.

Mattias Bengtsson
źródło
Właśnie przeszedłem z trybu ironii na tagi. Tryb ironii ciągle się psuje i przestaje działać po około 15 minutach. Rtags wydaje się jak dotąd całkiem niezły i ma lepszą integrację z yasnippet.
nenchev
6

Rozwiązanie 1: tryb firmowy + brzęk

Jedynym problemem jest to, że musisz powiedzieć trybowi firmy, gdzie szukać plików nagłówkowych c / c ++ projektu.

Jeśli używasz cmake, możesz pozwolić https://github.com/redguardtoo/cpputils-cmake wykonać konfigurację dla Ciebie (WSKAZÓWKA: jestem autorem cpputils-cmake).

LUB

Rozwiązanie 2: tryb firmowy + globalny GNU

Nic więcej do powiedzenia: musisz budować tagi za pomocą globalnego narzędzia GNU, jak wspomnieli inni.

Chen Bin
źródło
1

Używam cmake-ide do konfigurowania tagów rtag, flycheck, ironii i clang firmy.

Teraz możesz jednocześnie skonfigurować system kompilacji i ulubione wtyczki emacs do analizy statycznej!

EDYCJA: Zauważ, że klang firmowy zapewnia automatyczne uzupełnianie, którego szukałeś. cmake-ide może również skonfigurować flycheck i rtags, co dodaje kilka dodatkowych funkcji podobnych do IDE.

AnimatedRNG
źródło
1
Wyjaśnij, jak to odpowiada na pytanie, jak uzyskać autouzupełnianie w C ++.
Drew
@Drew company-clang zapewnia uzupełnienia
AnimatedRNG
Proszę podać to w swojej odpowiedzi. Dzięki.
Drew
0

Tryb semantyczny MX

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

I &

Tagi Tabele

odnaleźć . -nazwa „*. [chCH]” -print | etags -

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

etags , ctags - generuj plik znaczników dla Emacsa, vi

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

Zakończenie CMi (lub M-TAB) w punkcie. Jeśli włączony jest tryb semantyczny, próbuje użyć danych parsera semantycznego. Jeśli tryb semantyczny jest wyłączony lub kończy się niepowodzeniem, próbuje zakończyć przy użyciu tabeli wybranych tagów (patrz Tagi)

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

M- (find-tag) monituje o nazwę tagu i przejście do definicji

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

alexcham
źródło