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


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

3 123

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 search с 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 предоставляет больше возможностей, если вам нужно поддерживать большую и в основном неизвестную базу кода, но требует больше работы с ногами.

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

отсутствие точности 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).