2011-11-01 162 views
2

我是一位emacs noob,但不太清楚如何找到它。我使用solarized light颜色主题,这是一个低对比度主题,具有智能口音以保持可读性。他们在vim版本中做的一件事是突出显示字符串分隔符(意思是某些语言中的双引号和单引号),然后与字符串的其余部分不同,以使它们更加突出。在emacs字符串中突出显示“”

主题的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))) 

更换钩表达在试图刚让事情工作,同样的事情(没有工作)

回答

4

您可以使用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使这一变化buffer- LOCA l仅在当前缓冲区中。 (在这种情况下,你应该把这个模式的模式挂钩,你想将它应用到)

my-string-delimiter-face可以是任何现有的脸,或者你也可以做类似下面的定义之一:

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

对于一个漫长而漫长的问题,很好的答案,似乎无法让它工作,虽然(在编辑中解释了这个问题,因为它的一堆代码)感谢您的帮助! –

+0

@MattBriggs:我想你可能需要在面名('solarized-string-delimiter-face')之前加'''。我总是忘记这一点,因为默认的字体锁定面既可以作为变量也可以引用符号。我编辑了我的答案以反映这一点 - 它现在似乎对我有用,它对你有帮助吗? –

+0

@MattBriggs:另外,在你的第二个例子中,你需要编写'(font-lock-add-keywords'emacs-lisp-mode ...',因为'emacs-lisp-mode'是主要模式 –