基于主模式更改Emacs模式线条颜色

基于主模式更改Emacs模式线条颜色,emacs,elisp,emacs-faces,modeline,Emacs,Elisp,Emacs Faces,Modeline,我想看看是否有办法根据主模式更改模式链接前景和背景颜色 我想把逻辑添加到 (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") c

我想看看是否有办法根据主模式更改模式链接前景和背景颜色

我想把逻辑添加到

(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
非常感谢

“逻辑”是这样的:

(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的建议,从特定于模式的钩子中执行此操作。

您可能需要以下内容:

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

您可能还希望对非活动的
模式行
面使用面重新映射。

实际上,我为每个模式都设置了添加挂钩。但当我将缓冲区从ruby切换到lisp等时,模式行没有得到更新。。所以我想到了“改变主要模式挂钩”,你是对的,两者都不起作用。。。那是缓冲开关钩吗?我试着找类似的东西,但没用。谢谢正如我所写的,问题在于emacs面不是缓冲区本地的,因此上面设置的面前台调用将影响所有窗口和所有模式行。无法使模式行外观缓冲区具体化。设置的面前景可以按帧设置。即使我有多个帧,我可以改变模式线只为该帧。。。只要我能告诉你什么时候缓冲区被切换,什么时候切换模式行,它就会工作。如果你每个缓冲区有一帧,是的,你会没事的。我有一个最大化的框架,所以这不是我的方法。非常感谢。这工作得很好:)你也能帮我使用一个预定义的列表来组合你的addhook吗?类似于“sds”的建议,但添加钩子到预定义列表中的所有模式,并使用颜色?谢谢你的意思是像(
)(dolist(x'((emacs lisp模式:前景“象牙”:背景“达科朗日”)(红宝石模式:前景“白色”:背景“红色”))(add hook(intern(concat(符号名(car x)))))))(lambda()(面重映射添加相对“模式行(cons(cdr x)”(模式行“))))
t注意,它只能在
词法绑定:t
缓冲区中工作。