根据主要模式更改 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 主要模式或更改现有模式的简单方法是啥?