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.
Jaka jest różnica (np pod względem funkcji) między
etags
,ebrowse
,exuberant ctags
,cscope
,GNU Global
iGTags
? Co muszę zrobić, aby używać ich w Emacsie ?Czy potrzebuję semantycznego / senatora (CEDET), jeśli chcę używać tagów do nawigacji / autouzupełniania symboli?
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?
emacs
cscope
cedet
gnu-global
Amelio Vazquez-Reina
źródło
źródło
GTags
projekt, z którym się łączyłeś, jest dość martwy. Jeśli ktoś o tym mówigtags
, prawdopodobnie odnosi się do GNU Global.Odpowiedzi:
To dobre pytanie, które niedawno przeczytałem tutaj, więc spróbuję wyjaśnić różnicę bardziej szczegółowo:
Punkt 1:
etags
ictags
oba 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ąctags
był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.cscope
jest 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:
ctags
one pozwala na nawigację do deklaracji / definicji symboli (co niektórzy nazywają wyszukiwaniem jednokierunkowym ).ctags
to narzędzie ogólnego przeznaczenia, przydatne w wielu językach.Z drugiej strony (jak wspomniano na stronie projektu)
cscope
pozwala na:W tym momencie nie powinno nikogo dziwić, że kiedy zajmuję się projektami C / C ++, robię duży użytek z nich
cscope
i 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:
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
etags
icscope
, 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
global
iebrowse
, ale jeśli pamięć mi służy, skorzystali z etagów.źródło
cscope
w Emacs? Czytałem o tymxcscope.el
na EmacsWiki tutaj, ale nie mogłem znaleźć odnośnika do pliku. Ponadto, którego.el
pliku używasz do pobraniacscope
z Emacsem?xcscope.el
znajduje się wcscope/contrib/xcscope/
(to jest w pakiecie dystrybucyjnym). Tego właśnie używam.semantic
porównaniu zcscope
? Jeśli chodzi o nawigację po kodzie źródłowym, czy semantyczne zapewniają jakąkolwiek funkcjonalność, która jejcscope
nie ma? Czy używasz obu?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?Spróbuję dodać kilka wyjaśnień do 1.
Co to jest?
Porównanie
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:
Stosowanie:
(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.
Dzięki tym kombinacjom możesz użyć cscope dla 41 języków.
Powodzenia!
źródło
Pliki TAGS zawierają definicje
TAGS
Plik zawiera listę funkcji i klas, gdzie są zdefiniowane. Zwykle jest umieszczany w katalogu głównym projektu i wygląda następująco:Dzięki temu Emacs może znaleźć definicje. Podstawowa nawigacja jest wbudowana
find-tag
, aleetags-select
zapewnia ł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
etags
ictags
. Emacsctags
ma takietags
sam interfejs CLI, jak uniwersalne ctagi. Aby uniknąć nieporozumień, wiele dystrybucji zmienia nazwy tych programów (np. Wctags.emacs24
Debianie).Istnieją również narzędzia specyficzne dla języka do generowania plików TAGS, takie jak
jsctags
ihasktags
.Inne formaty plików
ebrowse
to program w C dostarczany z Emacsem. Indeksuje kod C / C ++ i generujeBROWSE
plik. ebrowse.el zapewnia typową definicję i zakończenie wyszukiwania. Możesz także otworzyćBROWSE
plik 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
,GRTAGS
iGPATH
pliku. Możesz wygenerować te pliki za pomocągtags
polecenia, 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.
źródło
[odpowiedź zaktualizowana z shigio ]
Spróbuję dodać kilka wyjaśnień do części pierwszej pytania.
Co to jest?
TAGS
plik, który jest formatem pliku znaczników dla Emacsa . Możesz użyć pliku Etags,etags.el
który jest częścią Emacsa.Ctags
to ogólny termin określający wszystko, co może wygenerowaćtags
plik, co jest rodzimym formatem pliku znaczników dla Vi. Universal Ctags (UCtags
dawniej Exuberant Ctags) może również generować etykiety Etag z tą-e
opcją.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 .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
grep
podobną wyszukiwarkę.less
(pager), Doxygen i dowolnej przeglądarki internetowej.gtags.el
za 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 :
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!
źródło
--with-exuberant-ctags=...
gdy teraz od 2019 jest--with-universal-ctags
opcja. Czy należy to zmienić na to drugie?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:
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.
źródło