Включение заголовочных файлов рекурсивно для синтаксических

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

--libs    
    |---dir1
         |---foo1.h    
    |---dir2
         |---foo2.h
         |---foo3.h
         |---dir3
               |---foo4.h

Я включил файлы lib в файл .vimrc, используя:

let g: syntastic_cpp_include_dirs = ['libs/']

Я предположил, что все рекурсивные файлы заголовков будут возвращаться, но это не так. В коде синтаксис жалуется на ошибку "такой файл или каталог не найден".

Когда я явно изменяю эту переменную, ссылаясь на конкретный каталог:

let g: syntastic_cpp_include_dirs = ['libs/dir2/dir3/']

он работает.

Мои вопросы:

  • Как вы настраиваете синтаксис, чтобы он включал заголовочные файлы из набора каталогов рекурсивно?
  • Как вы это делаете для нескольких проектов? Всегда редактирование .vimrc при переключении проекта, над которым я работаю, звучит не так. Я считаю, что должен быть лучший способ.

EDIT:

Я не упоминал, что в моем .vimrc для синтаксиса присутствуют следующие параметры:

let g:syntastic_check_on_open=1
let g:syntastic_enable_signs=1
let g:syntastic_cpp_include_dirs = ['libs/dir2/dir3', 'libs/dir2 ]
let g:syntastic_cpp_check_header = 1
let g:syntastic_cpp_remove_include_errors = 1

Ответы

Ответ 1

Вы можете включить все каталоги для поиска файлов заголовков для каждого проекта в корневом каталоге проекта в файле .syntastic_cpp_config. Формат для этого был бы таким же, как предоставление директив -I компилятору.

В вашем случае это означает:

  • Создайте файл .syntastic_cpp_config под sources (предположим, что где ваш код и sources находится на одном уровне глубины в иерархии каталогов как libs).
  • Поместите в него следующие строки:

    -Ilibs/dir1

    -Ilibs/dir2

    -Ilibs/dir2/dir3

  • Обратите внимание, что флаги - 1 на строку.

  • Таким образом, вам не нужно иметь все каталоги include в .vimrc.

У вас может быть другой файл для хранения этой настраиваемой конфигурации для каждого проекта, указанный глобальной переменной .vimrc g:syntastic_cpp_config_file, например

let g:syntastic_cpp_config_file = '.my_custom_include_file_for_syntastic'

Syntastic проверит каждый исходный каталог и вверх до тех пор, пока не найдет этот файл, а затем не использует его для создания своего вывода.

См. Синтаксическая страница викинга,  Старая ссылка для получения более подробной информации.

Ответ 2

У меня был тот же вопрос с небольшой удачей. Тем не менее, я обнаружил, что если я использую заголовок заголовка кавычек, то синтаксис будет правильно проверять папки и не выдавать предупреждений. Например, если вы работаете с foo2.cpp,

#include "dir3/foo4.h"
#include "../dir1/foo1.h"

Сохранить скобку включает в себя стандартные libs и любые libs, которые вы чувствуете как hardcoding в vim.