根据主要模式更改 Emacs Mode-Line 颜色

Posted

技术标签:

【中文标题】根据主要模式更改 Emacs Mode-Line 颜色【英文标题】:Change Emacs Mode-Line color based on major-mode 【发布时间】:2013-04-01 03:25:01 【问题描述】:

我想看看有没有办法根据major-mode改变mode-link前景色和背景色,

我正在考虑在

中添加逻辑
(add-hook 'after-change-major-mode-hook

但是,我没有 emacs lisp 的所有经验来做出这样的改变。逻辑如下:

switch major-mode:
case "emacs-lisp-mode":
  (set-face-foreground 'mode-line "ivory")
  (set-face-background 'mode-line "DarkOrange2")
case "ruby-mode":
  (set-face-foreground 'mode-line "white")
  (set-face-background 'mode-line "red")
...
default:
  (set-face-foreground 'mode-line "black")
  (set-face-background 'mode-line "white")
end switch

提前非常感谢!

【问题讨论】:

【参考方案1】:

你可能想要这样的东西:

(add-hook 'emacs-lisp-mode-hook
          (lambda ()
            (face-remap-add-relative
             'mode-line '((:foreground "ivory" :background "DarkOrange2") mode-line))))

您可能还想对mode-line-inactive 面部使用面部重映射。

【讨论】:

非常感谢。这很好用 :) 你也愿意帮助我通过使用预定义的列表来组合你的附加钩子吗?类似于“sds”建议,但在预定义列表中的所有模式中添加了颜色?谢谢! 你的意思是像 (dolist (x '((emacs-lisp-mode :foreground "ivory" :background "DarkOrange2") (ruby-mode :foreground "white" :background "red"))) (add-hook (intern (concat (symbol-name (car x)) "-mode")) (lambda () (face-remap-add-relative 'mode-line (cons (cdr x) '(mode-line)))))) 一样,但要注意它只能在 lexical-binding:t 缓冲区中工作。 我试过类似:(add-hook 'shell-mode-hook (lambda () (font-lock-variable-name-face 'mode-line '((:foreground "LightGoldenrod" :weight bold) mode-line)))) 没有任何影响:-(【参考方案2】:

你所说的“逻辑”是这样的:

(add-hook 'after-change-major-mode-hook 'my-set-mode-line-colors)
(defvar my-mode-line-colors
  '((emacs-lisp-mode :foreground "ivory" :background "DarkOrange2")
    (ruby-mode :foreground "white" :background "red")))
(defun my-set-mode-line-colors ()
  (face-remap-add-relative
   'mode-line (list (or (cdr (assq major-mode my-mode-line-colors))
                        '(:foreground "black" :background "white"))
                    'mode-line)))

或者,您可以按照 Stefan 的建议,通过特定于模式的挂钩来执行此操作。

【讨论】:

我实际上对每种模式都有附加钩子。但是,当我将缓冲区从 ruby​​ 切换到 lisp 等时,模式行没有得到更新。因此我想到了“change-major-mode-hook”,你是对的,也没有工作......那是缓冲开关挂钩?我试图寻找类似的东西,但无济于事。谢谢! 问题,正如我所写的,是 emacs 的面不是缓冲区本地的,所以上面的 set-face-foreground 调用会影响所有的窗口和所有的模式行。没有办法使模式行外观缓冲区特定 set-face-foreground 可以按帧设置。即使我有多个帧,我也可以仅为该帧更改模式线...只要我能分辨出何时打开和关闭缓冲区并更改模式线,它应该可以工作..跨度> 如果每个缓冲区有一帧,是的,你应该没问题。我有一个最大化的框架,所以这不是我的方法。

以上是关于根据主要模式更改 Emacs Mode-Line 颜色的主要内容,如果未能解决你的问题,请参考以下文章

结合两种 Emacs 主要模式或更改现有模式的简单方法是啥?

是否可以根据上下文更改 emacs 语法表?

emacs lisp,如何获得缓冲区主要模式?

如何修复 emacs 24 中的 javascript 模式更改?

如何使用Emacs更改文件的读/写模式?

更改代码块的 emacs 组织模式键绑定