Cscope или ctags, почему вы выбираете один за другим? - программирование

Cscope или ctags, почему вы выбираете один за другим?

В основном я использую vim/gvim в качестве редактора, и я смотрю на использование комбинации lxr (ссылка на Linux) и либо cscope или ctags для изучения источника ядра. Однако я никогда не использовал cscope или ctags и хотел бы услышать, почему один из них может выбрать один из них, принимая во внимание мое использование vim в качестве основного редактора.

4b9b3361

Ответ 1

ctags включает в себя две функции: позволяет вам переходить от вызовов функций к их определениям и полностью завершать. Первое означает, что, когда вы закончите вызов метода, нажатие g] или CTRL-] переместится туда, где этот метод определен или реализован. Вторая особенность означает, что при вводе foo. или foo->, и если foo является структурой, будет показано всплывающее меню с завершением поля.

cscope также имеет первую функцию - используя set cscopetag - но не последнюю. Однако cscope дополнительно добавляет возможность перехода в любое из мест, где также вызывается функция.

Итак, что касается прыжка вокруг базы кодов, ctags будут приводить вас только к тому месту, где реализована функция, тогда как cscope может показать вам, где тоже вызывается функция.

Почему вы выбираете один за другим? Ну, я использую оба. ctags проще настроить, быстрее запустить, и если вы только заботитесь о том, чтобы прыгать в одну сторону, это покажет вам меньше строк. Вы можете просто запустить :!ctags -R . и g] просто работать. Это также позволяет полностью забыть об этом.

Cscope отлично подходит для больших, неизвестных кодовых баз. Настройка - это боль, потому что cscope нуждается в файле, содержащем список имен файлов для синтаксического анализа. Также в vim по умолчанию не установлены привязки клавиш - вам нужно запустить :cscope blah blah вручную.

Чтобы решить проблему кулака, у меня есть bash script 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 <[email protected]><[email protected]> :cs find s <C-R>=expand("<cword>")<CR><CR>

Здесь этот плагин cscope_maps.vim, который создает связку подобных привязок. Я никогда не могу вспомнить, что означают все варианты, поэтому они склонны придерживаться ctrl-space.

Итак, чтобы сделать вывод: ctags проще настроить и в основном работает, не делая ничего другого, это жизненно важно для всенаправы. cscope предоставляет больше возможностей, если вам нужно поддерживать большую и в основном неизвестную базу кода, но требует больше работы на ногах.

Ответ 2

Я был в той же ситуации несколько месяцев назад...

Отсутствие точности ctags - это боль в.., и я нахожу cscope намного лучше для всех связанных с макросами вещей (и в ядре linux есть куча макросов).

относительно использования, что на самом деле просто... вы просто набираете cscope -R в корне вашего ядра, а затем вам не о чем беспокоиться. (Я имею в виду, если вы просто хотите изучить это совершенное..)

Затем привязки клавиш основаны на Ctrl-\(вы можете переназначить его, если у вас аллергия на Ctrl), в основном вы используете s и g....,

Развиваясь для ядра, мне не нужно было так много завершать....

В любом случае, пойдите для cscope, это намного удобнее, точнее.

Ответ 3

Хм... Вероятно, вы должны использовать etags вместо ctags...

Если вы используете cscope, вы можете видеть цепочки вызовов, то есть кто вызывает эту функцию и какие функции выполняет эта функция?

Я не уверен, что это можно сделать с помощью etags/ctags...

Это только одна особенность... как насчет поиска файла, который содержит определенное определение функции? Это вы получаете только в cscope.

Я использую оба cscope и etags, они оба хороши для разных вещей, особенно при работе с большой базой кода, например с ядром Linux. Фактически, я начал использовать cscope и etags, когда начал работать с Linux Kernel/Xen.

LXR невелик, потому что вам нужно щелкнуть, перейти через сеть и т.д., тогда как вы можете создавать базы данных cscope и теги на вашем коде ядра и не должны переходить через сеть (в отличие от lxr).