Emacsdaemon i Emacsclient na Macu

25

System operacyjny: 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) z 2014-04-03 na Rainers-MacBook-Pro-3.lokalny

Zainstalowałem emacsa przez homebrew z railwaycat i działa ładnie - żadnych skarg. Nie używam emacsa w terminalu i zwykle uruchamiam go za pomocą aplikacji.

Jak powiedziałem - do tej pory jestem szczęśliwy.

Mam tylko jedną rzecz, której nie udało mi się naprawić (wcześniej działał ładnie pod Linuksem), a mianowicie:

  1. pobierz demona emacsa, zaczynając od logowania
  2. za pomocą emacsclient, aby otworzyć
  3. zamknij emacsdaemon i zapisz wszystkie pliki po wylogowaniu

Jakieś działające przepisy, które mogłyby pomóc mi to skonfigurować?

Dodano informacje

Aby uruchomić demona emacsa po zalogowaniu

Utworzyłem aplikację Automator wykonującą polecenie bash

/usr/local/bin/emacs --daemon

i dodałem go do elementów logowania, które działają dobrze.

Wykorzystanie demona z terminala

Mogę wykorzystać demona emacsa za pomocą

emacsclient .bashrc

który otwiera .bashrc w sesji terminalu emacs.

Wykorzystanie z GUI

Pozostaje pytanie: jak korzystać z interfejsu GUI?

Jak rozumiem program emacsclient, nie mogę otworzyć programu emacsclient, chyba że podam plik do otwarcia.

Chciałbym otworzyć GUI emacsclient i otworzyć wszystkie pliki, które zostały wcześniej otwarte ? czy to możliwe?

Dowiedziałem się, że mogę korzystać

emacsclient -c

w terminalu, aby zrobić to, co chcę - ale czy mogę zrobić to samo dla GUI?

Rainer
źródło
Nie rozumiem, co tutaj oznacza „z GUI”. Może to oznaczać „podwójne kliknięcie pliku w Finderze” lub coś zupełnie innego.
Tarsius
Korzystanie z App Launcher (np. Przez Spotlight)
Rainer
Czy Menu z aplikacjami pozwala na wybieranie plików (które są następnie otwierane przy użyciu domyślnej aplikacji dla typu pliku). Czy tylko „aplikacje”? emacsclientnie jest aplikacją, jeśli chodzi o OS X, tylko Emacsjest (i tylko jeśli została zainstalowana w ten sposób). Dlaczego po prostu nie używasz systemowych powiązań klawiszy do wybierania otwartej aplikacji / okna? (Nie będzie działać, jeśli Emacs został uruchomiony w trybie demona i nie ma jeszcze ramki („okna”)).
Tarsius
Zdefiniowałem aplikację o nazwie Emacsclient, która uruchamia emacsclient - więc aplikacja Emacsclient już tam jest. Oczywiście mógłbym przejść do działającej instancji emacsa - ale poza tym, patrząc na przepływ pracy opisany powyżej.
Rainer
1
To pytanie jest prawie bardziej pomocne niż odpowiedzi :)
Roy Truelove,

Odpowiedzi:

6

Naprawdę nie mam nic przeciwko temu, że Emacs.app zawsze działa, ale fakt, że nie mogłem zamknąć okna bez przypadkowego zabicia serwera Emacs był denerwujący. I nawet jeśli naprawdę bardzo się starasz zabić ostatnią klatkę, nadal nie pozwala ci: „Spróbuj usunąć jedyną widoczną lub ikonizowaną ramkę”. ... Więc oszukujemy.

To rozwiązanie ukrywa Emacsa (jak Command+ h), gdy próbujesz zamknąć ostatnie okno, klikając przycisk zamykania.

Dodaj gdzieś inicjał do Emacsa:

