【问题标题】:Cant apply color theme to one frame in Emacs?无法将颜色主题应用于 Emacs 中的一帧?
【发布时间】:2010-06-14 08:43:01
【问题描述】:

我的.emacs 文件是here。我希望当我在shell-mode 时改变主题。但是发生的事情是主题被应用到所有窗口。我将变量color-theme-is-global设置为nil,但问题依旧存在。

(add-hook 'shell-mode-hook 'color-theme-monokai-terminal)
(set-variable 'color-theme-is-global nil)

这些是我的.emacs 文件中的相应行。我应该怎么做才能让它发挥作用?

【问题讨论】:

  • 我不确定我是否理解这个场景。你想为只运行 shell 模式的框架使用不同的主题吗?
  • 仅外壳模式。这就是我添加钩子的原因。

标签: emacs themes customization


【解决方案1】:

我通常将 Emacs 作为守护进程启动,然后根据需要打开框架。我为 X 框架和终端框架使用不同的颜色主题,如下所示:

(require 'color-theme)
(color-theme-initialize)

(defun apply-color-theme (frame)
  "Apply color theme to a frame based on whether its a 'real'
   window or a console window."
  (select-frame frame)
  (if (window-system frame)
      (color-theme-tango)
    (color-theme-tango-black)))

(setq color-theme-is-global nil)
(add-hook 'after-make-frame-functions 'apply-color-theme)

您可以将 (if window-system ...) 部分替换为您对 shell-script-mode 的检查,并将 color-theme-X 部分替换为您喜欢的主题。

这样做有一个缺点:如果您不将 Emacs 作为守护程序启动,则自定义只会在您创建第二个框架后启动,弹出的第一个框架将具有标准主题。

【讨论】:

  • 这个问题是,我无法在创建框架时检查框架的模式。我本可以早点制作一个框架,现在正在打开它的 shell 模式。
【解决方案2】:

我认为您的术语已关闭:在 emacs 中,frame 表示人们通常在图形环境中使用window 的意思。 (也就是说,具有关闭、最小化和最大化按钮以及标题栏等的东西是“框架”。)而当您执行C-x 3(拆分窗口)时出现的东西称为@987654324 @,当您执行M-x shell-mode 之类的操作时,您会得到一个新的buffer,它可能在也可能不在新窗口中。

颜色主题总是框架全局的(据我所知,这肯定是文档所建议的)变量 color-theme-is-global 确定单个主题是否跨框架传播

我认为最接近您想要的东西是(完全未经测试,可能已损坏):

(defun shell-mode-in-new-frame ()
    (interactive)
    (select-frame (make-frame))
    (color-theme-monokai-terminal)
    (shell-mode))

虽然这确实创建了一个新框架,但 不是你想要的。

【讨论】:

  • 我的术语不正确。我现在已经编辑过了。那么有没有办法一个窗口可以与其他窗口不同的主题?
  • 我从未尝试过,但我想这会相当困难,甚至可能是不可能的。您需要设置很多变量,并且需要将它们全部设置为缓冲区本地。其中一些可能在 C 源代码中,并且不可缓冲本地化。但我只是猜测那里。根据我的经验,尽管大多数模式都提供了足够多的特定于模式的面孔。 (尝试 M-x list-faces-display 激活 shell 模式,并寻找 comint-* 面,这是 [我很确定] shell 模式使用的。)
  • 我想这很难。感谢您让我提出正确的问题。按照您的建议,我可以部分更改 shell 模式缓冲区,但不能完全更改。
  • 是的,完全正确。从概念上讲,每一个重要的面孔(我之前没有说,但“面孔”是 emacs 的“文本颜色”的说法)可以被设为缓冲区本地,在这种情况下它只是做类似的事情 (add-hook 'shell-mode-hook (lambda () (setq (make-local-variable background-color) "new-color") (setq (make-local-variable "something else" )“新颜色”)))为您关心的每一张脸。你知道,这很乏味但可能。也许尝试一次为您关心的一两张脸这样做,将它们设置为您想要的颜色主题中的值?
猜你喜欢
  • 2011-12-02
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多