Tagi dla Emacsa: Związek między etagami, ebrowse, cscope, GNU Global i żywiołowymi tagami

102

Pracuję nad projektami C ++ i przeczytałem przewodnik Alexa Otta po CEDET i inne wątki dotyczące tagów w StackOverflow, ale nadal nie wiem, jak Emacs łączy się z tymi różnymi systemami tagów, aby ułatwić autouzupełnianie, wyszukiwanie definicji, nawigację po źródłach baza kodu lub podgląd ciągów dokumentów.

  1. Jaka jest różnica (np pod względem funkcji) między etags, ebrowse, exuberant ctags, cscope, GNU Globali GTags? Co muszę zrobić, aby używać ich w Emacsie ?

  2. Czy potrzebuję semantycznego / senatora (CEDET), jeśli chcę używać tagów do nawigacji / autouzupełniania symboli?

  3. Co semantyczne wnosi do tabeli oprócz tych różnych narzędzi do tagów? W jaki sposób współpracuje z tymi narzędziami?

Amelio Vazquez-Reina
źródło
2
Sądząc po pniu , GTagsprojekt, z którym się łączyłeś, jest dość martwy. Jeśli ktoś o tym mówi gtags, prawdopodobnie odnosi się do GNU Global.
Gordon Gustafson

Odpowiedzi:

71

To dobre pytanie, które niedawno przeczytałem tutaj, więc spróbuję wyjaśnić różnicę bardziej szczegółowo:

Punkt 1:

etagsi ctagsoba generują plik indeksu (inaczej tag / TAGS) obiektów językowych znalezionych w plikach źródłowych, który umożliwia szybkie i łatwe zlokalizowanie tych elementów za pomocą edytora tekstu lub innego narzędzia. Znacznik oznacza obiekt języka, dla którego dostępna jest pozycja indeksu (lub, alternatywnie, pozycja indeksu utworzona dla tego obiektu). Tagi generowane przez ctagi są bogatsze pod względem metadanych, ale Emacs i tak nie może zinterpretować dodatkowych danych, więc należy je traktować mniej więcej tak samo (główną zaletą ctagsbyłoby wsparcie dla większej liczby języków). Głównym zastosowaniem plików tagów jest wyszukiwanie klas / metod / funkcji / stałych / etc deklaracji / definicji.

cscopejest znacznie potężniejszą bestią (przynajmniej jeśli chodzi o C / C ++ i Javę). Chociaż działa na mniej więcej tej samej zasadzie (generowanie pliku przydatnych metadanych), pozwala na zrobienie bardziej wyszukanych rzeczy, takich jak znalezienie wszystkich odniesień do symbolu, sprawdzenie, gdzie wywoływana jest funkcja itp. (Możesz również znaleźć definicje) .

Podsumowując:

ctagsone pozwala na nawigację do deklaracji / definicji symboli (co niektórzy nazywają wyszukiwaniem jednokierunkowym ). ctagsto narzędzie ogólnego przeznaczenia, przydatne w wielu językach.

Z drugiej strony (jak wspomniano na stronie projektu) cscopepozwala na:

  • Przejdź do deklaracji symbolu
  • Pokaż listę wszystkich odniesień do symbolu, którą można wybrać
  • Wyszukaj dowolną definicję globalną
  • Funkcje wywoływane przez funkcję
  • Funkcje wywołujące funkcję
  • Wyszukaj ciąg tekstowy
  • Wyszukaj wzorzec wyrażenia regularnego
  • Znajdź plik
  • Znajdź wszystkie pliki, w tym plik

W tym momencie nie powinno nikogo dziwić, że kiedy zajmuję się projektami C / C ++, robię duży użytek z nich cscopei bardzo się nimi nie przejmuję ctags. W przypadku innych języków sytuacja byłaby oczywiście odwrotna.

Punkt 2.

