Я використовую gnu emacs 23.3.1 какао-версію на ОС 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>
Цей сорт працює, але я помітив, що моя кольорова тема не працює належним чином. Потім я згадав, що додав у свій файл init таке:
(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) у режимі Дамеона, я не отримую спроби помилки видалити єдиний видимий або виразний кадр, а emacs продовжує працювати у фоновому режимі. Мені це подобається здебільшого, проте я помітив, що після вбиття останнього кадру я більше не можу відкривати emacs з doc, і хоча emacs активується, а меню відображаються, вони не працюють, і я не можу створити новий кадр за винятком використання emacsclient з командного рядка. Хтось ще має цю проблему та рекомендацію щодо вирішення проблеми? можливо, я можу пов'язувати sw, щоб виявити, якщо останній кадр та іконіфікований кадр замість цього, але не впевнений, чому він вважає, що це не останнє вікно, і дозволив мені вбити його в першу чергу.
ОНОВЛЕННЯ:
Я знайшов коментар до наступного блогу Стіва Перселла з виправленням дуже подібної проблеми: http://emacs-fu.blogspot.com/2009/03/color-theming.html
Секрет, який, здається, полягає у використанні функції "after-make-frame-функции-гачок" для установки новоствореного кадру, а також для (setq color-theme-is-global nil), щоб кожен кадр міг мати свою кольорову тему. Тож відповідні розділи моєї ініти тепер виглядають так:
(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)
бачу, перераховані два кадри, хоча видно лише один. Я помітив, що цього не відбувається, якщо я запускаю Emacs з відкритим, /Applications/Emacs.app
а не emacsclient. Я зазвичай запускаю emacs з командного рядка з псевдонімом, e='emacsclient -c -n '
який створює другий кадр. Мені здається, що я можу приєднатися до іншого кадру, запустивши emacs з відкритою командою. Якщо я спробую emacsclient -n деякий файл, -c
я нічого не отримаю, і якщо я запускаю, emacsclient -n -e '(frame-list)'
я бачу, що є кадр, його просто не видно, поки я не використаю -c
для створення нового кадру або відкриття emacs з папки програм.