在Emacs中为字符串""添加高亮显示

3
我有点不熟悉emacs,但不确定如何找到这个。我使用solarized light颜色主题,这是一个低对比度的主题,具有智能强调,使事物易于阅读。在vim版本中,他们做的一件事是以不同于字符串其余部分的方式突出显示字符串定界符(某些语言中的双引号和单引号)。

然而,该主题的emacs端口没有这个功能,但我已经看到字体锁定机制发生了一些非常疯狂的事情(例如http://www.emacswiki.org/emacs/HexColour),所以我认为这是可能的。

那么,是否可以突出显示字符串定界符?如果可以,我应该在哪里查找更多有关如何执行此操作的信息?

编辑:

尝试使Jon O.的答案起作用。首先我尝试了

(defface my-string-delimiter-face
  '((t (:foreground "red" :weight bold)))
   "My custom face for string delimiters")

(add-hook 'after-change-major-mode-hook 
          (lambda () 
            (font-lock-add-keywords nil '(("\\s\"\\|\\s|" 0 solarized-string-delimiter-face t)))))

为了将其添加到每个模式中(未成功),我尝试过。

然后我尝试用以下内容替换挂钩表达式:

(font-lock-add-keywords 'emacs-lisp '(("\\s\"\\|\\s|" 0 solarized-string-delimiter-face t)))

为了让事情顺利进行,尝试着做同样的事情(但没有成功)。
1个回答

5
您可以使用font-lock-add-keywords来突出显示字符串分隔符,例如执行以下操作:
(font-lock-add-keywords 'foo-mode '(("\\s\"\\|\\s|" 0 'my-string-delimiter-face t)))

正则表达式"\\s\"\\|\\s|"匹配一个单一字符,该字符必须具有“字符串引号”语法类(\\s\"部分)或“通用字符串定界符”(\\s|部分)。“\s”匹配各种不同的字符语法类,您可以在Elisp手册中的(elisp)Syntax Tables(elisp)Regexp Backslash中了解更多信息。
如果您不进行字符串转义,则阅读起来会更容易:\s"\|\s| 0表示将面向整个匹配的字符串,并且末尾的t使这个面覆盖任何已经存在于字符串上的面(因为许多模式将使用font-lock-string-face或类似的方式突出显示整个字符串,包括定界符)。 'foo-mode可以是任何模式的引用名称(例如'emacs-lisp-mode'php-mode),或者是nil,仅在当前缓冲区中使此更改局部化。(在这种情况下,您应该将其放在要应用它的模式的模式挂钩中) my-string-delimiter-face可以是任何现有的面,或者您可以通过执行以下操作来定义一个面:
(defface my-string-delimiter-face
  '((t (:foreground "red" :weight bold)))
   "My custom face for string delimiters")

对于一个冗长而琐碎的问题,这是一个很好的答案,但似乎无法使其工作(因为代码过多已在编辑问题时进行了解释)。感谢您的帮助! - Matt Briggs
@MattBriggs:我认为在面名(solarized-string-delimiter-face)之前需要一个引号 '。我总是会忘记这一点,因为默认的字体锁定面既可以作为变量又可以作为引用符号。我编辑了我的答案以反映这一点——现在它对我有用,它能帮到你吗? - user725091
@MattBriggs:另外,在你上面的第二个例子中,你需要写(font-lock-add-keywords 'emacs-lisp-mode ...,因为emacs-lisp-mode是主模式的完整名称。 - user725091
这完全就是它了:D 谢谢,通过解决这个问题,我学到了很多关于emacs的知识,我很高兴我的主题看起来更像我习惯的样子! - Matt Briggs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接