Следующий код не выделяет 23
в 23-23
, если вставлен и оценен в буфере нуля, но не выполняется в текстовом буфере.граница слова в символах блокировки шрифтов Emacs
;; Example 1
'(1234 23 23-23 end)
(progn
(font-lock-add-keywords nil
`(("\\b23\\b"
(0 'success))
"end"))
(font-lock-fontify-buffer))
Почему терпят неудачу, когда M-x isearch-forward-regexp RET \b23\b
все еще соответствует 23
«S в 23-23
?
Даже если я перехожу к следующему коду, выделяется только первый 23
в 23-23
.
;;; Example 2
'(1234 23 23-23 end)
(progn
(font-lock-add-keywords nil
`((,(rx (or word-boundary
"-")
(group "23")
(or word-boundary
"-"))
(1 'success))
"end"))
(font-lock-fontify-buffer))
Сторона примечания: «конец» есть, чтобы я мог определить, плохо ли сформирован маркер для 23. Если он плохо сформирован или сигнализирует об ошибках, конец не будет подсвечиваться.
;;; Example 3 (with xy instead of 23. also passing t and 'append.)
;;; if evaluated in the scratch buffer, it doesn't highlight xy in xy-xy
'(wxyz xy xy-xy end)
(progn
(font-lock-add-keywords nil
`(("\\bxy\\b"
(0 'success t))
"end")
'append)
(font-lock-fontify-buffer))
Режимы могут определять свои собственные графические объекты, где значение символа может быть определено по-разному (присвоено другому классу символов). В частности, символы, такие как дефисы, символы подчеркивания, знак сигила (те, которые несколько раз считаются составляющими слова, а иногда и нет), могут быть изменены локально. Вероятно, вам следует изучить локальный графический режим и посмотреть, какой класс sytnax назначен этому символу. –
@wvxvw 'M-x описать-синтаксис' говорит, что класс синтаксиса для дефиса ASCII - это класс символа как в режиме lisp-взаимодействия (буфера нуля), так и в текстовом режиме в' emacs -Q'. –
Не так давно я столкнулся с подобной проблемой. Что делать, если вы попытаетесь заменить '\\ b' на' \\ <' '\\> 'или' \\ _ <' and '\\_> '? Я не могу вспомнить, в чем разница. –