cscope lub ctags, dlaczego warto wybierać jeden z nich? [Zamknięte]

132

Używam przede wszystkim vim / gvim jako edytora i szukam kombinacji lxr (Linux Cross Reference) i cscope lub ctags do eksploracji źródła jądra. Jednak nigdy nie użyłem ani cscope, ani ctags i chciałbym usłyszeć, dlaczego można wybrać jeden z nich, biorąc pod uwagę moje użycie vima jako głównego edytora.

Robert S. Barnes
źródło

Odpowiedzi:

159

ctags udostępnia dwie funkcje: umożliwianie przeskakiwania od wywołań funkcji do ich definicji oraz uzupełnianie omni. Pierwsza oznacza, że ​​kiedy jesteś nad wywołaniem metody, uderzasz g]lub CTRL-]przeskoczysz do miejsca, w którym ta metoda jest zdefiniowana lub zaimplementowana. Druga funkcja oznacza, że ​​po wpisaniu foo.lub foo->, jeśli foo jest strukturą, zostanie wyświetlone wyskakujące menu z uzupełnieniem pól.

cscope ma również pierwszą funkcję - używanie set cscopetag- ale nie ostatnią. Jednak cscope dodatkowo dodaje możliwość przeskoczenia w dowolne miejsce, w którym wywoływana jest również funkcja.

Więc jeśli chodzi o przeskakiwanie po bazie kodu, ctagi zawsze prowadzą do miejsca, w którym funkcja jest zaimplementowana, podczas gdy cscope może również pokazać, gdzie wywoływana jest funkcja.

Dlaczego miałbyś wybrać jedną z nich? Cóż, używam obu. ctagi są łatwiejsze do skonfigurowania, szybsze do uruchomienia, a jeśli zależy Ci tylko na skakaniu w jedną stronę, pokaże mniej linii. Możesz po prostu biegać :!ctags -R .i g]po prostu działa. Umożliwia również tę wszechobecną całość.

Cscope świetnie sprawdza się w przypadku większych, nieznanych baz kodu. Konfiguracja jest uciążliwa, ponieważ cscope potrzebuje pliku zawierającego listę nazw plików do przeanalizowania. Również w vimie domyślnie nie ma ustawionych przypisań klawiszy - musisz uruchomić :cscope blah blahręcznie.

Aby rozwiązać pierwszy problem, mam skrypt bash, cscope_gen.shktóry wygląda następująco:

#!/bin/sh
find . -name '*.py' \
-o -name '*.java' \
-o -iname '*.[CH]' \
-o -name '*.cpp' \
-o -name '*.cc' \
-o -name '*.hpp'  \
> cscope.files

# -b: just build
# -q: create inverted index
cscope -b -q

Wyszukuje kod, który mnie interesuje, tworzy listę cscope.files i tworzy bazę danych. W ten sposób mogę uruchomić ":! Cscope_gen.sh" zamiast zapamiętywać wszystkie kroki konfiguracji.

Mapuję wyszukiwanie cscope na ctrl-space x 2 za pomocą tego fragmentu kodu, który łagodzi drugi dół cscope:

nmap <C-@><C-@> :cs find s <C-R>=expand("<cword>")<CR><CR>

Jest taka wtyczka cscope_maps.vim, która tworzy kilka podobnych powiązań. Nigdy nie pamiętam, co oznaczają wszystkie opcje, więc staram się trzymać ctrl-space.

Podsumowując: ctagi są łatwiejsze do skonfigurowania i przeważnie działają bez robienia zbyt wiele, jest również niezbędne dla omni-complete. cscope zapewnia więcej funkcji, jeśli musisz utrzymywać dużą i w większości nieznaną bazę kodu, ale wymaga więcej pracy nóg.

