Emacsdaemon und Emacsclient auf Mac

25

Betriebssystem: 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) vom 03.04.2014 auf Rainers-MacBook-Pro-3.local

Ich habe Emacs über Homebrew von Railwaycat installiert und es funktioniert gut - keine Beschwerden. Ich benutze keine Emacs im Termoinal, und ich starte es normalerweise über die Anwendung.

Wie gesagt - ich bin soweit glücklich.

Ich habe nur eine Sache, die ich nicht richtig hinbekommen habe (was vorher unter Linux gut funktioniert hat):

  1. Holen Sie sich den Emacs-Daemon beim Login
  2. Verwenden von emacsclient zum Öffnen
  3. Schließen Sie emacsdaemon und speichern Sie alle Dateien nach dem Abmelden

Irgendwelche funktionierenden Rezepte, die mir dabei helfen könnten?

Informationen hinzugefügt

So starten Sie einen Emacs-Daemon beim Anmelden

Ich habe eine Automator-Anwendung erstellt, die den bash-Befehl ausführt

/usr/local/bin/emacs --daemon

und fügte es zu den Login Items hinzu, was gut funktioniert.

Verwendung des Daemons vom Terminal

Ich kann den Emacs-Daemon mit verwenden

emacsclient .bashrc

Dadurch wird .bashrc in einer Emacs-Terminalsitzung geöffnet.

Nutzung von der GUI

Jetzt bleibt die Frage: Wie kann ich es von der GUI aus nutzen?

Soweit ich den Emacsclient verstehe, kann ich einen Emacsclient nur öffnen, wenn ich eine zu öffnende Datei angegeben habe.

Ich möchte eine Emacsclient-Benutzeroberfläche öffnen und alle zuvor geöffneten Dateien öffnen ? Ist das möglich?

Ich fand heraus, dass ich verwenden kann

emacsclient -c

in einem Terminal zu tun, was ich will - aber kann ich das gleiche für die GUI tun?

Rainer
quelle
Ich verstehe nicht, was "von der GUI" hier bedeutet. Es könnte "Doppelklicken auf eine Datei im Finder" oder etwas ganz anderes bedeuten.
Tarsius
Verwenden des App Launcher (z. B. über Spotlight)
Rainer
Ermöglicht der App Launcher die Auswahl von Dateien (die dann mit der Standardanwendung für den Dateityp geöffnet werden)? Oder nur "Apps"? emacsclientist für OS X keine App, sondern nur Emacseine (und nur dann, wenn sie auf diese Weise installiert wurde). Warum verwenden Sie nicht einfach die Systemtasten zum Auswählen einer geöffneten Anwendung / eines geöffneten Fensters? (Funktioniert nicht, wenn Emacs im Daemon-Modus gestartet wurde und noch kein Frame ("Fenster") vorhanden ist.)
Tarsius
Ich habe eine App namens Emacsclient definiert, die den Emacsclient startet - also ist die App Emacsclient da. Ich könnte natürlich zu einer laufenden Emacs-Instanz wechseln - aber das ist nicht der Punkt, wenn man sich den oben beschriebenen Workflow ansieht.
Rainer
1
Diese Frage ist fast hilfreicher als ihre Antworten :)
Roy Truelove

Antworten:

6

Es macht mir wirklich nichts aus, dass Emacs.app immer läuft, aber die Tatsache, dass ich das Fenster nicht schließen konnte, ohne den Emacs-Server versehentlich zu töten, war ärgerlich. Und selbst wenn Sie sich wirklich bemühen, das letzte Bild zu töten, können Sie dennoch nicht: "Versuch, das einzige sichtbare oder symbolisierte Bild zu löschen". ... Also betrügen wir.

Diese Lösung verbirgt nur Emacs (wie Command+ h), wenn Sie versuchen, das letzte Fenster durch Klicken auf die Schaltfläche Schließen zu schließen.

Fügen Sie Ihrem Emacs-Init irgendwo Folgendes hinzu:

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

Fügen Sie Emacs zu "Benutzer & Gruppen> Anmeldeobjekte" hinzu und aktivieren Sie das Kontrollkästchen "Ausblenden".

Dein Emacs Init muss auch (start-server)irgendwo anrufen .

Ich benutze diesen emacsclientWrapper, um Emacs zuerst nach vorne zu bringen:

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

Probleme:

  • Durch Aktivieren / Ausblenden von Emacs werden alle Fenster nach vorne verschoben . Das ist etwas nervig.
  • Durch Klicken auf das Emacs-Symbol im Dock wird manchmal zufällig ein neues Fenster erstellt. Aber nicht immer.
  • TODO: Vielleicht machen Command+ wim letzten Frame auch Emacs verstecken?
  • NEU mit Bearbeiten: Wenn Sie auf das Dock-Symbol klicken, wenn alle Fenster minimiert sind, wird eines davon nicht automatisch maximiert.

Dies basiert auf der Antwort von @ noaham, in der vorgeschlagen wird, Emacs zu minimieren, und dieser Antwort, in der erklärt wird, wie versucht wird, das letzte Fenster zu schließen.

BEARBEITEN:

