Senden Sie die Prozessausgabe an den Puffer * Nachrichten *, umgehen Sie jedoch den Echobereich

9

Ist es möglich, die Ausgabe eines Prozessfilters an den *Messages*Puffer zu senden und zu unterdrücken, dass diese Nachrichtenausgabe im minibuffer-promptEchobereich angezeigt wird , sodass ich gleichzeitig interaktive Befehle verwenden kann, ohne dass diese durch die laufende Ausgabe des Subpress-Filters gelöscht werden?

(defun rsync-process-filter (proc string)
  (when (not (or
      (string-match "files...\r" string)
      (string-match "files to consider\n" string)))
    (message "%s" string)))

BEARBEITEN (3. Januar 2015): Das Folgende ist ein Link zu einer ähnlichen Frage, aber ich konnte es noch nicht mit einer Prozesszeichenfolge arbeiten lassen, bei der die genaue Zeichenfolge unbekannt ist - der Titel des Threads lautet: Emacs - Deaktivieren Sie einige Minibuffer-Nachrichten :

/superuser/669701/emacs-disable-some-minibuffer-messages

Gesetzesliste
quelle
Ich glaube nicht, dass du kannst. Warum nicht einfach in einem anderen Puffer anmelden? Das ist, was die meisten Modi, die sich mit Prozessen befassen, tun ...
Mondhorn
@lunaryorn - Vielen Dank für den Vorschlag. Ein dedizierter Puffer ist eine gültige Option, um das Problem zu beheben. Es gibt einige Prozessausgaben, die ich persönlich lieber an den *Messages*Puffer senden möchte - Synchronisationsprojekte sind eine davon. Es gibt noch einige Dinge, die ich nicht ausprobiert habe ( weil ich dachte, dass es möglicherweise eine integrierte Lösung gibt ), z. B. den *Messages*Puffer vorübergehend beschreibbar zu machen inhibit-read-onlyund insertat zu verwenden point-max- ich weiß nicht, ob dies in angezeigt wird auch der Echo-Bereich. Ich werde heute Abend wieder daran arbeiten. . .
Lawlist
Ein interessanter Hinweis ist, dass die C-Funktionen für Messaging sehr stark durch "Echo" - und "Protokollierungs" -Anliegen getrennt sind, diese Unterscheidung jedoch nicht elisp ausgesetzt ist. Vielleicht könnten Sie M-x report-emacs-bugdies als Feature anfordern?
Phils
@phils | @lunaryorn: Ich konnte den gewünschten Effekt erzielen, indem (let ((inhibit-read-only t)) (with-current-buffer (get-buffer-create "*Messages*") (goto-char (point-max)) (insert string)))ich einen Antwortentwurf veröffentlichte, der nach Ablauf der obligatorischen Wartezeit für die eigene Frage eines Benutzers zur Annahme berechtigt ist. Ich habe eine Feature-Anfrage eingereicht bei report-emacs-bug: debbugs.gnu.org/cgi/bugreport.cgi?bug=19495
lawlist
lawlist: Ich wollte diesen Ansatz nicht vorschlagen, weil Sie möglicherweise gegen die Logik für den Umgang mit doppelten Nachrichten usw. verstoßen. (Aber es könnte auch in Ordnung sein; ich weiß es eigentlich nicht.) Sie sollten wahrscheinlich verwenden (messages-buffer), um den Puffer zu erhalten , wenn Sie sich an diese Methode halten und beachten, dass dies (point-max)nicht immer der Anfang einer neuen Zeile ist (z C-g. B. Verwendung ).
Phils

Antworten:

3

Sie können die Anzeige im Minibuffer unterdrücken, indem Sie minibuffer-message-timeoutauf 0 setzen.

Zum Beispiel verwende ich so etwas an einigen Stellen, an denen ich in einer Minibuffer-Eingabeaufforderung (wie der IDO-Find-Datei) einen Nebenmodus umschalten möchte, ohne durch eine Meldung "Modus aktiviert" unterbrochen zu werden:

