Emacs як демон на OS X із віконною системою


13

Я використовую 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 з папки програм.


Це не схоже на питання Emacs.
закінчення

Відповіді:


1

Запуск процесу чи програми як демон, що запускається, дає йому зовсім інше середовище від звичайного запуску або в командному рядку. Цікаво, чи може це не спрацювати, замість цього використовувати сценарій оболонки як елемент входу.

Наприклад:

#!/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.