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 blah
ręcznie.
Aby rozwiązać pierwszy problem, mam skrypt bash, cscope_gen.sh
któ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.
make tags
w 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ć.cscopetag
(cst
), aby polecenia:tag
iCTRL-]
przeszukiwały najpierw cscope, a następnie tagig C-]
, vim pokaże Ci listę tagów pasujących do nazwy. Nadal musisz ręcznie znaleźć odpowiednią definicję, której szukasz.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.
źródło
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).
źródło
Zaproponuj użycie globalnych tagów gtag. Mógłby użyć wtyczki vim gen_tags do integracji tagów gtag z vimem.
źródło