在'之后;emacs——执事';我无法在EmacClient框架中看到新主题。它从';emacs M-x服务器启动&x27;

在'之后;emacs——执事';我无法在EmacClient框架中看到新主题。它从';emacs M-x服务器启动&x27;,emacs,themes,elisp,config,daemon,Emacs,Themes,Elisp,Config,Daemon,最小配置 情景1 从终端运行“emacs” M-x服务器启动 从终端运行“EmacClient-c” 效果:应用主题 情景2 从终端运行“emacs--daemon” 运行“EmacClient-c” 效果:不应用主题 为什么呢 .emacs.d/init.d配置: (require 'package) (package-initialize) (defun install-pack (p) "A utility function to help in installing emacs

最小配置

情景1

  • 从终端运行“emacs”
  • M-x服务器启动
  • 从终端运行“EmacClient-c”
  • 效果:应用主题
情景2

  • 从终端运行“emacs--daemon”
  • 运行“EmacClient-c”
  • 效果:不应用主题
为什么呢

.emacs.d/init.d配置:

(require 'package)
(package-initialize)

(defun install-pack (p)
"A utility function to help in installing emacs package."
(unless (package-installed-p p) (package-install p)))

(defun install-packs (packs)
"A utility function to help in installing emacs packages."
(unless package-archive-contents
        (package-refresh-contents))
(dolist (p packs) (install-pack p)))

;(load-theme 'tronesque)
(load-theme 'tronesque t)


由于它是一个守护进程启动,因此在涉及
加载主题
函数时没有创建任何帧。启动后,您通过输入'emacsclient-c'创建了一个新的框架,当然什么也没有发生

因此,您必须告诉emacs在创建帧后应用主题。制作框架功能后的挂钩
用于:

(if (daemonp)
    (add-hook 'after-make-frame-functions
              (lambda (frame)
                (load-theme 'tronesque t)))
    (load-theme 'tronesque t))

如果是守护进程启动,请在创建帧后加载主题,否则直接加载主题。

以上答案的以下扩展修复了我在Emacs 24中遇到的问题,通过颜色主题调用设置颜色主题,如solarized主题所示

(if (daemonp)
(add-hook 'after-make-frame-functions
          '(lambda (f)
             (with-selected-frame f
               (when (window-system f) (color-theme-solarized-dark)))))
(color-theme-solarized-dark))

J.

对于Emacs 24

(if (daemonp)
    (add-hook 'after-make-frame-functions
        (lambda (frame)
            (select-frame frame)
            (load-theme 'tronesque t)))
    (load-theme 'tronesque t))


应该这样做。

使用所有提到的方法,从第二帧创建开始重新加载主题是徒劳的

因为我只加载了一次:

(if (daemonp)
    (add-hook 'after-make-frame-functions (lambda (frame)
                        (when (eq (length (frame-list)) 2)
                            (progn
                              (select-frame frame)
                              (load-theme 'tronesque)))))
  (load-theme 'tronesque 1))
更新 在Emacs24.5.1中使用杰出的主题并使用Emacs作为守护进程进行了一些测试之后,我发现了一些问题

如果我的第一个客户端是一个终端
emacsclient-t
,然后我打开一个窗口客户端
emacsclient-c
,那么窗口客户端将丢失主题配置

然后我想出了这个解决方案:

;; theme
(defvar my:theme 'distinguished)
(defvar my:theme-window-loaded nil)
(defvar my:theme-terminal-loaded nil)

(if (daemonp)
    (add-hook 'after-make-frame-functions(lambda (frame)
                       (select-frame frame)
                       (if (window-system frame)
                           (unless my:theme-window-loaded
                             (if my:theme-terminal-loaded
                                 (enable-theme my:theme)
                               (load-theme my:theme t))
                             (setq my:theme-window-loaded t))
                         (unless my:theme-terminal-loaded
                           (if my:theme-window-loaded
                               (enable-theme my:theme)
                             (load-theme my:theme t))
                           (setq my:theme-terminal-loaded t)))))

  (progn
    (load-theme my:theme t)
    (if (display-graphic-p)
        (setq my:theme-window-loaded t)
      (setq my:theme-terminal-loaded t))))

我知道它不是很优雅,但是解决了这两个问题(不必要的重新加载配置丢失)。

我很确定这不必要(基于我使用的zenburn主题在emacs-daemon加载时与普通的
加载主题
调用配合很好)。我很想知道这是否解决了问题。我在Emacs 24上也遇到了同样的问题,但这并不能解决我的问题。我在solarized上也遇到了同样的问题,而且这个问题很有效。我很好奇为什么这是必要的,因为其他主题没有这个解决方法。这些方法记录所有框架的主题。不仅是新的。有没有办法绕过这个问题?调用
(load“myteme.el”)
怎么样?这对我不起作用(Emacs 27)。这是唯一一个对同时打开的终端和窗口客户端都有效的答案,没有在每个新帧上加载主题;所以我相信这应该是公认的答案。
(除非(成员:我的主题自定义已知主题)…)
(if (daemonp)
    (add-hook 'after-make-frame-functions (lambda (frame)
                        (when (eq (length (frame-list)) 2)
                            (progn
                              (select-frame frame)
                              (load-theme 'tronesque)))))
  (load-theme 'tronesque 1))
;; theme
(defvar my:theme 'distinguished)
(defvar my:theme-window-loaded nil)
(defvar my:theme-terminal-loaded nil)

(if (daemonp)
    (add-hook 'after-make-frame-functions(lambda (frame)
                       (select-frame frame)
                       (if (window-system frame)
                           (unless my:theme-window-loaded
                             (if my:theme-terminal-loaded
                                 (enable-theme my:theme)
                               (load-theme my:theme t))
                             (setq my:theme-window-loaded t))
                         (unless my:theme-terminal-loaded
                           (if my:theme-window-loaded
                               (enable-theme my:theme)
                             (load-theme my:theme t))
                           (setq my:theme-terminal-loaded t)))))

  (progn
    (load-theme my:theme t)
    (if (display-graphic-p)
        (setq my:theme-window-loaded t)
      (setq my:theme-terminal-loaded t))))