ctags и cscope почему выбрать один над другим?

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

3 ответов


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

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

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

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

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.список файлов и создает базу данных. Так я смогу бежать":!cscope_gen.sh-вместо того, чтобы помнить все установленные шаги.

я сопоставляю поиск cscope с ctrl-space x 2 с этим фрагментом, который смягчает другой downer cscope:

nmap <C-@><C-@> :cs find s <C-R>=expand("<cword>")<CR><CR>

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

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


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

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

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

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

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

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


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

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

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

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

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

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