Действительно, Emacs обеспечивает только то, что вам нужно для этого, с функцией «привязанного соответствия» режима блокировки шрифтов. Синтаксис немного волосатый, но он позволяет указывать дополнительные «совпадения» (в основном, регулярное выражение, идентификатор подвыражения и имя лица), которое (по умолчанию) будет применяться после позиции, в которой основное «регулярное выражение» «конкатенация» заканчивается Конец строки. Существуют более сложные способы настройки именно того диапазона текста, к которому они применяются, но это общая идея.
Вот простой пример, который также показывает, как вы можете определить свое собственное лицо с целью:
(defface bioseq-mode-a
'((((min-colors 8)) :foreground "red"))
"Face for As in bioseq-mode")
(defface bioseq-mode-g
'((((min-colors 8)) :foreground "blue"))
"Face for Gs in bioseq-mode")
(setq dna-keyword
'(("^\\+" ("A" nil nil (0 'bioseq-mode-a)))
("^\\+" ("G" nil nil (0 'bioseq-mode-g)))))
Вы также можете указать два или более привязанные matchers для одной главной согласовани (главная согласованью здесь является регулярным выражением "^\\+"
). Чтобы выполнить эту работу, каждый привязанный сопрягатель после первого должен явно вернуться к началу строки перед началом поиска; в противном случае он только начнет выделяться после последнего появления предыдущего привязанного сопряжения. Это достигается путем помещения (начало строки) в слот PRE-MATCH-FORM (элемент 2 списка, см. Ниже).
(setq dna-keyword
'(("^\\+"
("A" nil nil (0 'bioseq-mode-a))
("G" (beginning-of-line) nil (0 'bioseq-mode-g)))))
Я думаю, что это в основном вопрос вкуса, который вы предпочитаете; второй способ может быть немного более четким, если у вас много разных привязанных совпадений для одной строки, но я сомневаюсь, что существует значительная разница в производительности.
Вот соответствующий бит документации для font-lock-defaults
:
HIGHLIGHT должны быть либо MATCH-HIGHLIGHT или MATCH-анкер.
[....]
MATCH-Anchored должен иметь вид:
(Сличитель предматчевой-ФОРМА послематчевой-ФОРМА MATCH-HIGHLIGHT ...)
где MATCHER является регулярным выражением для поиска или имени функции для вызова, чтобы сделать поиск, как для MATCH-HIGHLIGHT выше, но за одним исключением; Смотри ниже. PRE-MATCH-FORM и POST-MATCH-FORM оцениваются до первого, а после используется последний экземпляр MATCH-ANCHORED MATCHER. Поэтому они могут быть , используемые для инициализации до и очистки после использования MATCHER. Как правило, PRE-MATCH-FORM используется для перемещения в какое-либо положение относительно оригинала MATCHER, прежде чем начать с MATCH-ANCHORED's MATCHER. POST-MATCH-FORM может использовать для возврата назад, прежде чем возобновить работу с MATCHER родителем MATCH-ANCHORED.
Вышеупомянутое исключение выглядит следующим образом. Предел поиска MATCHER по умолчанию соответствует концу строки после оценки PRE-MATCH-FORM. Однако, если PRE-MATCH-FORM возвращает позицию, превышающую позицию после PRE-MATCH-FORM оценивается, эта позиция используется как предел поиска. Как правило, плохая идея вернуть позицию больше конца строки , т. Е. Вызвать поиск MATCHER по линиям.
Я всегда считаю, что я должен прочитать шрифт блокировки документов примерно в три раза, прежде чем он начинает иметь смысл для меня ;-)