(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"))))

I dodaj Emacsa do „Użytkownicy i grupy> Elementy logowania” i kliknij pole wyboru „Ukryj”.

Twój inicjator Emacsa również musi (start-server)gdzieś zadzwonić .

Używam tego emacsclientopakowania, aby najpierw przenieść Emacsa na pierwszy plan:

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

Zagadnienia:

  • Aktywacja / odsłonięcie Emacsa przenosi wszystkie okna do przodu. To jest trochę denerwujące.
  • Kliknięcie ikony Emacsa w Docku wydaje się czasami losowo tworzyć nowe okno. Ale nie zawsze.
  • TODO: Może make Command+ wna ostatniej klatce również ukrywa Emacsa?
  • NOWOŚĆ z edycją: kliknięcie ikony dokowania, gdy wszystkie okna są zminimalizowane, nie powoduje automatycznej maksymalizacji jednego z nich.

Jest to oparte off @ noaham za odpowiedź sugeruje, aby zminimalizować Emacs, i ta odpowiedź wyjaśniając jak podłączyć próbuje zamknąć ostatniego okna.

EDYTOWAĆ:

Przeszukując źródło, znalazłem „powiązanie klawiszy” dlamac-apple-event-map których wywołań mac-ae-reopen-application. mac-ae-reopen-applicationwydaje się sprawdzać widoczne i oznaczone ikonami ramki i musi w jakiś sposób tęsknić za naszą ukrytą. To prawdopodobnie błąd.

Łatwym rozwiązaniem jest wyłączenie powiązania klawiszy w twoim init:

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

Wprowadza to nowy drobny błąd: kliknięcie ikony dokowania, gdy wszystkie okna są zminimalizowane, nie powoduje automatycznej maksymalizacji jednego z nich. Poprawną poprawką byłoby przepisanie mac-ae-reopen-application, ale ledwo znam emacs i elisp.

pieprzony
źródło
Jeśli ktoś wymyśli, jak zatrzymać losowe nowe okno (punkt drugi), proszę mi powiedzieć. Być może jest to jedyna rzecz, która wciąż mnie denerwuje w tej konfiguracji.
parent5446
@ parent5446, gotowe! Tak samo hacky jak pierwsza poprawka, ale działa.
bburky,
Dzięki! Część hakerska nie przeszkadza mi, ponieważ przez większość czasu i tak nie inicjuję Emacsa z doku.
rodzic5446,
4

Port emacs Yamamoto Mitsuharu nie obsługuje niestety multi-tty (zobacz ten problem ). Oznacza to, że nie można uruchomić demona emacs z terminala i uruchomić okno GUI za pomocą emacsclient.

Oto, co robię: w mojej init.el mam (server-start)i uruchamiam Emacs.app przy logowaniu. Irytacja polega na tym, że pojawia się okno, które muszę ręcznie zminimalizować.

Następnie mam skrypt bash emacsco następującej nazwie

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

Następnie tworzę aplikację z AppleScript, która zawiera następujące elementy

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

Ważne jest, aby przekazać -nflagę do emacsclient, w przeciwnym razie będziesz mógł używać aplikacji emacsc tylko do otwierania jednego klienta na raz. Ustawienie zmiennej ścieżki gwarantuje, że OS X może znaleźć poprawną wersję programu emacsclient.

Polecenie Emacsa „aktywacji” gwarantuje, że okno klienta zostanie uruchomione na pierwszym planie.

Jak powiedziałem, irytacja polega na tym, że musisz ręcznie zminimalizować okno emacs podczas logowania, a następnie ustawić je w doku. Jednym ze sposobów, aby tego uniknąć, jest automatyczne „ukrywanie” Emacsa po zalogowaniu, ale aktywacja go spowoduje, że się ujawni.

noaham
źródło
2

Nie jestem pewien, w jaki sposób Railwaycat Emacs różni się od zwykłej domowej receptury, ale z tą drugą zrobiłbyś ln -sfv /usr/local/opt/emacs/*.plist ~/Library/LaunchAgents, która działałaby emacs --daemonpo zalogowaniu.

Plist jest zawarty w formule jako dokument TUTAJ . Musisz tylko zmienić ścieżkę do aplikacji emacs w linii <string>#{opt_bin}/emacs</string>.

BTW, możesz również pobrać Emacsa jako aplikację OS X z Homebrew Emacs, jeśli zainstalujesz go z --cocoaopcją. (Trzeba też uruchomić brew linkappspóźniej, aby go połączyć /Applicationslub utworzyć link samodzielnie.

Davor Cubranic
źródło
1

W demonach Mac w 90% przypadków zarządzanie odbywa się za pomocą uruchomionej aplikacji . Może uruchamiać je na wielu wyzwalaczach, w tym przy logowaniu / wylogowaniu użytkownika. Istnieje ładna aplikacja dla komputerów Mac o nazwie Lingon do przeglądania i edytowania różnych zarządzanych programów. Wiki emacs wspomina o tym, w tym i przykładowy plik konfiguracyjny . Ale wygląda na to, że to nie rozwiązuje problemu, tzn. Jak wyłączyć demona przy wylogowaniu.

Ben Hyde
źródło
0

Utwórz aplikację AppleScript w następujący sposób:

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

Może być konieczne dostosowanie ścieżki lub całkowite pominięcie ścieżki. Możesz także użyć czegoś bardziej wymyślnego, aby uruchomić demona, jeśli jeszcze nie działa.

Tarsjusz
źródło
@Rainer Masz z tym jakiś sukces? Możesz także poszukać bardziej wyszukanej implementacji, która w razie potrzeby uruchomi demona przed połączeniem się z nim za pomocą emacsclient. „applecript emacsclient” daje dobre wyniki w wyszukiwarce Google.
tarsius
Czy nadal czekasz na lepszą odpowiedź, czy też można by ją zaakceptować?
tarsius