Beim Durchsuchen der Quelle habe ich die "Tastenbelegung" fürmac-apple-event-map welche Anrufe gefunden mac-ae-reopen-application. mac-ae-reopen-applicationscheint nach sichtbaren und symbolisierten Frames zu suchen und muss irgendwie unseren versteckten verpassen. Dies ist möglicherweise ein Fehler.

Die einfache Lösung besteht darin, die Schlüsselbindung in Ihrem Init einfach zu deaktivieren:

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

Dies führt einen neuen kleinen Fehler ein: Wenn Sie auf das Dock-Symbol klicken, wenn alle Fenster minimiert sind, wird eines davon nicht automatisch maximiert. Die richtige Lösung wäre, umzuschreiben mac-ae-reopen-application, aber ich kenne Emacs und Elisp kaum.

bburky
quelle
Wenn jemand herausfindet, wie er das zufällige neue Fenster stoppen kann (Punkt zwei), sagen Sie es mir bitte. Es ist vielleicht das Einzige, was mich an diesem Setup noch nervt.
parent5446
@ parent5446, fertig! Genauso abgedreht wie das erste Update, aber es funktioniert.
Burky
Vielen Dank! Der Hack-Teil stört mich nicht, da ich Emacs die meiste Zeit sowieso nicht vom Dock aus initiiere.
parent5446
4

Der Yamamoto Mitsuharu Port von Emacs unterstützt leider kein Multi-Tty (siehe diese Ausgabe ). Dies bedeutet, dass Sie den Emacs-Daemon nicht vom Terminal aus starten und mit Emacsclient ein GUI-Fenster starten können.

Folgendes mache ich: In meinem Init.el habe ich (server-start)und starte Emacs.app beim Login. Das Ärgernis dabei ist, dass sich ein Fenster öffnet, das ich manuell minimieren muss.

Ich habe dann ein Bash-Skript emacscmit folgendem Namen

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

Ich erstelle dann eine App mit Applescript, die folgendes enthält

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

Es ist wichtig, das -nFlag an emacsclient zu übergeben, da Sie sonst nur jeweils einen Client mit der emacsc-App öffnen können. Durch das Festlegen der Pfadvariablen wird sichergestellt, dass OS X die richtige Version von emacsclient findet.

Wenn Sie Emacs zum "Aktivieren" auffordern, wird Ihr Client-Fenster im Vordergrund gestartet.

Wie gesagt, das Ärgernis ist, dass Sie das Emacs-Fenster beim Anmelden manuell minimieren müssen und es dann im Dock sitzen lassen müssen. Eine Möglichkeit, dies zu vermeiden, besteht darin, Emacs nach dem Anmelden automatisch "auszublenden", aber wenn es dann aktiviert wird, wird es wieder ausgeblendet.

Noaham
quelle
2

Ich bin mir nicht sicher, inwiefern sich der Emacs von der regulären Hausgebräu-Formel unterscheidet, aber mit letzterer würden Sie das tun ln -sfv /usr/local/opt/emacs/*.plist ~/Library/LaunchAgents, was bei der emacs --daemonAnmeldung ablaufen würde .

Die Liste ist als HIER-Dokument in der Formel enthalten . Alles was Sie tun müssen, ist den Pfad zu Ihrer Emacs-App in der Zeile zu ändern <string>#{opt_bin}/emacs</string>.

Übrigens können Sie Emacs auch als OS X-App mit Homebrew Emacs erhalten, wenn Sie es mit der --cocoaOption installieren . (Sie müssten auch brew linkappsdanach ausgeführt werden, um ihn zu verknüpfen /Applications, oder den Link selbst erstellen.

Davor Cubranic
quelle
1

Auf dem Mac werden Daemons zu 90% mit launchd verwaltet . Es kann sie auf vielen Triggern ausführen, einschließlich Benutzeranmeldung / -abmeldung. Es gibt eine hübsche Mac-Anwendung namens Lingon zum Anzeigen und Bearbeiten der verschiedenen Dinge, die von launchd verwaltet werden. Das Emacs-Wiki hat einige Erwähnungen dazu, einschließlich einer Beispiel- Konfigurationsdatei . Aber das sieht so aus, als würde es Ihr Anliegen nicht ansprechen, wie man den Daemon beim Abmelden herunterfährt.

Ben Hyde
quelle
0

Erstellen Sie eine AppleScript-Anwendung wie folgt:

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

Möglicherweise müssen Sie den Pfad anpassen, oder Sie können den Pfad vollständig weglassen. Sie können auch etwas Fantasiereicheres verwenden, um den Dämon zu starten, wenn er noch nicht ausgeführt wird.

Tarsius
quelle
@Rainer Haben Sie damit Erfolg? Möglicherweise möchten Sie auch nach einer schickeren Implementierung suchen, bei der der Dämon bei Bedarf sogar gestartet wird, bevor mit dem Emacsclient eine Verbindung hergestellt wird. "applescript emacsclient" liefert gute Ergebnisse mit der Google-Suche.
Tarsius
Warten Sie noch auf eine bessere Antwort oder wäre es möglich, diese zu akzeptieren?
Tarsius