Aby mieć inteligentne autouzupełnianie, potrzebujesz prawdziwego parsera kodu źródłowego (takiego jak semantyczny), w przeciwnym razie nie będziesz znać typów obiektów (na przykład) w swoich aplikacjach i metod, które można na nich wywołać. Możesz mieć autouzupełnianie oparte na wielu różnych źródłach, ale aby uzyskać najlepsze wyniki, ostatecznie będziesz potrzebować parsera. To samo dotyczy podświetlania składni - obecnie podświetlanie składni w głównych trybach Emacsa opiera się po prostu na wyrażeniach regularnych i jest bardzo delikatne i podatne na błędy. Miejmy nadzieję, że wraz z włączeniem semantyki do Emacsa 23.2 (wcześniej był to pakiet zewnętrzny) zaczniemy widzieć więcej zastosowań (takich jak użycie go do analizy kodu źródłowego bufora, aby odpowiednio go podświetlić)

Od Emacsa 24.1 semantyczna jest używana z frameworka uzupełniania Emacsa. Najłatwiejszym sposobem przetestowania tego jest otwarcie pliku z kodem źródłowym C i wpisanie M-TABlub C-M-ii obserwowanie, jak semantycznie automagicznie się kończy. W przypadku języków, w których semantyka nie jest domyślnie włączona, możesz dodać następujący wiersz do wybranego zaczepu trybu głównego:

(add-to-list 'completion-at-point-functions 'semantic-completion-at-point-function)

Punkt 3.

semantyczny zapewnia prawdziwą świadomość kodu (dla kilku języków, które obecnie obsługuje) i wypełnia lukę między IDE i Emacs. Tak naprawdę nie współpracuje z narzędziami takimi jak etagsi cscope, ale nie oznacza to, że nie można ich używać razem.

Mam nadzieję, że moje wyjaśnienia mają sens i będą dla ciebie przydatne.

PS Nie jestem do końca zaznajomiony z globali ebrowse, ale jeśli pamięć mi służy, skorzystali z etagów.

Bozhidar Batsov
źródło
1
To jest świetne. Dzięki! Czy wiesz, jak mogę używać cscopew Emacs? Czytałem o tym xcscope.elna EmacsWiki tutaj, ale nie mogłem znaleźć odnośnika do pliku. Ponadto, którego .elpliku używasz do pobrania cscopez Emacsem?
Amelio Vazquez-Reina,
1
xcscope.elznajduje się w cscope/contrib/xcscope/(to jest w pakiecie dystrybucyjnym). Tego właśnie używam.
Bozhidar Batsov
Jeszcze jedno pytanie: jak wypada w semanticporównaniu z cscope? Jeśli chodzi o nawigację po kodzie źródłowym, czy semantyczne zapewniają jakąkolwiek funkcjonalność, która jej cscopenie ma? Czy używasz obu?
Amelio Vazquez-Reina,
4
Przy okazji, nie wierzę, że GNU Global używa etagów. IIRC utrzymuje i przeszukuje „właściwą” bazę danych (zamiast skanować zwykły plik tekstowy), co ma wiele zalet w zakresie wydajności, zarówno w przypadku zapytań, jak i (szczególnie) aktualizacji tagów.
phils
@BozhidarBatsov Kiedy powiedziałeś For languages where semantic is not enabled by default, you can add the following line to your major mode hook of choice ... <code>. Co dokładnie robi ten fragment kodu?
Amelio Vazquez-Reina
45

Spróbuję dodać kilka wyjaśnień do 1.

Co to jest?

  • Etags to polecenie generujące plik TAGS, który jest plikiem tagów dla Emacsa. Możesz użyć tego pliku z etags.el, który jest częścią pakietu emacsa.
  • Ctags to polecenie generujące plik „tagów”, który jest plikiem tagów dla vi. Teraz Exuberant Ctags może generować plik 'TAGS' za pomocą opcji -e i obsługiwać 41 języków programowania.
  • Cscope to wszechstronne narzędzie do przeglądania kodu źródłowego w języku C. Posiada własne dobre CUI (interfejs znakowy użytkownika) i bazy danych tagów (cscope.in.out, cscope.out, cscope.po.out). Możesz użyć cscope z Emacsa używając xcscope.el, który jest częścią pakietu cscope.
  • GNU GLOBAL to system znakowania kodu źródłowego. Chociaż jest podobny do powyższych narzędzi, różni się od nich tym, że jest zależny od dowolnego edytora i nie ma interfejsu użytkownika poza wierszem poleceń. Gtags to polecenie do generowania plików tagów dla GLOBAL (GTAGS, GRTAGS, GPATH). Możesz używać GLOBAL z emacsa używając gtags.el, który jest częścią pakietu GLOBAL. Oprócz tego istnieje dla niego wiele bibliotek elisp (xgtags.el, ggtags.el, cokolwiek-gtags.el, helm-gtags.el itp.).

