【问题标题】:Change Emacs Mode-Line color based on major-mode根据主要模式更改 Emacs Mode-Line 颜色
【发布时间】: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

提前非常感谢!

【问题讨论】:

    标签: emacs elisp emacs-faces modeline


    【解决方案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 可以按帧设置。即使我有多个帧,我也可以仅为该帧更改模式线...只要我能分辨出何时打开和关闭缓冲区并更改模式线,它应该可以工作..跨度>
    • 如果每个缓冲区有一帧,是的,你应该没问题。我有一个最大化的框架,所以这不是我的方法。
    猜你喜欢
    • 2011-05-28
    • 1970-01-01
    • 2012-12-18
    • 2013-11-12
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    相关资源
    最近更新 更多