Определение типа файла для стандартных заголовков C++ с помощью vim


Стандартные заголовки для C++ обычно устанавливаются в /usr / include/c++ / 4.x (в Linux). Так как большинство заголовков не имеют никакого расширения (.ч, .ГЭС и др.), vim не может распознать формат этих файлов как C++.

Я видел этот другой Вопрос в SO, но решения, размещенные там, не решают мою проблему. Одно из решений здесь включает использование modeline, но стандартные заголовки C++ не включают дружественную к vim сигнатуру. Вместо этого они включают в первую строку что-то например:

// <algorithm> -*- C++ -*-

Я думаю, что мог бы найти этот шаблон (-*- C++ -*-), чтобы определить тип файла. Другое решение, опубликованное в ранее упомянутом вопросе SO, фактически идет в этом направлении. Ответ предлагает использовать:

au BufRead * if search('MagicPattern', 'nw') | setlocal ft=cpp | endif

Поэтому я попытался сделать:

au BufRead * if search('-*- C++ -*-', 'nw') | setlocal ft=cpp | endif

Но это не работает (т. е. тип файла не определяется).

Можно ли определить тип файла, используя этот подход? Существует ли какой-либо плагин или какой-либо другой способ решить эту проблему?

2 4

2 ответа:

Ответ Н. м делает трюк, но это лучше:

au BufRead * if search('\M-*- C++ -*-', 'n', 1) | setlocal ft=cpp | endif

Дополнительным аргументом к search является стоп-линия , и гарантирует, что это правило будет применяться только к файлам с шаблоном в строке 1.

Это важно, потому что без стоп-линии любые файлы, содержащие шаблон, , включая ваш vimrc , будут соответствовать соответствию и потенциально будут выделены с использованием неправильных правил синтаксиса.

Также, используя стоп-линию флаг w является ненужный.

Посмотрите на :help search для получения дополнительной информации.

* обычно является особенным в поисках Vim. Чтобы отключить его, используйте \M в начале строки поиска, т. е.

au BufRead * if search('\M-*- C++ -*-', 'nw') | setlocal ft=cpp | endif

Это действительно работает для меня.