Можно ли изменить синтаксическую таблицу emacs в зависимости от контекста?
Я работаю над улучшением основного режима Emacs для UnrealScript. Одна из (многих) странностей заключается в том, что он позволяет использовать следующий синтаксис для указания всплывающих подсказок в редакторе Unreal:
var() int MyEditorVar <Foo=Bar|Tooltip=My tooltip text isn't quoted>;
Угловые скобки после объявления переменной обозначают разделенный по конвейеру список пар метаданных Key=Value, причем метаданные не заключены в кавычки, но могут содержать кавычки - трубу (|
) или правая угловая скобка (>
) обозначает конец.
Есть ли способ, как я могу получить таблицу синтаксиса emacs, чтобы распознавать этот контекстно-зависимый синтаксис полезным способом? Мне бы хотелось, чтобы все, кроме труб и прямоугольных скобок, каким-то образом выделялось внутри этих объявлений переменных метаданных, но в остальном сохраняло их обычное выделение.
Прямо сейчас символ одинарной кавычки настроен как разделитель кавычек (обозначение синтаксиса "
), поэтому font-lock-mode интерпретирует такую кавычку как начало строки в кавычках, чего нет в этом особом случае, поэтому он отбрасывает все, пока не найдет другую, предположительно соответствующую одинарную кавычку.
1 ответ
Вам нужно будет настроить syntax-propertize-function
что позволяет применять разные обозначения синтаксиса к различным символам в буфере в зависимости от их контекста.
Grep для syntax-propertize-function
в каталоге Emacs для просмотра различных примеров (от простых до довольно сложных).
Возможно, вы захотите пометить символы "=" после "Foo" и после "Tooltip" как "универсальный разделитель строк", а затем сделать то же самое с соответствующим завершающим "|" и ">". Альтернативой может быть пометка символа перед ">" как (закрывающего) обобщенного строкового разделителя, так что вы можете пометить "<" и ">" как открывающие и закрывающие парены.