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-space x 2 с помощью этого фрагмента, который смягчает другие проблемы cscope:
nmap <C-@><C-@> :cs find s <C-R>=expand("<cword>")<CR><CR>
Есть плагин cscope_maps.vim, который устанавливает кучу похожих привязок. Я никогда не могу вспомнить, что означают все параметры, поэтому стараюсь использовать ctrl-space.
Итак, в заключение: ctags проще настроить и в основном работает, ничего не делая, это важно и для omni-complete. cscope предоставляет больше возможностей, если вам нужно поддерживать большую и в основном неизвестную кодовую базу, но требует больше работы.
make tags
в корневом каталоге ядра и играл с прыжками, и большую часть времени оказывался не в том месте. Я читал, что ctags имеет проблемы с препроцессором c, но, учитывая, что ctags используется в lxr, очевидно, что что-то можно сделать.