Emacs öffnet Dateien in einem neuen Frame, wenn es mit "open -a" geöffnet wird


20

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 emacsclientdem 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 --daemonProzess 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 -atatsä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 --argsSchalter 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 openmit 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 MessagesPuffer? 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!


Ich weiß nichts über OSX und kann daher nichts Konkretes liefern. Wenn ich dies jedoch debuggen würde, würde ich einen Syntaxfehler in find-fileund dann debug-on-errorauf t setzen und den Stack-Trace auf Hinweise zum Aufruf von Emacs überprüfen. Das Hinzufügen eines Fehlers find-filekann so einfach sein wie das Kopieren der Funktionsdefinition in den Lisp-Scratch-Buffer und das Hinzufügen eines Aufrufs error(z (error "cause stack trace"). B. NIEMALS DIE find-fileQUELLENDATEI
ÄNDERN

@ Joe Danke! Das ist eine ziemlich gute Idee, ich werde sie für die Zukunft im Hinterkopf behalten. Am Ende habe ich tatsächlich versucht, es emacsclienterneut zu verwenden , und es mit (server-start)meinem zu beginnen, init.elscheint besser zu funktionieren als emacs --daemonbeim Booten, was ich beim ersten Versuch versucht hatte emacsclient.
Michiakig

Antworten:


26

Die Antwort ist hier: emacs-Variable zum "Öffnen mit" im Originalframe

Es ist eine Änderung der Standardeinstellungen in neueren Versionen von Emacs. Hinzufügen:

(setq ns-pop-up-frames nil)

in .emacs Datei.

Sehr glücklich, das gefunden zu haben.


Das war sehr hilfreich! Zusammen mit einem Alias open -a /Applications/Emacs.app $1scheint 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.
Dror
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.