(let ((minibuffer-message-timeout 0))
    (toggle-some-mode))
Glucas
quelle
Vielen Dank für den Vorschlag; Dies erreichte jedoch nicht den gewünschten Effekt. Der fortlaufende Druck der Prozessausgabe mit (let ((minibuffer-message-timeout 0)) (message "%s" string))Standbildern wird im Echo-Bereich / Minibuffer angezeigt, wenn interaktive Funktionen wie execute-extended-commandoder switch-to-buffer-other-window- dh die Eingabeaufforderung und die vorgeschlagenen Abschlüsse werden durch die Prozessausgabemeldungen gelöscht.
Lawlist
3

Erster grober Entwurf (3. Januar 2015): Überarbeiteter erster Entwurf basierend auf dem hilfreichen Kommentar von @phils bezüglich der Verwendung der Funktion messages-bufferzum Suchen oder Erstellen des entsprechenden Puffers (und Einfügen in diesen messages-buffer-mode); und fügte hinzu, ob point-maxam Anfang der Zeile steht (falls nicht, fügen Sie eine neue Zeile ein, bevor Sie die Nachrichtenzeichenfolge einfügen).

BEARBEITEN (4. Januar 2015): Es gibt Situationen, in denen die eingefügte Zeichenfolge möglicherweise nicht unbedingt in einer neuen Zeile messageendet und die Funktion nicht überprüft wird, ob sie am Anfang einer neuen Zeile steht. Deshalb kümmern wir uns darum in dieser Funktion. Somit messagebeginnt die Zeile zu jedem Zeitpunkt, an dem eine neue Zeile eingefügt wird, links vom Puffer.

(defun rsync-process-filter (proc string)
  (let ((inhibit-read-only t))
    (when (not (or
        (string-match "files...\r" string)
        (string-match "files to consider\n" string)))
      (with-current-buffer (messages-buffer)
        (goto-char (point-max))
        (when (not (bolp))
          (insert "\n"))
        (insert string)
        (when (not (bolp))
          (insert "\n"))))))
Gesetzesliste
quelle
2

Wenn Sie die Dokumentzeichenfolge durchgehen message, sollte es möglich sein, das zu erreichen, was Sie möchten, indem Sie die Nachricht nilunmittelbar nach dem Aufruf messagemit dem gewünschten Inhalt mit einem Argument aufrufen . Aus der Dokumentation vonmessage

Wenn das erste Argument Null oder die leere Zeichenfolge ist, löscht die Funktion alle vorhandenen Nachrichten. Dadurch wird der Inhalt des Minibuffers angezeigt.

Es sollte also funktionieren, wenn Sie Ihre Funktion wie folgt ändern

(defun rsync-process-filter (proc string)
  (when (not (or
      (string-match "files...\r" string)
      (string-match "files to consider\n" string)))
    (message "%s" string)
    (message nil)))

Ich habe es wie folgt getestet

(defun test ()
  (message "%s" "Test")
  (message nil))

(run-at-time 5 5 #'test)

Und es scheint zu funktionieren

Iqbal Ansari
quelle
Vielen Dank für den Vorschlag. Diese Idee zeigt beim Testen mit einer laufenden Prozessausgabe in den *Messages*Puffer und anschließendem Aufrufen des interaktiven Befehls execute-extended-commandFolgendes: die interaktive Eingabeaufforderung (dh M-xalle Teilabschlüsse) und die Ausgabe des Prozesses - dh die beiden wechseln zurück und mit Lichtgeschwindigkeit her, aber ein Flackern zwischen den beiden ist erkennbar. Dies scheint der Fall zu sein, da der betreffende Prozess ständig neue Nachrichten ausspuckt und diese neue Nachricht für den Bruchteil einer Sekunde im Echobereich angezeigt wird.
Lawlist