Emacsdaemon і Emacsclient на Mac


25

ОС: OS X 10.9.5, Mavericks

GNU Emacs 24.3.1 (x86_64-apple-darwin13.1.0, Carbon Version 1.6.0 AppKit 1265.19) 2014-04-03 на Rainers-MacBook-Pro-3.local

Я встановив emacs через homebrew від Railcat, і він працює чудово - жодних скарг. Я не використовую emacs в термофіналі, і зазвичай запускаю його через додаток.

Як я вже говорив - поки що щасливий.

У мене є лише одне, чого мені не вдалося отримати правильно (який раніше добре працював під Linux), а саме:

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

Будь-які робочі рецепти, які могли б допомогти мені це налаштувати?

Додана інформація

Щоб запустити демон emacs після входу

Я створив додаток Automator, що виконує команду bash

/usr/local/bin/emacs --daemon

і додав його до елементів входу, що добре працює.

Використання демона з терміналу

Я можу використовувати демон emacs, використовуючи

emacsclient .bashrc

що відкриває .bashrc у термінальному сеансі emacs.

Використовуючи GUI

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

Як я розумію emacsclient, я не можу відкрити emacsclient, якщо не вказати файл, який потрібно відкрити.

Я хотів би відкрити emacsclient GUI та відкрити всі раніше відкриті файли ? Чи можливо це?

Я дізнався, що можу використовувати

emacsclient -c

в терміналі робити те, що я хочу - але чи можу я зробити те ж саме для GUI?


Я не розумію, що тут означає "GUI". Це може означати "подвійне клацання на файл у Finder" або щось інше цілком.
Тарсій

Використання програми запуску програм (наприклад, через прожектор)
Rainer

Чи дозволяє програма запуску програм вибирати файли (які відкриваються за допомогою програми за замовчуванням для типу файлу). Або лише "Програми"? emacsclientце не додаток, що стосується OS X, це лише Emacs(і лише якщо він встановлений таким чином). Чому ви просто не використовуєте прив’язки системних ключів для вибору відкритої програми / вікна? (Не буде працювати, якщо Emacs був запущений в демон-режимі, і поки немає кадру ("вікна")).
Тарсій

Я визначив додаток під назвою Emacsclient, який запускає emacsclient - тому додаток Emacsclient є. Я, очевидно, міг би перейти на запущений екземпляр emacs - але це, окрім пункту, дивлячись на описаний вище робочий процес.
Райнер

1
Це питання майже корисніше, ніж його відповіді :)
Roy 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 у Доку, здається, іноді випадково створює нове вікно. Але не завжди.
  • TODO: Може, make Command+ wна останньому кадрі також приховає Emacs?
  • НОВО з редагуванням: натискання піктограми док-станції, коли всі вікна мінімізовані, не збільшує автоматично одне з них.

Це засновано офф @ noaham в відповідь пропонуючи мінімізувати Emacs, і ця відповідь , яка пояснювала б , як гачок намагається закрити останнє вікно.

Редагувати:

Шукаючи джерело, я знайшов "прив’язку клавіш", дляmac-apple-event-map якої дзвінки mac-ae-reopen-application. mac-ae-reopen-applicationздається, перевіряє видимі та іконізовані кадри та повинен якось пропустити наш прихований. Це, можливо, помилка.

Просте виправлення полягає в тому, щоб просто відключити прив’язку ключа у вашому init:

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

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


Якщо хтось з'ясує, як зупинити випадкове нове вікно (точка два кулі), будь ласка, скажіть мені. Це, мабуть, єдине, що все ще клопоче мене про цю налаштування.
материнське5446

@ parent5446, зроблено! Так само хакі, як і перший виправлення, але це працює.
bburky

Спасибі! Хакерська частина цього мене не турбує, оскільки більшість часу я не ініціюю Emacs з док-станції.
батько5446

4

Порт Emacs Yamamoto Mitsuharu не підтримує, на жаль, багатотисячний (див. Цю проблему ). Це означає, що ви не можете запустити демон emacs з терміналу і запустити вікно gui з 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

Потім я створюю додаток з яблучним сценарієм, який містить наступне

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

Важливо передати -nпрапор emacsclient, інакше ви зможете використовувати додаток emacsc лише для відкриття одного клієнта за один раз. Встановлення змінної шляху гарантує, що OS X може знайти правильну версію emacsclient.

Якщо говорити Emacs про "активацію", це гарантує, що вікно вашого клієнта буде запущено на перший план.

Як я вже казав, роздратування полягає в тому, що вам потрібно вручну мінімізувати вікно emacs під час входу, а потім припустити його сісти на док. Один із способів уникнути цього - автоматично "приховати" Emacs після входу, але тоді його активація призведе до його приховування.


2

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

Пліст включений як документ ТУТ у формулу . Все, що вам знадобиться, це змінити шлях до програми emacs у рядку <string>#{opt_bin}/emacs</string>.

До речі, ви також можете отримати Emacs як додаток для ОС X з Homebrew Emacs, якщо встановити його за допомогою цієї --cocoaопції. (Вам також потрібно буде запустити brew linkappsпісля цього, щоб зв'язати його /Applicationsабо створити посилання самостійно.


1

На mac демони, 90% часу, управляються за допомогою запуску . Він може запускати їх на багатьох тригерах, включаючи вхід / вихід користувача. Існує симпатична програма Mac під назвою Lingon для перегляду та редагування різних речей, якими розпочато управління. Вікі emacs містить деякі згадки про це, включаючи та конфігураційний файл . Але це виглядає так, що це не стосується ваших проблем, тобто як вимкнути демон при виході.


0

Створіть програму AppleScript так:

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

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


@Rainer Маєш успіх у цьому? Ви також можете пошукати більш фантазійну реалізацію, яка навіть запустить демон, якщо потрібно, перед тим як підключитися до нього за допомогою emacsclient. "applescript emacsclient" дає хороші результати при пошуку в Google.
Тарсій

Ви все ще чекаєте кращої відповіді чи можна було б прийняти цю?
Тарсій
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.