richq
źródło
2
Czy jest jakiś sposób, aby zwiększyć dokładność ctagów? Zrobiłem to make tagsw katalogu głównym jądra i bawiłem się skakaniem i przez większość czasu trafiam w niewłaściwe miejsce. Czytałem, że ctags ma problemy z preprocesorem c, ale biorąc pod uwagę, że ctags jest używany w lxr, oczywiście musi być coś, co można zrobić.
Robert S. Barnes
2
Jeśli istnieje głębokie makro voodoo, to ctagi prawdopodobnie nie powiodą się :-( Używam go głównie do rzeczy C ++, które mniej polegają na tej stronie rzeczy (choć ma to swoje własne problemy ...)
richq
12
set cscopetag( cst), aby polecenia :tagi CTRL-]przeszukiwały najpierw cscope, a następnie tagi
Hasturkun
1
Ponadto ctags jest dość powolny w wyszukiwaniu rekurencyjnym, użycie „ctags -L cscope.files” znacznie przyspieszy generowanie tagów.
Aaron H.
1
@ RobertS.Barnes używa jakiegoś rozwiązania g C-], vim pokaże Ci listę tagów pasujących do nazwy. Nadal musisz ręcznie znaleźć odpowiednią definicję, której szukasz.
Hubert Kario
15

Byłem w tej samej sytuacji kilka miesięcy temu ...

Brak precyzji tagów ctag jest uciążliwy w a .. i uważam, że cscope jest znacznie lepszy dla wszystkich rzeczy związanych z makrami (a jądro Linuksa zawiera kilka makr).

jeśli chodzi o użytkowanie, to jest naprawdę proste ... po prostu wpisujesz cscope -R w katalogu głównym swojego jądra i nie masz się czym martwić ... (to znaczy, jeśli chcesz po prostu zbadać, to jest idealne ...)

Następnie wszystkie wiązania klawiszy są oparte na Ctrl- \ (możesz go zmienić, jeśli jesteś uczulony na Ctrl), używasz głównie s i g ....,

Tworząc pod kątem jądra, nie potrzebowałem aż tak dużo ukończenia ...

W każdym razie, idź na cscope, jest to znacznie wygodniejsze, dokładniejsze.

LB40
źródło
4
<< po prostu wpisujesz cscope -R w katalogu głównym jądra .... Lepiej jest wpisać "make cscope" pod jądrem, w przeciwnym razie otrzymasz wszystkie Architektury obecne w jądrze Linuksa i stąd wielokrotną definicję tego samego symbolu C.
kumar
4

Hmm ... Prawdopodobnie powinieneś używać etagów zamiast ctagów ...

Jeśli używasz cscope, możesz zobaczyć łańcuchy wywołań, tj. Kto wywołuje tę funkcję i jakie funkcje wywołuje ta funkcja?

Nie jestem pewien, czy można to zrobić za pomocą etags / ctags ...

To tylko jedna funkcja ... co powiesz na znalezienie pliku, który zawiera określoną definicję funkcji? To dostajesz tylko w cscope.

Używam zarówno cscope, jak i etags, oba są dobre do różnych rzeczy, szczególnie podczas pracy z dużą bazą kodu, taką jak jądro Linuksa. Właściwie zacząłem używać cscope i etags, kiedy zacząłem pracować z Linux Kernel / Xen.

LXR nie jest świetny, ponieważ musisz kliknąć, przejść przez sieć itp., Podczas gdy możesz zbudować cscope i tagować bazy danych na swoim kodzie jądra i nie musisz przechodzić przez sieć (w przeciwieństwie do lxr).

rmk
źródło
Czy etags nie jest tylko dla emacsa? Używam wyłącznie g / vim.
Robert S. Barnes
Tak masz rację. Ze strony podręcznika man: Program etags służy do tworzenia pliku tablicy znaczników w formacie zrozumiałym dla emacs (1); program ctags służy do tworzenia podobnej tabeli w formacie zrozumiałym dla vi (1).
rmk
1
Sądzę, że istnieją dwa rodzaje etagów i ctagów. Jeden to emacs, drugi to żywiołowy ctags. Pierwsza została napisana dla emacsa, ale może być również używana dla vi; druga została najpierw napisana dla vi, ale może być również używana dla emacsa. Uważam, że drugi (żywiołowe ctagi) jest łatwiejszy w użyciu, mimo że jestem użytkownikiem emacsa. Jeśli zainstalujesz pakiet exuberant-ctags, linki do plików binarnych etags / ctags zmienią się i wskażą inne pliki binarne.
ustun
1

Zaproponuj użycie globalnych tagów gtag. Mógłby użyć wtyczki vim gen_tags do integracji tagów gtag z vimem.

Hongbo Liu
źródło