cscope или ctags почему стоит предпочесть одно другому?
Вопрос
В основном я использую 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.