cscope или ctags почему стоит предпочесть одно другому?

StackOverflow https://stackoverflow.com/questions/934233

  •  06-09-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

Я сопоставляю cscope search с ctrl-пробел x 2 с помощью этого фрагмента, что смягчает другой недостаток cscope:

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

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

Итак, в заключение: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 и tags в коде вашего ядра и не нужно переходить по сети (в отличие от lxr).

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top