【发布时间】:2013-09-22 19:39:32
【问题描述】:
如果在暂存缓冲区中粘贴和评估以下代码,则无法突出显示 23-23 中的 23,但如果在文本缓冲区中完成则不会。
;; 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-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 的荧光笔是否形成不良。如果格式不正确或无提示地发出错误信号,则 end 不会突出显示。
;;; 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 describe-syntax表示 ASCII 连字符的语法类在 lisp 交互模式(暂存缓冲区)和文本模式下都是符号类,emacs -Q。 -
不久前我遇到了一个类似的问题。如果您尝试将
\\b替换为\\<\\>或\\_<和\\_>会怎样?我不太记得有什么区别。 -
@wvxvw gist.github.com/jiyoo/6676050 中的示例 4 添加了一个具有不同单词边界符号的测试,并且出现了相同的问题。根据所选答案后的讨论,这似乎是一个在开发版本中得到修复或消失的错误。