Porównanie

  • Ctagi i etagi dotyczą tylko definicji. Cscope i GNU GLOBAL traktują nie tylko definicje, ale także odniesienia.
  • Ctagi i etagi używają płaskiego pliku znaczników tekstowych. Cscope i GNU GLOBAL używają baz danych tagów klucz-wartość.
  • Cscope i GNU GLOBAL mają wyszukiwarkę podobną do grepa i możliwość przyrostowej aktualizacji plików tagów.

Połączenie

Możesz połączyć obsługę bogatych języków Exuberant Ctags i bazę danych GNU GLOBAL, używając ctags jako wtyczki parsera GLOBAL.

Spróbuj wykonać następujące czynności: (wymaga odpowiednio GLOBAL-6.0, Exuberant Ctags-5.5 lub nowszego)

Budowanie GNU GLOBAL:

$ ./configure --with-exuberant-ctags=/usr/local/bin/ctags
$ sudo make install

Stosowanie:

$ export GTAGSCONF=/usr/local/share/gtags/gtags.conf
$ export GTAGSLABEL=ctags
$ gtags                     # invokes Exuberant Ctags internally
$ emacs -f gtags-mode       # load gtags.el

(Nie można jednak traktować odwołań tą metodą, ponieważ ctagi nie traktują odwołań).

Możesz także użyć cscope jako klienta GNU GLOBAL. Pakiet GLOBAL zawiera polecenie o nazwie „gtags-cscope”, które jest portem cscope, to znaczy jest samym cscope z tym wyjątkiem, że używa GLOBAL jako wyszukiwarki zamiast cscope.

$ gtags-cscope          # this is GLOBAL version of cscope

Dzięki tym kombinacjom możesz użyć cscope dla 41 języków.

Powodzenia!

shigio
źródło
1
Dla użytkowników Debiana i pochodnych, takich jak Ubuntu: Strona internetowa GNU GLOBAL ostrzega, że ​​pakiety .deb dostarczane z tymi dystrybucjami Linuksa są przestarzałe i nie powinny być używane. W moim przypadku GLOBAL był w wersji 5.7.1 i nie mogłem sprawić, by gtags.el, ggtags.el lub helm-gtags.el działały poprawnie na Emacs 24. Kompilowanie GNU GLOBAL 6.5 od podstaw, z obsługą Exuberant Ctags ( Użyłem 5,8). (Dzięki za doskonałe wskazówki, @shigio).
Rob
9

Pliki TAGS zawierają definicje

TAGSPlik zawiera listę funkcji i klas, gdzie są zdefiniowane. Zwykle jest umieszczany w katalogu głównym projektu i wygląda następująco:

^L
configure,3945
as_fn_success () { as_fn_return 0; }^?as_fn_success^A180,5465
as_fn_failure () { as_fn_return 1; }^?as_fn_failure^A181,5502
as_fn_ret_success () { return 0; }^?as_fn_ret_success^A182,5539
as_fn_ret_failure () { return 1; }^?as_fn_ret_failure^A183,5574

Dzięki temu Emacs może znaleźć definicje. Podstawowa nawigacja jest wbudowana find-tag, ale etags-selectzapewnia ładniejszy interfejs użytkownika w przypadku wielu dopasowań.

Możesz również użyć plików TAGS do uzupełniania kodu. Na przykład zaplecze etags firmy używa plików TAGS .

