2013-09-22 84 views
1

下面的代码无法在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的荧光笔是否生病。如果它形成病态或静默地发出错误信息,则结束将不会突出显示。


;;; 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)) 
+0

模式可以定义其自己的chartables,其中字符的含义可以被不同地定义(分配给不同的字符类)。特别是连字符,下划线,印记符号(有些时候会计入单词组成部分,有时不计算在内)的符号会受到局部修改。您应该检查模式本地图表,并查看哪些sytnax类被分配给正在讨论的角色。 – 2013-09-22 20:29:35

+0

@wvxvw'M-x describe-syntax'表示用于ASCII连字符的语法类是符号类,既在lisp交互模式下(临时缓冲区)也在文本模式下,在'emacs -Q'中。 –

+0

不久之前,我遇到了类似的问题。如果您尝试用'\\ <' '\\>'或'\\ _ <' and '\\_>'替换'\\ b',该怎么办?我不记得有什么不同。 – 2013-09-23 13:35:19

回答

1

,它不以缓冲*scratch*的事实表明,它是与当前模式的问题。主要有两种可能性:

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

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

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

+0

2和3的字符语法是单词,而ASCII连字符是符号,在lisp交互模式和文本模式下,根据'C-u C-x ='从'emacs -Q'说出。我已经添加了示例3和建议的覆盖。在文本模式缓冲区中,我的意思是说突出显示在文本模式缓冲区中不会失败,即突出显示是成功的。仍然使用新的示例3(来自'emacs -Q'),'xy-xy'内的'xy'在暂存缓冲区中不会突出显示。 –

+0

当我在文本模式缓冲区中的'emacs -Q'中执行例3时,'xy' ***在'xy-xy'中突出显示(只有连字符未突出显示)。在Emacs-Lisp模式下也是如此。如果你没有从'emacs -Q'看到这个,试着查看'C-h v font-lock-keywords'来看看发生了什么。有点难以置信,我们会看到'emacs -Q'的不同。你可能正在使用'emacs -Q -nw'? (不知道这是否会有所作为。) – Drew

+0

因为我在MS Windows上使用Emacs,所以我运行的是'runemacs.exe -Q'。我尝试在[示例4](https://gist.github.com/jiyoo/6676050)中使用'set'而不是'append'来简化事情。当我在'runemacs.exe -Q'的emacs-lisp-mode buffer中评估例4中的progn格式时,'xy-xy'中的'xy'未被高亮显示。与“ab-ab”相同。 'font-lock-keywords'的值似乎并不包含任何可能会干扰的内容。与字体锁不同,'isearch-forward-regexp'继续识别'xy-xy'中的'xy'。 –