cscope или ctags почему выбирают одно над другим? - PullRequest
127 голосов
/ 01 июня 2009

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

Ответы [ 4 ]

150 голосов
/ 01 июня 2009

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-пробелом x 2 с помощью этого фрагмента, который смягчает другой недостаток cscope:

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

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

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

15 голосов
/ 01 июня 2009

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

Недостаток точности ctags - это боль в ..., и я считаю, что cscope намного лучше для всего, что связано с макросами (а в ядре linux есть куча макросов) ..

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

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

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

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

4 голосов
/ 29 декабря 2009

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

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

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

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

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

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

1 голос
/ 30 ноября 2018

Предложите использовать глобальные gtags. Может использовать плагин vim gen_tags для интеграции gtags с vim.

...