使用Emacs守护程序时终端和图形框架的不同主题


20

我正在尝试在Emacs24中实现以下行为:

我喜欢使用不同的主题(日光与日光),具体取决于我是否通过端子架连接到正在运行的服务器

% emacsclient -t

或带有gtk框架

% emacsclient -c

这似乎在较旧的Emacs中有效,但是当前的Emacs我找不到方法。我经常检查SO(例如/programming//q/18904529/152439和答案)和邮件列表(例如https://lists.gnu.org/archive/html/help-gnu-emacs/ 2012-02 / msg00227.htmlhttps://lists.gnu.org/archive/html/help-gnu-emacs/2012-02/msg00237.html)。

我当前的设置如下所示:

(add-to-list 'custom-theme-load-path "~/.emacs.d/themes/solarized")
(if (daemonp)
  (add-hook 'after-make-frame-functions
    (lambda (frame)
      (select-frame frame)
      (if (display-graphic-p frame)
        (load-theme 'solarized-light t)
        (load-theme 'solarized-dark t)
      )
    )
  )
  (load-theme 'solarized-light t)
)

问题是,如果我打开一个图形框架,然后使用打开一个终端框架emacsclient -t,则主题solarized-dark会同时应用于新的终端框架(正确)和已经打开的图形框架(应该保留)最好保持原样)。当终端框架已经打开并且我使用打开一个新的图形框架时,就会发生这种情况emacsclient -c

编辑:万一当前的Emacs24无法做到这一点,是否有任何计划使其再次成为可能?


1
Afaik(出于其他目的,为此而进行了其他搜索),旧的颜色主题实现允许某些每个缓冲区设置。随着emacs 24的到来,内置的主题支持(称为deftheme或load-theme)不支持此主题:整个emacs会话的主题都是相同的。对于这种设置,也许您可​​以通过始终加载solarized-dark并使用-rv标志启动图形框架来管理可接受的hack,但这远非完美。
T. Verron 2014年

一种解决方法是为终端和GUI运行单独的客户端,如下所述:emacs.stackexchange.com/q/41/93 根据您的工作流程,这可能不是可行的解决方案。它对我有用,因为我每个人都执行不同类型的任务,几乎没有重叠。
nispio 2014年

如果emacs24中的内置定制主题不符合您的需求,则您可以始终使用color-theme.el具有框架相关颜色设置的IIRC。除了普遍存在之外,使用内置主题功能没有太大优势。
瓦姆西2014年

2
color-theme-buffer-localcolor-themeEmacs 24主题系统和Emacs 24主题系统都提供了本地缓冲区主题支持。如果您决定走这条路线,我的solarized主题版本也支持两个系统。
sanityinc 2014年

@sanityinc谢谢;我正在使用Emacs 24.3,似乎有一些问题,请参阅github.com/vic/color-theme-buffer-local/issues/5。但我会密切注意该项目。
andreas-h 2014年

Answers:


8

您不能使用其他主题来执行此操作。解决方案是根据终端创建具有不同面孔定义的主题。如果您查看类似的示例font-lock-comment-face,您将了解其工作原理。除了指定的((class color) (min-colors 88) (background dark)),你也可以specifcy (type tty)(type graphic)等本手册有更多的信息

(defface font-lock-comment-face
  '((((class grayscale) (background light))
 :foreground "DimGray" :weight bold :slant italic)
(((class grayscale) (background dark))
 :foreground "LightGray" :weight bold :slant italic)
(((class color) (min-colors 88) (background light))
 :foreground "Firebrick")
(((class color) (min-colors 88) (background dark))
 :foreground "chocolate1")
(((class color) (min-colors 16) (background light))
 :foreground "red")
(((class color) (min-colors 16) (background dark))
 :foreground "red1")
(((class color) (min-colors 8) (background light))
 :foreground "red")
(((class color) (min-colors 8) (background dark))
 :foreground "yellow")
(t :weight bold :slant italic))
  "Font Lock mode face used to highlight comments."
  :group 'font-lock-faces)

我猜您可以编写一个接受两个主题并生成合并主题的函数,并在两个原始主题都使用的情况下分配来自一个主题的面孔,并分配来自另一个主题的(type tty)面孔。(type graphic)t



2

您可以在自定义编辑器中定义面部自定义的条件,例如“终端模式”或“最小颜色”:

自定义面部时,单击[状态]按钮,然后选择“显示所有显示规格”。然后,您可以设置面部进一步专业化的条件。

这是将框架为tty时将背景色设置为黑色的最小变体:

(custom-set-faces
 '(default (
            (((type tty) (min-colors 256))
             (:background "black"))
            (t
             (:background "#181a26")))
    ))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.