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, очевидно, что что-то можно сделать.cscopetag
(cst
), чтобы команды:tag
иCTRL-]
сначала выполняли поиск в cscope, а затем в тегахg C-]
, vim покажет вам список тегов, соответствующих имени. Вам все равно нужно будет вручную найти правильное определение, которое вы ищете.Несколько месяцев назад я был в такой же ситуации ...
Отсутствие точности ctags - это боль в .., и я считаю, что cscope намного лучше для всех вещей, связанных с макросами (а в ядре linux есть куча макросов) ..
Что касается использования, это на самом деле просто ... вы просто набираете cscope -R в корне вашего ядра, и тогда вам не о чем беспокоиться ... (я имею в виду, если вы просто хотите изучить, это идеально ...)
Затем все привязки клавиш основаны на Ctrl- \ (вы можете переназначить его, если у вас аллергия на Ctrl), вы в основном используете s и g ....,
Разрабатывая под ядро, мне не нужно было так много доработки ....
В любом случае выбирайте cscope, это намного удобнее, точнее.
источник
Хм ... Вам, наверное, стоит использовать etags вместо ctags ...
Если вы используете cscope, вы можете увидеть цепочки вызовов, то есть кто вызывает эту функцию и какие функции вызывает эта функция?
Я не уверен, можно ли это сделать с помощью etags / ctags ...
Это всего лишь одна особенность ... а как насчет того, чтобы найти файл, содержащий определение конкретной функции? Это вы получаете только в cscope.
Я использую и cscope, и etags, они оба хороши для разных вещей, особенно при работе с большой кодовой базой, такой как ядро Linux. Фактически, я начал использовать cscope и etags, когда начал работать с ядром Linux / Xen.
LXR не очень хорош, потому что вам нужно щелкать мышью, переходить по сети и т. Д., Тогда как вы можете создавать базы данных cscope и tags в коде ядра и вам не нужно переходить по сети (в отличие от lxr).
источник
Предлагаю использовать глобальные теги. Можно использовать плагин vim gen_tags для интеграции gtags с vim.
источник