Jak uzyskać uzupełnianie kodu w emacsie?

20

Wiem, że emacs obsługuje uzupełnianie kodu. Ale szczerze mówiąc, nigdy nie byłem dobrym czytelnikiem FAQ, przynajmniej jeśli chodzi o coś, czym jestem zupełnie nowy. Zastanawiam się więc, co muszę pobrać i jak to zrobić, aby emacs mógł wykonać dla mnie inteligentne uzupełnienie kodu w C ++ i Javie. A może jest jakiś pakiet uzupełniający kod dla wielu głównych języków?

gwiezdna kukurydza
źródło

Odpowiedzi:

27

Podstawowym sposobem działania dowolnego bufora w emacsie jest dynamiczny skrót używany przez naciśnięcie M-/(aka alt+ /)

Spowoduje to rozwinięcie tekstu w celu zduplikowania innych ciągów już istniejących w bieżącym buforze lub w innych aktualnie otwartych buforach.

Aby uzyskać bardziej rozbudowane uzupełnianie kodu, które jest specyficzne dla języka C ++ lub Java (lub innych), warto przyjrzeć się szablonowi kodu lub pakietowi fragmentów. Niektóre są omówione w tym powiązanym pytaniu na StackOverflow. Jednym z najczęściej wymienianych w tych dyskusjach jest yasnippet - w tym poście na blogu emacs znajduje się demo screencastu .

Doug Harris
źródło
+1. Możesz także complete.elwypróbować standardową bibliotekę . Jest bardzo stary i mało znany, ale rodzaj uzupełniania w buforze może być użyteczny. M-x find-library complete, a następnie przeczytaj komentarz w pliku.
Drew,
21

Odpowiedź @ Douga jest trochę nieaktualna, a jego celem jest ekspansja kodu za pomocą wstępnie zdefiniowanych fragmentów.

Myślę, że pytanie OP dotyczy inteligencji (na przykład nazwa autouzupełniania metody klasy).

  1. Kiedyś popularny był hipis , analizator składni to tagi emacs . Obsługuje więc wszystkie języki, które obsługuje ctags (w tym C ++, Java). Ale wynik nie jest doskonały, ponieważ ctags używa tylko wyrażenia regularnego do analizy kodu. Zobacz mój init-hippie-expand.el, aby uzyskać szczegółowe informacje. Możesz zacząć od sprawdzenia wartościhippie-expand-try-functions-list

  2. auto-complete to nowoczesny z fantazyjnym interfejsem użytkownika (menu rozwijane, nawet w oknie konsoli). Jeśli używasz clang jako backendu. Intellisense jest znacznie lepszy. Aby uruchomić clang, musisz zainstalować auto-complete-clang, który jest wtyczką auto-complete. Obsługuje tylko obsługę języka clang (C / C ++ / Obj-C). Jak zauważył Sylvain Benner , możesz używać emacs-eclim jako zaplecza parsowania java, które faktycznie wywołuje plik wykonywalny eclipse. Tak więc autouzupełnianie może obsługiwać java. Zobacz mój init-auto-complete.el, aby uzyskać szczegółowe informacje.

  3. semantic zapewnia zarówno interfejs użytkownika, jak i silnik analizujący zaplecza. Jest wolny Rozwijany interfejs użytkownika jest OK, ale wymaga okna X. Wynik Intellisense jest lepszy niż ctags. A dokumentacja jest dla mnie zbyt maniakalna. Zobacz init-semantic.el, aby uzyskać szczegółowe informacje.

  4. tryb firmowy jest podobny do autouzupełniania, z tą różnicą, że pakuje wszystko w jeden pakiet. Na przykład programiści C ++ potrzebują tylko zainstalować tryb firmowy (automatyczne uzupełnianie wymaga wtyczki innej firmy). Kolejną różnicą UI jest firma pokaże kandydata automatycznie . Więc naciskasz mniej klawiszy w towarzystwie. To samo można zrobić w autouzupełnianiu po dostosowaniu.

Podsumowując, auto-uzupełnianie, firma są najpopularniejszymi dwoma opcjami. Mile widziane są również semantyczne i hippie-rozwijane, ale rzadziej używane. Inne są zbyt trywialne, aby je wymienić, a ich funkcje są już uwzględnione w wielkiej czwórce. Na przykład funkcja autouzupełniania może używać yasnippet jako źródła danych wejściowych (autouzupełnianie zapewnia interfejs użytkownika, ale faktyczni kandydaci są wytwarzani przez zaplecze yasnippet).

Sugeruję użycie albo autouzupełniania, albo firmy jako głównej wtyczki do uzupełniania kodu oraz semantycznej lub hipisowskiej jako dodatkowej wtyczki .

Używam trybu firmowego i rozwijania hipisów, ponieważ,

  • Teraz (rok 2017) tryb firmowy jest aktywniej utrzymywany niż autouzupełnianie i ma więcej wtyczek innych firm (na przykład wtyczki lateksowej)

  • hippie-expand nie jest bardzo aktywny, ale nie zajmuje TABklucza, którego używa tryb firmowy / semantyczny / auto-uzupełnianie

Jeśli używasz trybu firmowego dla C ++ / Java, możesz chcieć zmodyfikować company-backends.

Kilka dodatkowych wskazówek na temat trybu firmowego,

Może być konieczne dostosowanie wartości company-backends. Załóżmy na przykład, że jego wartość to (company-eclim company-semantic company-clang (company-dabbrev-code company-gtags company-etags company-keywords)). Wtedy, jeśli company-eclimmożna uzyskać niezerowe kandydaci, companymyśli , że piszesz java, więc NIE będzie później działał company-eclim.

Teraz spójrzmy (company-dabbrev-code company-gtags company-etags company-keywords). Wszystkie te cztery backendy będą używane razem. Na przykład, nawet po company-dabbrev-codepomyślnym pobraniu niezerowych kandydatów, pozostałe trzy backendy są nadal wykonywane.

W prawdziwym świecie często konieczne jest ponowne dostosowanie kolejności backendów lub dodanie nowego backendu ( company-rtagsna przykład).

Chen Bin
źródło
który jest najlepszy pakiet autouzupełniania w Emacs 24 dla lateksu?
doktorat
@doctorate Myślę, że potrzebujesz autouzupełniania i jego źródła emacswiki.org/emacs/AutoCompleteSources , ale jestem programistą zamiast użytkownika lateksu, więc lepiej sprawdź dwukrotnie w społeczności Google plus Emacs, tam jest wielu akademików .
chen bin
Uwaga: tryb firmowy obsługuje również lateks. Proponuję więc towarzystwo zamiast autouzupełniania
chen bin
2

Krótka odpowiedź: nie znam żadnego dla emacsa, który byłby użyteczny w Javie. Dynamiczne rozwijanie nie dba o biblioteki na ścieżce klasy, nie wie nic o kodzie, który wpisujesz, może rozwinąć tylko do tekstu, który już istnieje w jednym z buforów. JDE i emacs-eclim starają się zapewnić tę funkcjonalność, ale osobiście nie byłem pod wrażeniem.

brak e-maila
źródło
0

Krótka odpowiedź: M-/

Długa odpowiedź: RTFM :-)

Gyom
źródło
6
+1,
Boże
@rownage: oh, to jest `` info-emacs-manual '' ( C-h r)
SamB
1
Jak o C-h k M-/?
Doug Harris