После "emacs --deamon" я не вижу новую тему в рамке emacsclient. Он работает с 'emacs M-x server-start'

Минимальная конфигурация https://www.refheap.com/18816

Сценарий 1.

  • Запустите 'emacs' из терминала.
  • запуск сервера M-x
  • Запустите 'emacsclient -c' из терминала.
  • Эффект: Тема применяется.

Сценарий 2.

  • Запустить 'emacs --daemon' из терминала
  • Запустить 'emacsclient -c'
  • Эффект: Тема не применяется.

Почему это?

.emacs.d/init.d config:

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

Ответ 1

Для 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))

.

Ответ 2

Используя все упомянутые подходы, тема перенаправляется напрасно, начиная с создания второго кадра.

Для загрузки его только один раз я сделал:

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

Update

После некоторых тестов в 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))))

Это не так элегантно, я знаю, но решает две проблемы (ненужная перезагрузка и потеряна конфигурация).

Ответ 3

Следующее расширение вышеупомянутого ответа устранило проблему для меня с помощью Emacs 24, установив цветную тему через вызов цветной темы, как показано с помощью соляризованной темы.

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

Ответ 4

Поскольку это запуск демона, не было никакого кадра, созданного при использовании функции 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))

Если это запуск демона, загрузите тему после создания фреймов, иначе загрузите тему напрямую.