Включение подсветки синтаксиса в vim

Не понимаю, каким образом мне включить в vim'e подсветку синтаксиса С++. в /usr/share/vim/vim81/syntax/ лежат файлы с настройками под какждый язык, но я не совсем понимаю, как их подключить. Прошу прощения за крайне глупый вопрос.


Ответы (1 шт):

Автор решения: Matt

TL;DR: :filetype on | syntax on

В Vim'е синтаксис и иже с ним реализованы стандартными плагинами на VimScript'е с помощью механизма событий и автокоманд (:h autocmd.txt).

Когда Vim считывает файл с диска генерируется событие BufRead (BufNewFile если такого файла в файловой системе пока не существует). Это событие может быть обработано одной из автокоманд определенных в скрипте $VIMRUNTIME/filetype.vim. Загрузка этого скрипта обычно производится специальной командой :filetype on. Сам же скрипт по большей части состоит из проверок расширения файла и установок соответствующего значения опции :h 'filetype' (очевидно, что расширение файла не всегда совпадает с его типом, например, файл foobar.h может иметь тип c, либо вообще cpp, ну а какой-нибудь foobar.sh - это вообще зоопарк и угадайка).

Из вышесказанного следует, что, в принципе, :filetype on не обязателен (всегда можно взять и напечатать в командной строке :set filetype=XXX, либо :setf XXX), но желающие указывать нужный тип файла каждый раз руками находятся редко.

Установка нового значения опции :h 'filetype' ведет к автоматической генерации события FileType. И, опять же, событие FileType может быть перехвачено соответствующими автокомандами из других скриптов. Таких стандартных скриптов есть аж три штуки: $VIMRUNTIME/ftplugin.vim (сорсится по команде :filetype plugin on), $VIMRUNTIME/indent.vim (команда :filetype indent on) и $VIMRUNTIME/syntax/syntax.vim (команда :syntax on). Ftplugin отвечает за установку различных буферно-локальных опций, Indent - за определение функции расчета отступа строк, ну а третий, как не трудно догадаться, за определение синтаксических элементов.

Однако на самом деле по событию FileType автокоманда из syntax.vim всего лишь устанавливает значение еще одной опции - :h 'syntax'. И уже изменение опции :h 'syntax' (опять!!!) генерирует новое событие Syntax. И вот только по событию Syntax следующая автокоманда читает значение опции &syntax для текущего буфера и подгружает нужный скрипт из подкаталога syntax с именем совпадающим со значением этой опции.

Из этого, кстати, следует, что можно переназначить текущий синтаксис командой :set syntax=XXX. Однако при следующем событии FileType для этого буфера (например, перезагрузка с диска командой :e), все слетит на текущий &filetype.

Поэтому существует также возможность отвязать &syntax от &filetype командой :syntax manual. Тогда событие FileType перехватываться не будет, а вот событие Syntax - все еще да. Но в этом случае установку опции &syntax всегда нужно будет делать вручную.

И последнее. "Синтаксис" в Vim - это, грубо говоря, набор регулярных выражений (:h :syn-match и все-все-все), который меняется от буфера к буферу. Конкретные же цвета должны определяться глобально с помощью так называемых "цветовых схем" (на самом деле "схема" - это все тот же VimScript просто состоящий в основном из команд :h :highlight). Поэтому полученный результат будет зависеть и от файла синтаксиса, и от цветовой схемы, и от способности терминала эти самые цвета воспроизвести.

→ Ссылка