Pliki TAGS można tworzyć za pomocą różnych narzędzi

ctags(wcześniej znane jako „uniwersalne tagi” lub „żywiołowe znaczniki”) mogą generować pliki TAGS i obsługują najszerszy zakres języków. Jest aktywnie utrzymywany na githubie.

Emacs jest dostarczany z dwoma programami, które generują pliki TAGS, o nazwie etagsi ctags. Emacs ctagsma taki etagssam interfejs CLI, jak uniwersalne ctagi. Aby uniknąć nieporozumień, wiele dystrybucji zmienia nazwy tych programów (np. W ctags.emacs24Debianie).

Istnieją również narzędzia specyficzne dla języka do generowania plików TAGS, takie jak jsctagsi hasktags.

Inne formaty plików

ebrowseto program w C dostarczany z Emacsem. Indeksuje kod C / C ++ i generuje BROWSEplik. ebrowse.el zapewnia typową definicję i zakończenie wyszukiwania. Możesz także otworzyć BROWSEplik bezpośrednio w Emacsie, aby uzyskać przegląd klas / funkcji zdefiniowanych w bazie kodu.

GNU Globalny ma swój własny format bazy danych, która składa się z GTAGS, GRTAGSi GPATHpliku. Możesz wygenerować te pliki za pomocą gtagspolecenia, które analizuje kod C / C ++. W przypadku innych języków GNU Global może czytać pliki generowane przez uniwersalne ctagi.

GNU Global zapewnia również interfejs CLI do zadawania bardziej wyrafinowanych pytań, takich jak „gdzie wspomniany jest ten symbol?”. Jest dostarczany z pakietem Emacsa gtags.el, ale ggtags.el jest również popularny do uzyskiwania dostępu do baz danych GNU Global.

Cscope jest podobny w duchu do GNU Global: przetwarza C / C ++ do własnego formatu bazy danych. Może także odpowiadać na pytania typu „znajdź wszystkich dzwoniących / dzwoniących do tej funkcji”.

Zobacz także tę dyskusję HN porównującą globalne i cscope .

Projekty klient / serwer

rtags analizuje i indeksuje C / C ++ przy użyciu trwałego serwera. Używa parsera clang, więc bardzo dobrze radzi sobie z C ++. Jest dostarczany z pakietem Emacsa do wysyłania zapytań do serwera.

google-gtags to projekt, w którym duży plik TAGS był przechowywany na serwerze. Kiedy odpytywałeś serwer, dostarczył podzbiór pliku TAGS, który był odpowiedni dla twojego wyszukiwania.

Semantyczny (CEDET)

Semantic to wbudowany pakiet Emacsa, który zawiera parser dla C / C ++, więc może również znaleźć definicje. Może również importować dane z plików TAGS, baz danych csope i innych źródeł. CEDET zawiera również funkcjonalność w stylu IDE, która wykorzystuje te dane, np. Generowanie diagramów UML hierarchii klas.

Wilfred Hughes
źródło
7

[odpowiedź zaktualizowana z shigio ]

Spróbuję dodać kilka wyjaśnień do części pierwszej pytania.

Co to jest?

  1. Etags generuje TAGSplik, który jest formatem pliku znaczników dla Emacsa . Możesz użyć pliku Etags, etags.elktóry jest częścią Emacsa.
  2. Ctagsto ogólny termin określający wszystko, co może wygenerować tagsplik, co jest rodzimym formatem pliku znaczników dla Vi. Universal Ctags ( UCtagsdawniej Exuberant Ctags) może również generować etykiety Etag z tą -eopcją.
  3. Cscope to narzędzie kod źródłowy przeglądanie all-in-one dla C (z mniejszym wsparciem dla C ++ i Java), z własnych baz danych znaczników ( cscope.in.out, cscope.out, cscope.po.out) oraz TUI . Obsługa Cscope jest wbudowana w Vim; możesz użyć Cscope z Emacsa używając pakietu xcscope.el . Istnieją również GUI oparte na Cscope .
  4. GNU GLOBAL (aka Gtags) to kolejny system znakowania kodu źródłowego (z istotnymi różnicami - zobacz następną sekcję), ponieważ generuje również pliki znaczników.

