Почему cscope или ctags выбирают одно вместо другого? [закрыто]

131

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

Роберт С. Барнс
источник

Ответы:

157

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

richq
источник
2
Есть ли способ сделать ctags более точными? Я сделал это make tagsв корневом каталоге ядра и играл с прыжками, и большую часть времени оказывался не в том месте. Я читал, что ctags имеет проблемы с препроцессором c, но, учитывая, что ctags используется в lxr, очевидно, что что-то можно сделать.
Роберт С. Барнс,
2
Если есть глубокий макрос вуду, то ctags, скорее всего, не сработает :-( Я использую его в основном для материала C ++, который меньше полагается на эту сторону вещей (хотя у этого есть свои проблемы ...)
richq
12
set cscopetag( cst), чтобы команды :tagи CTRL-]сначала выполняли поиск в cscope, а затем в тегах
Hasturkun
1
Кроме того, ctags довольно медленно выполняет рекурсивный поиск, использование «ctags -L cscope.files» значительно ускорит создание ваших тегов.
Аарон Х.
1
@ RobertS.Barnes использует какое-то решение g C-], vim покажет вам список тегов, соответствующих имени. Вам все равно нужно будет вручную найти правильное определение, которое вы ищете.
Hubert Kario
15

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

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

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

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

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

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

LB40
источник
4
<< вы просто набираете cscope -R в корне вашего ядра .... Лучше набрать "make cscope" под ядром, иначе вы получите все архитектуры, присутствующие в ядре Linux, и, следовательно, несколько определений для одного и того же символа C.
kumar
4

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

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

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

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

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

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

РМК
источник
Разве etags не только для emacs? Я использую исключительно g / vim.
Роберт С. Барнс,
Да ты прав. На странице руководства: Программа etags используется для создания файла таблицы тегов в формате, понятном emacs (1); программа ctags используется для создания аналогичной таблицы в формате, понятном vi (1).
rmk
1
Я считаю, что есть два вида etags и ctags. Один - это emacs, другой - обильный ctags. Первый был впервые написан для emacs, но может использоваться и для vi; второй был впервые написан для vi, но может использоваться и для emacs. Я считаю, что второй (обильные ctags) проще в использовании, хотя я и являюсь пользователем emacs. Если вы установите пакет exuberant-ctags, ссылки на двоичные файлы etags / ctags изменятся и будут указывать на другие двоичные файлы.
ustun
1

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

Хунбо Лю
источник