Emacs как демон на OS X с оконной системой


13

Я бегу GNU Emacs 23.3.1 какао на OS X 10.6.
Я добавил следующее в ~ / Library / LaunchAgents / gnu.emacs.daemon.plist, чтобы он запустил демон и автоматически перезапустил emacs, если я случайно его убил.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" 
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
 <plist version="1.0">
  <dict> 
    <key>Label</key>
    <string>gnu.emacs.daemon</string>
    <key>ProgramArguments</key>
    <array>
      <string>/Applications/Emacs.app/Contents/MacOS/Emacs</string>
      <string>--daemon</string>
    </array>
   <key>RunAtLoad</key>
   <true/>
   <key>KeepAlive</key>
   <true/>
   <key>ServiceDescription</key>
   <string>Gnu Emacs Daemon</string>
  </dict>
</plist>

Это работает, но я заметил, что моя цветовая тема не работает должным образом. Потом я вспомнил, что добавил в файл инициализации следующее:

(when window-system 
  (require 'alpha)
  (require 'color-theme-ir-black)
  (modify-frame-parameters (selected-frame) '((alpha . 85)))
  (color-theme-ir-black))

Когда она запускается как оконная система демона, она, по-видимому, ложна, и это имеет смысл, однако причина, по которой я добавил это, заключается в том, что мне иногда нравится запускать обычную сборку emacs в терминале из ssh и т. Д., И эта цветовая схема полностью нечитаема в iTerm, поэтому (когда оконная система ...). Есть ли способ заставить emacs запустить оконный режим при запуске с --daemon?

Еще одна проблема, которую я заметил, заключается в том, что когда я запускаю нажатие sw (delete-frame) в режиме dameon, я не получаю ошибку при попытке удалить единственный видимый или иконизированный фрейм, и emacs продолжает работать в фоновом режиме. Мне это нравится по большей части, однако я заметил, что после уничтожения последнего кадра я больше не могу повторно открывать emacs из документа, и, хотя emacs активируется и отображаются меню, они не работают, и я не могу создать новый кадр кроме использования emacsclient из командной строки. У кого-нибудь еще есть эта проблема и / или рекомендация об обходном пути? возможно, я могу связать sw, чтобы определить, был ли последний кадр и iconify-frame вместо этого, но не уверен, почему он считает, что это не последнее окно и позволил мне убить его в первую очередь.

ОБНОВИТЬ:

Я нашел комментарий в следующем блоге Стива Перселла с исправлением очень похожей проблемы: http://emacs-fu.blogspot.com/2009/03/color-theming.html

Секрет, по-видимому, заключается в том, чтобы использовать хук after-make-frame-functions для настройки вновь созданного фрейма, а также для (setq color-theme-is-global nil), чтобы у каждого фрейма была своя собственная цветовая тема. Таким образом, соответствующие разделы моего init теперь выглядят так:

(defvar after-make-console-frame-hooks '()
"Hooks to run after creating a new TTY frame")
(defvar after-make-window-system-frame-hooks '()
"Hooks to run after creating a new window-system frame")

(defun run-after-make-frame-hooks (frame)
"Selectively run either `after-make-console-frame-hooks' or
`after-make-window-system-frame-hooks'"
  (select-frame frame)
  (run-hooks (if window-system
               'after-make-window-system-frame-hooks
               'after-make-console-frame-hooks)))

(add-hook 'after-make-frame-functions 'run-after-make-frame-hooks)
(add-hook 'after-init-hook (lambda ()
  (run-after-make-frame-hooks (selected-frame))))


(setq color-theme-is-global nil)

(add-hook 'after-make-window-system-frame-hooks
          '(lambda ()
             (require 'alpha)
             (require 'color-theme-ir-black)
             (modify-frame-parameters (selected-frame) '((alpha . 85)))
             (color-theme-ir-black)
             (global-set-key (kbd "s-w") 'delete-frame)))

Тем не менее, у меня все еще есть проблема, когда delete-frame закрывает последний кадр, когда emacs был запущен как демон, и не позволяет мне создавать новый кадр, отличный от использования emacsclient.

ОБНОВИТЬ:

Если я eval (frame-list)вижу, есть 2 кадра в списке, хотя виден только один. Я заметил, что этого не происходит, если я запускаю Emacs с открытым /Applications/Emacs.appвместо emacsclient. Обычно я запускаю emacs из командной строки с псевдонимом, e='emacsclient -c -n 'который создает второй кадр. Я могу только прикрепить к другому фрейму, запустив emacs командой open. Если я попробую emacsclient -n somefile без чего-либо, -cя ничего не получу, и если я запустлю, emacsclient -n -e '(frame-list)'я вижу, что есть фрейм, который просто не виден, пока я не использую его -cдля создания нового фрейма или открытия emacs из папки приложений.


Это не похоже на вопрос Emacs.
выступление

Ответы:


1

Запуск процесса или приложения в качестве демона launchd сильно отличает его от запуска в обычном режиме или в командной строке. Интересно, может быть, лучше не использовать вместо этого сценарий оболочки в качестве элемента входа в систему?

Например:

#!/bin/bash
while true
do
  open -W /Applications/Emacs.app
done

Этот сценарий должен быть сохранен в файл с .commandрасширением и 755 разрешениями ( chmod 0755 myemacsscript.command), а затем добавлен в Системные настройки: Вход: панель элементов входа.

Когда вы войдете в систему, Terminal запустит и запустит этот скрипт. Вы, вероятно, захотите настроить профиль терминала по умолчанию, который исключает запрос терминала на выход для этого конкретного сценария, чтобы он не задерживал вас при выходе из системы.

Я понятия не имею, исправит ли это конкретные проблемы с Emacs.app, но это может, по крайней мере, обеспечить среду, более близкую к тому, что ожидает Emacs.app.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.