ctags включает две функции: позволяет переходить от вызовов функций к их определениям и завершать все операции. Первое означает, что когда вы закончите вызов метода, нажатие g]
или CTRL-]
приведет к тому месту, где этот метод определен или реализован. Вторая функция означает, что когда вы набираете foo.
или foo->
и если foo является структурой, будет отображаться всплывающее меню с заполнением поля.
cscope также имеет первую функцию - используя set cscopetag
- но не последнюю. Однако cscope дополнительно добавляет возможность перехода в любое место, где также вызывается функция.
Что касается прыжков по базе кода, ctags всегда приведет вас к тому месту, где реализована функция, тогда как cscope может показать вам, где также вызывается функция.
Почему вы выбираете одно над другим? Ну, я использую оба. ctags проще в настройке, быстрее в беге, и если вам нужно только прыгнуть в одну сторону, он покажет вам меньше строк Вы можете просто запустить :!ctags -R .
и g]
просто работает. Это также позволяет этому всестороннему завершению.
Cscope отлично подходит для больших, неизвестных баз кода. Установка является трудной задачей, потому что cscope нужен файл, содержащий список имен файлов для анализа. Также в vim по умолчанию привязки клавиш не настроены - вам нужно запустить :cscope blah blah
вручную.
Для решения первой проблемы у меня есть скрипт bash cscope_gen.sh
, который выглядит следующим образом:
#!/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
Это ищет интересующий меня код, создает список cscope.files и создает базу данных. Таким образом, я могу запустить «:! Cscope_gen.sh» вместо того, чтобы запоминать все шаги настройки.
Я сопоставляю поиск cscope с ctrl-пробелом x 2 с помощью этого фрагмента, который смягчает другой недостаток cscope:
nmap <C-@><C-@> :cs find s <C-R>=expand("<cword>")<CR><CR>
Существует этот плагин cscope_maps.vim , который устанавливает несколько похожих привязок. Я никогда не могу вспомнить, что означают все опции, поэтому стараюсь придерживаться ctrl-space.
Итак, подытожим: ctags проще в настройке и в основном работает, не делая ничего другого, это также важно для omni-complete. cscope предоставляет больше возможностей, если вам нужно поддерживать большую и в основном неизвестную базу кода, но требуется больше работы.