0

纯粹出于吸引眼球的原因,我希望在模式行中显示一种次要模式,具有 '((()))' (不带单引号)。

是为rainbow-delimiters-mode. 到目前为止,我在我的.emacs中得到了以下内容并且它有效:

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

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

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

4

1 回答 1

2

这将做到这一点,在 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 错误,在显示模式行时,仅考虑次要模式指示器的第一个字符的属性。为了解决这个问题,代码利用了 Emacsminor-mode-alist为同一模式合并多个指标的事实。它为 指定了几个字符串,每个字符串都有自己的颜色,rainbow-delimiters-mode并用于assq-delete-all从 中删除旧的彩虹分隔符条目minor-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)))
于 2012-10-24T22:21:03.867 回答