#vim #ctags #cscope
#vim #ctags #cscope
Вопрос:
Я использовал как cscope, так и exuberant-ctags с VIM с отличными результатами в проектах на чистом C. Однако сейчас я перешел к большому смешанному проекту C / C / Java с большим количеством грубого старого кода, и я пытаюсь использовать cscope, чтобы получить представление о потоке кода. У меня возникли проблемы с получением cscope для распознавания некоторых функций, которые находятся в файле C .
Например, в этом конкретном проекте есть функция C с именем «VerifySignature», которая определена как глобальная. Существует другая функция, также называемая «VerifySignature», которая определяется как статическая функция в файле .cpp.
-
Когда я использую <ctrl-]> или <g]> в VIM или когда я использую автономный cscope для поиска определения, это неизменно приводит меня к функции C, даже когда VIM редактирует файл, в котором определена статическая функция C (это привело к глубокой путанице, прежде чем я понял, что было две функции ‘VerifySignature’, и я смотрел не на ту).
-
Когда я использую cscope для поиска функций, которые вызывают ‘VerifySignature’, в нем перечислены только вызовы функции C. Как будто cscope не знает о функции C .
-
Однако, когда я использую <ctrl- s> или когда я использую автономный cscope для поиска символа, в нем отображаются обе функции, а также каждое место, где вызывается любая функция.
Итак, он знает о функции C , просто не всегда ее показывает.
В качестве другой точки данных я переименовал функцию C в ‘verifySignature2’, чтобы ее имя было уникальным во всей кодовой базе, оставив все остальное неизменным (все еще статичным и т.д.), перестроил свои базы данных cscope / ctags и снова провел поиск. На этот раз <ctrl-]> в VIM и ‘find global definition’ без проблем нашли процедуру C .
Основываясь на этом, я бы почти склонен сказать, что cscope игнорирует статические символы, если есть глобальный символ с тем же именем. За исключением того, что у меня есть неофициальные доказательства из проектов на чистом «C», что это неправда. Итак, я чешу голову…
Я генерирую файлы перекрестных ссылок, используя следующие команды:
> find . -regextype posix-extended -regex '.*.(c|C|cpp|h|hpp|s|S|java)' > cscope.files
> usr/bin/cscope -b -q -f cscope.out
> /usr/bin/ctags --c -kinds= p --fields= iaS --extra= q -L cscope.files
Я делаю что-то не так?
Ответ №1:
YouCompleteMe также поможет вам написать код, помимо навигации по нему с помощью GoTo*
команд и отображения типа / функции / любых подписей во всплывающем меню. Возможно, вы также захотите взглянуть на панель тегов.