Emacsdaemon и Emacsclient на Mac

25

ОС: OS X 10.9.5, Маверикс

GNU Emacs 24.3.1 (x86_64-apple-darwin13.1.0, Carbon версии 1.6.0 AppKit 1265.19) от 2014-04-03 на Rainers-MacBook-Pro-3.local

Я установил emacs через homebrew от Railwaycat, и он работает хорошо - нареканий нет. Я не использую Emacs в Termoinal, и я обычно запускаю его через Приложение.

Как я уже сказал - я счастлив до сих пор.

У меня есть только одна вещь, которую мне не удалось получить (которая раньше работала в Linux), а именно:

  1. получить демон emacs начиная с логина
  2. используя emacsclient, чтобы открыть
  3. закройте emacsdaemon и сохраните все файлы при выходе

Какие-нибудь рабочие рецепты, которые могли бы помочь мне настроить это?

Добавлена ​​информация

Чтобы запустить демон emacs при входе в систему

Я создал приложение Automator, выполнив команду bash

/usr/local/bin/emacs --daemon

и добавил его к элементам входа в систему, который работает хорошо.

Использование демона из терминала

Я могу использовать демон Emacs, используя

emacsclient .bashrc

который открывает .bashrc в терминальной сессии emacs.

Использование из GUI

Теперь остается вопрос: как я могу использовать его из графического интерфейса?

Как я понимаю emacsclient, я не могу открыть emacsclient, пока я не укажу файл для открытия.

Я хотел бы открыть графический интерфейс emacsclient и открыть все файлы, которые были ранее открыты ? Это возможно?

Я узнал, что я могу использовать

emacsclient -c

в терминале делать то, что я хочу - но могу ли я сделать то же самое для графического интерфейса?

Rainer
источник
Я не понимаю, что значит "из GUI" здесь. Это может означать «двойной щелчок по файлу в Finder» или что-то еще полностью.
tarsius
Использование App Launcher (например, с помощью Spotlight)
Rainer
Позволяет ли в Панели запуска приложений выбирать файлы (которые затем открываются с использованием приложения по умолчанию для типа файла). Или только "Приложения"? emacsclientне является приложением в том, что касается OS X, а только Emacs(и только если оно установлено таким образом). Почему бы вам просто не использовать привязки системных клавиш для выбора открытого приложения / окна? (Не будет работать, если Emacs был запущен в режиме демона и пока нет фрейма ("окна")).
tarsius
Я определил приложение под названием Emacsclient, которое запускает emacsclient - так что приложение Emacsclient там. Я, очевидно, мог бы переключиться на работающий экземпляр emacs - но это не главное, рассматривая рабочий процесс, описанный выше.
Райнер
1
Этот вопрос почти более полезен, чем его ответы :)
Рой Truelove

Ответы:

6

Я действительно не против того, чтобы Emacs.app всегда работал, но тот факт, что я не мог закрыть окно без случайного убийства сервера Emacs, раздражал. И даже если вы действительно изо всех сил пытаетесь убить последний кадр, он все равно не дает вам: «Попытаться удалить единственный видимый или иконизированный кадр». ... Так что мы обманываем.

Это решение просто скрывает Emacs (например, Command+ h), когда вы пытаетесь закрыть последнее окно, нажав кнопку закрытия.

Добавьте куда-нибудь следующее в ваш Emacs init:

(defadvice handle-delete-frame (around my-handle-delete-frame-advice activate)
  "Hide Emacs instead of closing the last frame"
  (let ((frame   (posn-window (event-start event)))
        (numfrs  (length (frame-list))))
    (if (> numfrs 1)
      ad-do-it
      (do-applescript "tell application \"System Events\" to tell process \"Emacs\" to set visible to false"))))

Добавьте Emacs в «Пользователи и группы> Элементы входа» и установите флажок «Скрыть».

Ваш Emacs init также должен (start-server)где-то позвонить .

Я использую эту emacsclientоболочку для вывода Emacs на первый план:

#!/bin/sh
osascript -e 'tell application "Emacs" to activate'
exec emacsclient "$@"

Вопросы:

  • Активация / отображение Emacs выводит все окна на передний план . Это немного раздражает.
  • Нажатие на иконку Emacs в Dock иногда приводит к случайному созданию нового окна. Но не всегда.
  • TODO: Может быть, make Command+ wна последнем кадре также скрывает Emacs?
  • НОВИНКА с редактированием: нажатие на значок док-станции, когда все окна свернуты, автоматически не увеличивает одно из них.

