Можно ли изменить синтаксическую таблицу 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" как "универсальный разделитель строк", а затем сделать то же самое с соответствующим завершающим "|" и ">". Альтернативой может быть пометка символа перед ">" как (закрывающего) обобщенного строкового разделителя, так что вы можете пометить "<" и ">" как открывающие и закрывающие парены.

Другие вопросы по тегам