【问题标题】:word boundary in Emacs font lock keywordsEmacs字体锁定关键字中的单词边界
【发布时间】: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 添加了一个具有不同单词边界符号的测试,并且出现了相同的问题。根据所选答案后的讨论,这似乎是一个在开发版本中得到修复或消失的错误。

标签: emacs elisp font-lock


【解决方案1】:

它不在缓冲区*scratch* 中的事实表明这是当前模式的问题。主要有两种可能:

  • @wvcvw 建议:检查字符23 的语法类是什么。

  • 已经为模式定义的 font-lock-keywords 与您的代码交互——例如,它们会覆盖它。尝试将'APPEND 作为第三个参数添加到font-lock-add-keywords。尝试将t 作为HIGHLIGHT 表达式添加到您的荧光笔性别(请参阅文档)。这应该让您的突出显示覆盖任何可能已经存在的内容。

顺便说一句,您说它在“文本缓冲区”中不起作用,但这是什么意思?从emacs -Q 开始,在text-mode 的缓冲区中评估您的代码表明它确实 有效。调查您的“文本缓冲区”模式是什么,并尝试上面的建议(必要时两个项目符号,但先尝试第二个)。

【讨论】:

  • 2 和 3 的字符语法是单词,ASCII 连字符是符号,在 lisp 交互模式和文本模式下,根据 C-u C-x = 来自 emacs -Q 的说法。我已经添加了示例 3,并带有建议的覆盖。在文本模式缓冲区上,我的意思是在文本模式缓冲区中突出显示不会失败,即突出显示是成功的。仍然使用新的示例 3(来自 emacs -Q),xy-xy 内的 xy 不会在暂存缓冲区中突出显示。
  • 当我在 emacs -Q 在文本模式缓冲区中执行您的示例 3 时,xy xy-xy 中突出显示(仅连字符未突出显示)。在 Emacs-Lisp 模式下也是如此。如果您没有从emacs -Q 看到此内容,请尝试查看C-h v font-lock-keywords 以了解发生了什么。有点难以相信我们会看到与emacs -Q 的不同之处。您是否在使用emacs -Q -nw? (不知道这是否会有所作为。)
  • 由于我在 MS Windows 上使用 Emacs,所以我运行的是 runemacs.exe -Q。我尝试在Example 4 中使用set 而不是append 来简化事情。当我在 runemacs.exe -Q 的 emacs-lisp-mode 缓冲区中评估示例 4 中的 progn 表单时,xy-xy 中的 xy 未突出显示。与ab-ab 相同。 font-lock-keywords 的值似乎不包含任何可能干扰的内容。 isearch-forward-regexp 继续识别xy 中的xy-xy 与字体锁定不同。
  • 我正在使用 GNU Emacs 24.3.1 (i386-mingw-nt6.1.7601),以防这是在更高版本中修复的某种错误
  • 好的。 1)我看不到示例 4。2)在 Emacs 24.4(开发快照)中的 Emacs-Lisp 模式下的示例 3,我认为没有问题。有了它在 24.3(或之前)中,我看到了你所看到的:xy-xy 没有突出显示 xy。不知道哪个错误修复可能影响了这一点。 HTH。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-08
  • 2012-12-12
  • 2012-05-22
相关资源
最近更新 更多