#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 делает это сложным.