18

最小配置https://www.refheap.com/18816

情景 1。

  • 从终端运行“emacs”。
  • Mx 服务器启动
  • 从终端运行“emacsclient -c”。
  • 效果:应用主题。

情景 2。

  • 从终端运行'emacs --daemon'
  • 运行'emacsclient -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)

或者

;(load-theme 'tronesque)
;;(load-theme 'tronesque t)
(custom-set-variables
;; custom-set-variables was added by Custom.
'(custom-enabled-themes (quote (tronesque)))
'(custom-safe-themes (quote    ("b8f561a188a77e450ab8a060128244c81dea206f15c1152a6899423dd607b327" default))))
 (custom-set-faces
 ;; custom-set-faces was added by Custom.
 )
4

4 回答 4

20

对于 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)
            (with-selected-frame frame
                (load-theme 'tronesque t))))
    (load-theme 'tronesque t))

应该做。

于 2014-05-15T03:48:27.683 回答
8

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

我只加载了一次:

(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))

更新

在 Emacs 24.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))))

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

于 2016-01-09T18:28:11.507 回答
3

上述答案的以下扩展解决了我使用 Emacs 24 的问题,通过 color-theme 调用设置颜色主题,如 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。

于 2014-02-12T15:22:16.593 回答
2

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

因此,您必须告诉 emacs 在创建框架后应用主题。钩子after-make-frame-functions是为此而设计的:

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

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

于 2013-09-22T20:03:55.133 回答