特定次要模式的模式行中的自定义颜色

时间:2012-10-23 15:07:07

标签: emacs configuration fonts colors

纯粹出于眼睛糖果的原因,我希望在模式行中显示一个次要模式'((()))'(不带单引号)。

适用于rainbow-delimiters-mode。到目前为止,我在我的 .emacs 中得到了以下内容,它可以正常工作:

(setq minor-mode-alist (cons '(rainbow-delimiters-mode " ((()))") minor-mode-alist))

但是现在我想在模式线中使用三种不同的颜色,以便我的模式中的括号“反映”彩虹分隔符模式的作用。

我应该怎么做? (我不关心匹配实际颜色rainbow-delimiters-mode正在使用的颜色)

1 个答案:

答案 0 :(得分:1)

这将在Emacs 24.2.1中进行测试:

(setq minor-mode-alist
      `((rainbow-delimiters-mode " ")
        (rainbow-delimiters-mode #("(" 0 1 (face rainbow-delimiters-depth-1-face)))
        (rainbow-delimiters-mode #("(" 0 1 (face rainbow-delimiters-depth-2-face)))
        (rainbow-delimiters-mode #("(" 0 1 (face rainbow-delimiters-depth-3-face)))
        (rainbow-delimiters-mode #(")" 0 1 (face rainbow-delimiters-depth-3-face)))
        (rainbow-delimiters-mode #(")" 0 1 (face rainbow-delimiters-depth-2-face)))
        (rainbow-delimiters-mode #(")" 0 1 (face rainbow-delimiters-depth-1-face)))
        ,@(assq-delete-all 'rainbow-delimiters-mode minor-mode-alist)))

它使用字符串属性为次要模式指示符添加颜色 - #("(" 0 1 (face foo-face))"语法指定一个单字符字符串,face属性设置为foo-face范围[ 0,1)。

由于字符串可以具有许多属性,因此可以预期能够为每个字符指定具有不同面的单个minor-mode-alist条目。但是,由于可能是Emacs错误,在显示模式行时只会考虑次模式指示符的第一个字符的属性。为了解决这个问题,代码利用了Emacs为同一模式合并多个minor-mode-alist指标的事实。它为rainbow-delimiters-mode指定了几个字符串,每个字符串都有自己的颜色,并使用assq-delete-allminor-mode-alist中删除旧的彩虹分隔符条目。

为了完整性,这里是单入口代码,在Emacs 24.2.1中显示为无色,因为它的第一个字符没有指定面:

(setq minor-mode-alist
      `((rainbow-delimiters-mode #(" ((()))"
                                   1 2 (face rainbow-delimiters-depth-1-face)
                                   2 3 (face rainbow-delimiters-depth-2-face)
                                   3 4 (face rainbow-delimiters-depth-3-face)
                                   4 5 (face rainbow-delimiters-depth-3-face)
                                   5 6 (face rainbow-delimiters-depth-2-face)
                                   6 7 (face rainbow-delimiters-depth-1-face)))
        ,@(assq-delete-all 'rainbow-delimiters-mode minor-mode-alist)))