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ć.