2012-06-05 2 views
3

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

Я видел этот другой question в 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 

, но он не работает (то есть, тип файла не обнаружен).

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

+1

См. Вопрос "[Как заставить Vim определять тип файла из строки shebang?] (Http://stackoverflow.com/q/8890668/254635)" –

ответ

3

Nm в делает трюк, но это лучше:

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

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

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

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

Дополнительную информацию смотрите на странице :help search.

3

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

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

Это на самом деле работает для меня. Ответ