(Beachten Sie, dass diese Frage im Gegenteil nicht mit dem Starten im Dämonmodus und Unterdrücken interaktiver Dialoge identisch ist , da diese Frage vom Übermittler "beantwortet" wurde, um zu verhindern, dass eine bestimmte Eingabeaufforderung angezeigt wurde.)
Ich würde gerne wissen, ob es eine allgemeine Möglichkeit gibt, nicht für immer zu emacs --daemon
hängen und auf eine Antwort auf eine Eingabeaufforderung zu warten, die in einem noch nicht vorhandenen Minipuffer angezeigt wird.
Es ist unmöglich, eine Verbindung mit einem Emacs-Client herzustellen, um diese Eingabeaufforderungen zu beantworten, da der Server erst gestartet wird, wenn Emacs die Startsequenz beendet hat. (Das bedeutet, wenn Sie ALTERNATE_EDITOR auf den leeren String gesetzt haben, wodurch ein emacsclient
Server , der keinen Server findet, einen neuen Daemon starten kann, können mehrere Emacs-Daemons hängen bleiben und warten.) Ich muss killall emacs
das Problem beheben vor dem Fortfahren.
Ich kann mit jedem Ding Schlag auf Schlag spielen, was beim Start eine Aufforderung auslöst, wenn ich es identifiziere (indem ich Emacs im Nicht-Daemon-Modus starte und sehe, wonach es fragt), aber es ist keine Lösung, weil es den nächsten Daemon nicht stoppen kann aus einem neuen Grund beim Start hängen.
Um ein Beispiel zu nennen: Ein häufiger Grund dafür war nach einem Systemneustart oder einem Absturz von Emacs, als Emacs nach dem ersten Neustart wissen wollte, ob es in Ordnung ist, Sperrdateien von dem nicht mehr funktionierenden Emacs zu stehlen. Ich könnte das beheben, indem ich einen Rat gebe, dass diese Eingabeaufforderung immer mit "Ja" ohne Interaktion beantwortet wird. Aber dann war eine der Dateien, die beim Speichern der vorherigen Sitzung geöffnet waren, eine TRAMP-Datei, die ein Sudo- oder SSH-Passwort erfordert, sodass der Daemon nicht mehr auf eine Passwortabfrage wartet. Ich behebe das, indem ich die Sitzungsdatei manuell bearbeite (mit vi
oder emacs -q
!), Um die fehlerhaften Dateien zu entfernen - aber das verhindert nicht, dass es das nächste Mal passiert.
Daher kann ich das automatische Laden meiner Sitzung beim Start stoppen und in einen Befehl ändern, den ich von meinem ersten Emacsclient aus manuell ausführen muss. Wenn meine Sitzung jedoch nicht im Hintergrund geladen wird und zum Zeitpunkt ihrer Verwendung noch nicht fertig ist, geht der gesamte Zweck des Daemons verloren!
Also, was ich möchte, ist:
- (Best) Eine Möglichkeit, die Eingabeaufforderungen des Minibuffers zu verschieben, bis ich einen Emacsclient öffne, während der Rest der Initialisierung noch abgeschlossen ist.
- (OK) Auf eine Art und Weise können Sie alle Minibuffer-Eingabeaufforderungen, die ich wie oben beschrieben noch nicht anders empfohlen habe, zurückgeben, es
no
sei denn, ein Emacsclient wird ausgeführt. Ich kann mit fehlerhaften TRAMP-Puffern leben, solange es größtenteils funktioniert.
Gibt es eine Möglichkeit, eines dieser Ziele zu erreichen?
quelle
(read-desktop)
, dann, vor der Ausführungemacs --daemon
, eine gefälschte Sperrdatei erstellen , indem Sie eine ganze Zahl in Putting .emacs.desktop.lock (wo setzen diese Datei leider hängt von Ihrer Konfiguration , aber wahrscheinlich entweder Ihr Homedir oder ~ / .emacs.d / .Antworten:
Unsere Diskussion hat ergeben, dass Sie keinen X-Server haben, auf dem dies ausgeführt wird. Dies macht meine erste Lösung für Sie nutzlos.
Im Folgenden stelle ich eine zweite Lösung vor, die mit Text-Terminal-Frames funktioniert.
Wenn Ihre Initialisierung Benutzereingaben über eine der in
avoid-initial-terminal
Emacs empfohlenen Funktionen erfordert, warten Sie, bis Sie einen Textterminalrahmen öffnen. Die Eingabeaufforderung wird im Minipuffer dieses Frames angezeigt, und Sie können Ihre interaktive Antwort geben.Code-bezogene Informationen werden als Kommentare im Code angegeben. Es gibt
TODO
Markierungen mit Beschreibungen, die Ihnen zeigen, wo Sie Ihre eigene Konfiguration einfügen können. Derzeit gibt es dort Testformulare, die den Code validieren.Test: Emacs-Version: 26.1
1.)
emacs --daemon
Auf einer Konsole ausführen.2.)
emacsclient --tty
Auf einer anderen Konsole ausführen. Sie werden dort nach einem Passwort und einer Zeichenkette gefragt. Anschließend müssen Sie auch eine y-or-np-Anfrage beantworten.quelle
Nicht genau das, wonach Sie fragen, aber vielleicht eine Lösung für Ihr ursprüngliches Problem:
Wenn der Daemon Ihnen einen grafischen Rahmen für die Beantwortung von Fragen in der Startphase bietet, bleiben Sie nicht mehr hängen.
Der folgende Code definiert einen allgemeinen Hinweis
my-with-initial-frame
, der einen Rahmen auf der ersten verfügbaren Anzeige öffnet (z:0.0
. B. ).Dieser Rat kann leicht zum Abfragen von Befehlen wie
y-or-n-p
oder hinzugefügt werden, wieread-passwd
unten gezeigt.Durch einfaches Öffnen eines Frames haben Sie eine ziemlich grobe Möglichkeit, die Fragen auf der Benutzeroberfläche zu beantworten. Man könnte auch ein Dialogfeld für verwenden,
y-or-n-p
aber das würde spezielle Lösungen für bestimmte Abfragebefehle erfordern. Das wollte ich vermeiden.Wenn Sie diesen Code in Ihrer Init-Datei ausprobieren, stellen Sie sicher, dass er das erste ist, was dort vorkommt.
Prüfung:
Annahmen:
Habe einen laufenden xserver, mit dem sich Programme über die
DISPLAY
Umgebungsvariable verbinden können.Eingabe bei xterm:
emacs --daemon
emacsclient --eval '(y-or-n-p "A")'
Es öffnet sich ein Rahmen mit der
y-or-n-p
AbfrageeingabeaufforderungA (y or n)
. Beantworten Sie diese Frage und versuchen Sie es erneut:emacsclient --eval '(y-or-n-p "B")'
Neue Abfrage mit Eingabeaufforderung
B (y or n)
im selben Frame. Schließen Sie diesen Rahmen zB mit C-x 5 0und versuchen Sie es erneut:emacsclient --eval '(y-or-n-p "C")'
Ein neuer Frame wird mit der Abfrageeingabeaufforderung geöffnet
C (y or n)
.Gleiches gilt für die Passworteingabe.
quelle
xterm
. Ich glaube auch nicht, dass diese Lösung für diejenigen geeignet ist, die dies tun. Wenn Sie den Daemon so eingerichtet haben, dass er beim Start ausgeführt wird, wird versucht, einen Frame über dem Anmeldebildschirm zu öffnen, was nicht zulässig ist stürzt ab.server-start
am Ende des Startvorgangs ausgeführt werden Stattdessen müssen Sie nicht warten, wenn Sie einen sauberen Start haben. Aber ... Sie müssen warten, denn wenn ich nichts falsch verstehe, können Sie die Aufgabe zum Starten des Emacs-Daemons nicht in Ihr Systemanmeldeskript aufnehmen, da dann keine GUI verfügbar ist. (Und in einem Fall wie meinem wird es auch nie später sein.)Ich denke , dass es im Allgemeinen schwierig sein wird , die Eingabeaufforderungen aufzuschieben , aber es sollte ziemlich einfach sein, Emacs so zu ändern, dass solche Eingabeaufforderungen sofort einen Fehler signalisieren.
Und wenn Sie diese Aufforderungen nicht ohne viel Gymnastik beantworten können, ist dies meines Erachtens ein Fehler. Ich empfehle Ihnen daher, einen Fehlerbericht einzureichen.
quelle
Warning: desktop file appears to be in use by PID xxx. Using it may cause conflicts. Use it anyway? (y or n)
Eingabeaufforderung in einen Fehler umwandeln, ohne auf irgendeine Weise speziell auf "Desktop" Bezug zu nehmen (weil auf diese Weise, da dies nicht generell ist, alles andere als einfach ist)?*Messages*
jedoch wahrscheinlich nicht aus, um beim Herstellen einer Verbindung zum ersten Client sofortige Aufmerksamkeit zu erregen, bevor der Benutzer zustandsbehaftete Vorgänge ausführt.emacs --daemon
oder indem Sieemacsclient
mit derALTERNATE_EDITOR
Umgebungsvariablen beginnen, die auf die leere Zeichenfolge festgelegt ist, wird die Ausgabe angezeigt, die normalerweise*Messages*
im Terminal bis zum Dämon wiedergegeben wird Die Initialisierung ist abgeschlossen, und Emacs ist bereit. In vielen Fällen wird der Daemon jedoch beim Systemstart oder bei der Anmeldung gestartet, und die Ausgabe wird entweder protokolliert oder verworfen.desktop
sondern in dery-or-n-p
Funktion (oder noch tiefer) sein. Wir haben einige Mechanismen, um die Anzeige von Fehlern zu verzögern, die während des Startvorgangs aufgetreten sind, sodass wir diese verwenden können, um sie anzuzeigen, wenn der erste Emacsclient eine Verbindung zum Dämon herstellt.*Messages*
und während das wenig genutzte*Warnings*
System ein Fenster zum Puffer öffnet, wenn ein aktiver Frame vorhanden ist, wenn die Warnung generiert wird, ist in diesem Fall kein Frame vorhanden, und dies ist nicht der Fall Es scheint nicht einfach zu sein, das Popup bis zum ersten Emacsclient nach dem Problem der Warnung aufzuschieben. Wenn dies möglich wäre, wäre Ihr Vorschlagyes-or-no-p
, stattdessen eine Vor-Client- Warnung zu erstellen, ideal. (Ich bezweifle, dass Benutzer*Messages*
beim Start kämmen !)