Можно ли настроить ctag так, чтобы они следовали директивам #include?

#vim #ctags

#vim #ctags

Вопрос:

Я пытаюсь создать цель в своем Makefile для автоматического создания tags файла с использованием ctags.

У меня есть список исходных файлов (.cpp-файлы), но у меня нет списка всех файлов заголовков (я использую g -MM для создания списка зависимостей заголовков).

Я бы предположил, что ctags будут следовать любым #include директивам в файлах .cpp при генерации тегов, но, похоже, мое предположение неверно.

Если я создам простой файл тегов, подобный этому:

 ctags  --fields= iaS --extra= q myClass.cpp
 

а затем перейдите в vim и введите имя объекта, за которым следует ‘.’ Я получаю сообщение об ошибке «Шаблон не найден».

Однако, если я скомпилирую файл тегов следующим образом:

 ctags  --fields= iaS --extra= q myClass.cpp myClass.h
 

и сделайте то же самое в vim, я получаю прекрасный автоматически заполняемый список переменных / функций-членов.

Первая строка в моем ‘myClass.cpp » файл — это

 #include "myClass.h"
 

Так почему ctags не использует это и для анализа файла заголовка?

Ответ №1:

нет. к сожалению / к счастью.

Не было бы слишком много проблем с вашими собственными включениями. Проблема начинается с

  • условная компиляция
  • внешние (системные) библиотеки.

К счастью, проблема для ваших собственных библиотек легко решается, если сделать что-то вроде

 ctags *.h *.cpp
ctags -R src/
 

Вы могли бы взломать что-то вместе с cpp and then ctags . Это не будет работать удобно. Полуинтересным подходом было бы исправить ctags, чтобы они следовали выводам #line pragma in cpp и, следовательно, связывали все теги с их соответствующими источниками.

Однако этот подход не будет работать так, как вы ожидаете, для любых символов / определений препроцессора (макросы были расширены, поэтому вы не сможете найти макрос по ctags).

Обычный способ решить эту проблему — сгенерировать «стандартный» файл тегов для ваших внешних библиотек и

 :se tags =/home/me/libs/tags.stdc  
:se tags =/home/me/libs/tags.libsox
 

и т.д. В нескольких библиотеках есть учебные пособия о том, как создать полезный файл тегов для использования с их библиотеками (или готовые файлы тегов, предполагающие определенный макет папки)

Комментарии:

1. Спасибо за ваш ответ. Поиграв с ним еще немного, я остановился на этом ctags -R . варианте. Жаль, я надеялся на --follow-includes опцию (возможно, в сочетании с --include-depth=X опцией). Но, как вы говорите, возможность иметь условные #include s делает это сложным.