这将做到这一点,在 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)))