不能在Emacs中将颜色主题应用到一帧?

时间:2010-06-14 08:43:01

标签: emacs themes customization

我的.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文件中的相应行。我该怎么做才能让它发挥作用?

2 个答案:

答案 0 :(得分:4)

我通常将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作为守护程序,自定义只会在你创建第二个框架后启动,弹出的第一个框架将具有标准主题。

答案 1 :(得分:3)

我认为你的术语是关闭的:在emacs中说frame表示人们在图形环境中通常用window表示的含义。 (也就是说,具有关闭,最小化和最大化按钮以及标题栏等的东西是“框架”。)而当你执行C-x 3(拆分窗口)时显示的东西被称为windows,当您执行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))

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