Подсветка синтаксиса подлипа в Vim - PullRequest
4 голосов
/ 09 января 2010

Сначала я покажу конкретную проблему, с которой я столкнулся, но думаю, что проблему можно обобщить.

Я работаю с языком, который имеет явный синтаксис скобок (например, Lisp), но имеет ключевые слова, которые зарезервированы только для левой части. Пример:

(key key)

первое является зарезервированным словом, а второе является ссылкой на переменную с именем "key"

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

syn keyword classification key

вместо

syn keyword classification (key

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

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

Ответы [ 2 ]

7 голосов
/ 09 января 2010

Использование syn keyword отдельно для этой ситуации не работает должным образом, потому что вы хотите, чтобы ваша подсветка была лучше осведомлена об окружающем синтаксисе. Комбинация syn region, syn match и syn keyword работает хорошо.

hi link lispFuncs Function
hi link lispFunc Identifier
hi link sExpr Statement

syn keyword lispFuncs key foo bar contained containedin=lispFunc
syn match lispFunc "(\@<=\w\+" contained containedin=sExpr contains=lispFuncs
syn region sExpr matchgroup=Special start="(" end=")" contains=sExpr,lispFuncs

Выше будут выделены только клавиши, foo и bar с помощью группы подсветки Function, только если они также соответствуют lispFunc.

Если есть какие-либо слова, кроме key, foo и bar, которые идут после (, они будут выделены с помощью группы выделения идентификатора. Это позволяет различать стандартные имена функций и созданные пользователем.

( и ) будут выделены с помощью специальной группы выделения, а все, что находится внутри () после первого слова, будет выделено с помощью группы выделения оператора.

0 голосов
/ 09 января 2010

Кажется, что есть некоторая возможность для многоуровневой подсветки, как показано здесь: Подсветка совпадений в Vim по перевернутому шаблону
который дает бывшие команды

:match myBaseHighlight /foo/
:2match myGroup /./

Мне не удалось заставить что-то подобное работать в моих файлах синтаксиса. Я пробовал что-то вроде:

syn match Keyword "(key"
syn match Normal "("

Подсветка переходит к обычному или ключевому слову в течение всего бита, в зависимости от того, что берется первым (изменяется в соответствии с расположением в файле)

Vim обоснованно отклонен, используя "2match" в качестве ключевого слова после "syn".

...