null

Vim: подсвечиваем синтаксис

Доброе утро!

Как изветсно, в процессе разработки программного обеспечения значительная часть времени разработчика проходит за написанием кода. Под написанием кода в данном случае понимается как его непосредственное производство, так и чтение, и редактирование. Не секрет, что гораздо более продуктивно читать код получается, когда он подсвечен: скобки спариваются, ключевые слова, операторы и имена переменных выделяются своими цветами, и так далее. Но не всегда среда разработки предоставляет подобную возможность для любого языка, особенно если это что-то более или менее экзотическое.

Сегодня мы попробуем написать простой файл подсветки для Vim, покрывающий часть возможностей PlantUML.

Сразу оговорюсь: часть — это именно часть. Представленный файл подсветки был создан в процессе активной работы, когда периодическое пополнение его новыми используемыми конструкциями PlantUML было уместно, а покрытие всех его возможностей целью не ставилось.

Постановим, что все файлы редактируются в ~/.vim/.

Для начала

Для начала, создадим файл ftdetect/plantuml.vim со следующей строкой:

au BufRead,BufNewFile *.plantuml set filetype=plantuml

Таким образом, установим соответствие расширения файла и его типа для filetype plugin.\

Теперь можно работать с файлом syntax/plantuml.vim. В данном файле будет находиться описание синтаксиса языка. Плагины для синтаксиса должны определить переменную b:current_syntax. Давайте сделаем это:

if exists("b:current_syntax")
  finish
endif
let b:current_syntax = "plantuml"

Теперь можно определить группы ключевых слов. Для этого используется команда syn keyword, первым аргументом которой является имя группы, остальными — входящие в неё слова. Опишем парочку:

syn keyword directive
      \ @startum
      \ @endum
      \ title
      \ skinparam
      \ autonumber
      \ activate
      \ deactivate
      \ destroy
      \ loop
      \ alt
      \ else
      \ end

syn keyword bool
      \ true
      \ false

Довольно просто. Возникает вопрос: что делать для более сложных вещей, чем простой поиск слов? Vim позволяет применять для тех же целей регулярные выражения. Делается это при помощи syn match. Давайте опишем разные виды соединительных линий:

syn match relation "\v\<\."
syn match relation "\v\<\.\."
syn match relation "\v\<-"
syn match relation "\v\<--"
syn match relation "\v\.\>"
syn match relation "\v\.\.\>"
syn match relation "\v-\>"
syn match relation "\v--\>"
syn match relation "\v--"
syn match relation "\v\.\."
syn match relation "\v-"
syn match relation "\v\."

В данном случае, в группу relation попадёт всё, что попадает под перечисленные регулярные выражения. То есть, это стрелочки, полоски из линий и точек, в данном случае.

Также можно определять регионы. В PlantUML я использую пары квадратных скобок для текстовых меток, поэтому хотелось бы включить для них подсветку орфографии. Для подобных (и не только) вещей есть регионы:

syn region compLabel start='\[' end=']' fold contains=@Spell

В contains= через запятую перечисляются группы ключевых слов. В данном случае там просто текст, так что их нет, зато есть @Spell, требующий проверки правописания.

Ну ладно

Ну ладно, научили Vim тому, что такое написано в файлах с расширением .plantuml. И что теперь?

А теперь мы скажем ему, как их подсвечивать:

hi def link todoComment            Todo
hi def link comment                Comment
hi def link participantGroupTypes  Statement
hi def link participantTypes       Type
hi def link directive              PreProc
hi def link bool                   Boolean
hi def link operator               Statement
hi def link relation Special

В общем случае: hi def link Ваша_Группа Имя_Группы_Подсветки. Здесь Ваша_Группа определена вами, а Имя_Группы_Подсветки является именем синтаксической группы, в для которого определено соответствующее правило в файле цветовой схемы. Посмотреть их можно, например, в :h group-name.

На этом

На этом, собственно, можно и закончить наше введение. Мы рассмотрели основные средства раскраски синтаксиса в Vim, научились их применять. Данный простой пример может являться отправной точкой для чего-то более сложного и интересного. Полностью мой код можно увидеть здесь: https://github.com/ValeriyKr/vim-plantuml-syntax.