Porównanie

  • Ctags i Etags traktują tylko definicje (np. Zmiennych i funkcji). Cscope i Gtags również traktują odniesienia.
  • Pliki tagów Ctags i Etags są płaskie . Pliki tagów Cscope i Gtags to potężniejsze bazy danych klucz-wartość , które umożliwiają (np.) Aktualizację przyrostową.
  • Cscope i Gtags mają greppodobną wyszukiwarkę.
  • Ctags ma wbudowaną obsługę większej liczby języków i formatów danych: zobacz aktualną listę parserów Universal Ctags w repozytorium . UCtags również udokumentował, jak stworzyć własny parser .
  • Cscope i Gtags są niezależne od edytora.
  • Gtags nie zapewnia własnego interfejsu użytkownika, ale obecnie (październik 2016 r.) Może być używany z wiersza poleceń (CLI), Emacsa i krewnych, Vi i krewnych, less(pager), Doxygen i dowolnej przeglądarki internetowej.
  • Gtags dostarcza gtags.elza pośrednictwem pakietu GLOBAL, ale istnieje również wiele innych rozszerzeń elisp, w tym xgtags.el, ggtags.el, cokolwiek-gtags.el, helm-gtags.el.

Połączenie

Możesz połączyć obsługę bogatych języków Universal Ctags z bazą danych Gtags i licznymi rozszerzeniami, używając Ctags jako globalnego parsera wtyczki :

# build GNU GLOBAL
./configure --with-exuberant-ctags=/usr/local/bin/ctags
sudo make install

# use it
export GTAGSCONF=/usr/local/share/gtags/gtags.conf
export GTAGSLABEL=ctags
gtags                     # invokes Universal Ctags internally
emacs -f gtags-mode       # load gtags.el

Zwróć uwagę, że jeśli użyjesz Ctags jako parsera dla swoich Gtagów, stracisz możliwość traktowania referencji (np. Użycie zmiennych, wywołania funkcji), które w innym przypadku zapewniłyby Gtagi. Zasadniczo, zamieniasz śledzenie referencji Gtagów na lepszą wbudowaną obsługę języka Ctags.

Można również użyć Cscope jako klient Gtags: gtags-cscope.

Powodzenia!

TomRoche
źródło
Czytałem: „Zwróć uwagę, że jeśli użyjesz Ctags jako parsera dla swoich Gtagów, stracisz możliwość traktowania referencji (np. Użycia zmiennych, wywołań funkcji), które w innym przypadku zapewniłyby Gtagi. Zasadniczo, zamieniasz śledzenie referencji Gtagów na Większa wbudowana obsługa języków Ctags ”. Czy to prawda w przypadku starych tagów ctag dostarczanych z Emacsem, czy nadal jest to prawdą w przypadku Universal Ctags? Przeczytałem również „połącz bogaty język Universal Ctag”, ale we fragmencie powłoki, którego używa, --with-exuberant-ctags=...gdy teraz od 2019 jest --with-universal-ctagsopcja. Czy należy to zmienić na to drugie?
bgoodr
3

Właściwie nie sprawdzałem, ale zgodnie z podręcznikiem CEDET ( http://www.randomsample.de/cedetdocs/common/cedet/CScope.html ):

semantyczny może używać CScope jako zaplecza do przeszukiwania baz danych. Aby to włączyć, użyj:

 (semanticdb-enable-cscope-databases)

Umożliwi to użycie cscope dla wszystkich buforów C i C ++.

CScope będzie następnie używany do wyszukiwania w całym projekcie jako kopia zapasowa, gdy wcześniejsze wyszukiwania semantycznej bazy danych mogły nie przeanalizować wszystkich plików.

Clément B.
źródło
1
Wydaje się, że to nie działa w Emacs 24.3.1, używając waniliowego CEDET 2.0, który jest z nim dostarczany (brak metody semanticdb-enable-cscope-databases).
Rob