Это основано офф @ noaham в ответ предлагая минимизировать Emacs, и этот ответ , объясняющий , как крючок пытается закрыть последнее окно.

РЕДАКТИРОВАТЬ:

Просматривая источник, я нашел «привязку клавиш», дляmac-apple-event-map которой звонил mac-ae-reopen-application. mac-ae-reopen-applicationкажется, проверяет видимые и иконизированные кадры и должен как-то пропустить наш скрытый. Это возможно ошибка.

Легкое решение - просто отключить привязку ключей в вашей инициализации:

(define-key mac-apple-event-map [core-event reopen-application] nil)

Это приводит к появлению новой незначительной ошибки: нажатие на значок док-станции, когда все окна свернуты, автоматически не увеличивает одно из них. Правильным решением было бы переписать mac-ae-reopen-application, но я едва знаю emacs и elisp.

bburky
источник
Если кто-нибудь выяснит, как остановить случайное новое окно (пункт два), пожалуйста, скажите мне. Это, пожалуй, единственная вещь, которая до сих пор беспокоит меня об этой настройке.
parent5446
@ parent5446, готово! Так же, как и первое исправление, но оно работает.
Bburky
Благодарность! Хакерская часть этого не беспокоит меня, так как в большинстве случаев я все равно не запускаю Emacs из дока.
parent5446
4

Порт emacs Yamamoto Mitsuharu, к сожалению, не поддерживает multi-tty (см. Эту проблему ). Это означает, что вы не можете запустить демон emacs из терминала и запустить окно графического интерфейса с помощью emacsclient.

Вот что я делаю: В моем init.el у меня есть, (server-start)и я запускаю Emacs.app при входе в систему. Раздражение здесь в том, что это вызывает окно, которое я должен вручную свернуть.

Затем я вызываю скрипт bash emacscсо следующим

#!/bin/bash                                                                          
export PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
emacsclient -n -c

Затем я создаю приложение с AppleScript, которое содержит следующее

tell application "Emacs"
    activate
end tell
do shell script "~/bin/emacsc"

Важно передать -nфлаг emacsclient, иначе вы сможете использовать приложение emacsc только для того, чтобы открывать по одному клиенту за раз. Установка переменной пути гарантирует, что OS X может найти правильную версию emacsclient.

Указание Emacs «активировать» гарантирует, что окно вашего клиента будет запущено на переднем плане.

Как я уже сказал, досадно то, что вы должны вручную свернуть окно emacs при входе в систему, а затем сесть в док. Один из способов избежать этого - автоматически «спрятать» Emacs после входа в систему, но затем активировать его, чтобы он отображался.

noaham
источник
2

Я не уверен, чем железнодорожная кошка Emacs отличается от обычной формулы домашнего приготовления, но с последним, что вы бы сделали ln -sfv /usr/local/opt/emacs/*.plist ~/Library/LaunchAgents, который будет работать emacs --daemonпри входе в систему.

Плист включен в форму ЗДЕСЬ в формуле . Все, что вам нужно, это изменить путь к вашему приложению emacs в строке <string>#{opt_bin}/emacs</string>.

Кстати, вы также можете получить Emacs как приложение OS X с Homebrew Emacs, если вы установите его с этой --cocoaопцией. (Вам также нужно будет запустить brew linkappsпотом, связать его /Applicationsили создать ссылку самостоятельно.

Давор Кубраник
источник
1

На mac-демонах 90% времени управляются с помощью launchd . Он может запускать их по многим триггерам, включая вход / выход пользователя из системы. Существует красивое Mac-приложение под названием Lingon для просмотра и редактирования различных вещей, которыми управляет launchd. В вики emacs есть некоторые упоминания об этом, в том числе и пример файла конфигурации . Но похоже, что это не решает вашу проблему, например, как отключить демон при выходе из системы.

Бен Хайд
источник
0

Создайте приложение AppleScript, как это:

tell application "Terminal"
do shell script "/usr/local/bin/emacsclient -c"
endtell

Возможно, вам придется скорректировать путь, или вы можете полностью пропустить путь. Вы также можете использовать что-то более необычное для запуска демона, если он еще не запущен.

Tarsius
источник
@Rainer С этим есть успех? Возможно, вы также захотите найти более изощренную реализацию, которая даже при необходимости запускает демон, прежде чем подключаться к нему с помощью emacsclient. "яблочный скрипт emacsclient" дает хорошие результаты с поиском Google.
tarsius
Вы все еще ждете лучшего ответа или можно было бы принять этот?
tarsius