Ich möchte in der Lage sein, Emacs über die Befehlszeile aufzurufen und entweder grafische Emacs zu starten, wenn sie nicht ausgeführt werden, oder eine Datei in einem bereits ausgeführten Emacs aufzurufen. Ich habe versucht, dies zu tun, von emacsclient
dem ich weiß, dass es der "richtige" Weg ist, dies zu tun, aber ich hatte unter OS X viele Probleme, es stürzte zufällig ab oder der emacs --daemon
Prozess blieb beim Herunterfahren oder Neustarten der Maschine hängen. und allgemeine Schuppigkeit. Während ich das zum Laufen bringen möchte, funktioniert es im Moment open -a
tatsächlich viel besser, abgesehen von diesem einen Problem, das ich unten beschreiben werde:
So verwenden open -a
:
$ open -a Emacs file.txt
wird Emacs starten, wenn es nicht läuft, und die Datei besuchen. Aber wenn ich das tue, wenn der aktuelle Puffer nicht vorhanden ist, wird *scratch*
die Datei in einem neuen Frame (dh einem neuen Systemfenster) geöffnet.
Hier ist eine Beispielsitzung:
$ open -a Emacs file.txt
Dadurch wird Emacs gestartet und die Datei file.txt geöffnet, sodass sich ein einzelner Frame mit diesem Puffer darin befindet. Wenn ich zum *scratch*
Puffer wechsle und dies mache:
$ open -a Emacs file1.txt
Es öffnet diese Datei im selben Frame. Jetzt ist ein einzelner Frame mit dieser Datei geöffnet, und wenn ich das mache:
$ open -a Emacs file2.txt
Es wird ein neues Bild geöffnet, sodass zwei Bilder gleichzeitig geöffnet sind.
Ich habe versucht, mit Befehlszeilenargumenten an Emacs zu fummeln, indem ich den --args
Schalter auf verwende open
, aber dies scheint nicht für nachfolgende Aufrufe zu funktionieren, zum Beispiel:
$ open -a Emacs --args --eval='(print "foo")'
$ open -a Emacs --args --eval='(print "bar")'
Dies druckt nur "foo" im Nachrichtenpuffer ... das zweite Mal, wenn Emacs nur in den Vordergrund gebracht wird, aber keine Nachricht gedruckt wird.
Ich bin mir nicht sicher, wie ich open
mit Anwendungen kommunizieren soll, die bereits ausgeführt werden. Weiß jemand, wie ich das herausfinden kann? Oder gibt es eine Möglichkeit, ein viel detaillierteres Protokoll darüber zu erstellen, was vor sich geht, als den Messages
Puffer? In diesem Puffer wird in der obigen Sitzung nichts Interessantes gedruckt, daher weiß ich nicht, wie ich Emacs Lisp hacken kann, um das zu tun, was ich will ...
Vielen Dank!
find-file
und danndebug-on-error
auf t setzen und den Stack-Trace auf Hinweise zum Aufruf von Emacs überprüfen. Das Hinzufügen eines Fehlersfind-file
kann so einfach sein wie das Kopieren der Funktionsdefinition in den Lisp-Scratch-Buffer und das Hinzufügen eines Aufrufserror
(z(error "cause stack trace")
. B. NIEMALS DIEfind-file
QUELLENDATEIemacsclient
erneut zu verwenden , und es mit(server-start)
meinem zu beginnen,init.el
scheint besser zu funktionieren alsemacs --daemon
beim Booten, was ich beim ersten Versuch versucht hatteemacsclient
.Antworten:
Die Antwort ist hier: emacs-Variable zum "Öffnen mit" im Originalframe
Es ist eine Änderung der Standardeinstellungen in neueren Versionen von Emacs. Hinzufügen:
in .emacs Datei.
Sehr glücklich, das gefunden zu haben.
quelle
open -a /Applications/Emacs.app $1
scheint alles gut zu funktionieren! Beachten Sie, dass ich den Server in meinem Init starte, um zum Beispiel Emacs für Git zur Verfügung zu haben.