Verwenden Sie einen leeren Echobereich, um Informationen anzuzeigen

10

Der Echo-Bereich ist die meiste Zeit leer, was mich glauben lässt, dass ich damit einige Informationen anzeigen könnte. org-clockZeigt beispielsweise die aktuelle Aufgabe, die verbleibende Zeit und die insgesamt verstrichene Zeit in der Modellreihe an. Diese Informationen sind dort nicht wirklich lesbar (die Modeline kann ziemlich kurz sein), werden bei jeder Modeline wiederholt (da sie für die gesamte Emacs-Sitzung gilt) und sind nicht so nützlich, dass ich bereit bin, wertvollen Modeline-Platz dafür zu opfern . Andererseits kann es im Echo-Bereich erscheinen, wenn hier nichts anderes angezeigt werden kann.

Gibt es einen kanonischen Weg, um dies zu erreichen? Ich habe darüber nachgedacht, eine Einfügefunktion in zu hacken minibuffer-inactive-mode-hook(aber es funktioniert nicht zuverlässig, zum Beispiel verschwindet die Nachricht, sobald der Echo-Bereich wieder verwendet wird) oder nicht protokollierte Nachrichten zu spammen (aber dies wird mit anderen Verwendungszwecken von verwirren der Echo-Bereich und der Minibuffer).

Eine Poor-Man-Version davon würde Leerlauf-Timer verwenden, aber der Echo-Bereich kann leer sein, ohne dass Emacs im Leerlauf sind (zum Beispiel bei der Eingabe von Text).

T. Verron
quelle
1
Der angezeigte Echo-Bereich ist der Inhalt von "* Echo-Bereich 0 *" oder "* Echo-Bereich 1 *" und dies sind "normale" Puffer. Es sollte möglich sein, Emacs zu patchen, um möglicherweise einen Hook-Run zu ermöglichen, wenn diese Puffer "geleert" (oder angezeigt und leer) werden, damit diese Funktionalität effizient und zuverlässig implementiert werden kann.
Stefan
Es ist nicht genau das, was Sie vorhaben,
getan

Antworten:

4

In einem Kommentar zu dieser Frage wird erwähnt, dass ein Paket mit dem Namen symon eine solche Funktion verwendet.

Dies wird erreicht, indem nicht protokollierte Nachrichten als Spam gesendet werden, wenn der Minibuffer inaktiv ist, und indem die erneute Anzeige jedes Mal gestoppt wird, wenn ein Befehl ausgegeben wird. Das Boilerplate dafür ist ziemlich kurz, und nach ein paar Minuten konnte ich keine Probleme damit feststellen: Nachrichten und Minibuffer-Nutzung haben immer noch Vorrang vor den Nachrichten.

Die Schlüsselkomponenten sind:

  • eine Anzeigefunktion, die auf einem Leerlauf-Timer ausgeführt wird (ruft die Nachricht mit message-log-maxgesetzt auf auf nil, damit die angezeigte Zeichenfolge nicht in den *Messages*Puffer gelangt )
  • eine Redisplay-Funktion, die auf einem Timer ausgeführt wird
  • eine Funktion zum Stoppen der Anzeige, laufen in pre-command-hook

Das einzige Problem ist, dass die Anzeige angehalten wird, wenn ein Befehl ausgeführt wird, einschließlich beim Eingeben.

Für Interessenten habe ich den entsprechenden Code in ein auf github verfügbares Boilerplate-Paket extrahiert .

T. Verron
quelle
1

Die Antwort, IMO, ist nein . Der Echo-Bereich ist für kurzlebige Nachrichten . Und viele Dinge löschen explizit alles, was dort wiedergegeben worden sein könnte. Es ist also problematisch zu realisieren, was Sie auf vernünftige Weise anfordern, IMO.

Verwenden Sie in der Summe eine Alternative. Hier sind einige:

  1. Verwenden Sie einen anderen Puffer (z. B. einen kleinen Rahmen oder ein Fenster, das Sie zu diesem Zweck offen halten). Einfach zu tun, können Sie es verschieben, bearbeiten, löschen oder damit machen, was Sie möchten.

  2. Verwenden Sie einen Teil oder die gesamte Moduszeile (die Sie anscheinend bereits berücksichtigt haben).

  3. Verwenden Sie eine Kopfzeile.

  4. Verwenden Sie einen Rahmentitel.

Wenn ich es wäre, würde ich mich wahrscheinlich für # 1 entscheiden. (Aber ich möchte / brauche nicht wirklich eine solche Vollzeitanzeige von Statusinformationen. Ich würde eher einen Befehl definieren, der mir die Informationen (sogar einen Verlauf / ein Protokoll) auf Anfrage anzeigt.)


Nach Ihren Kommentaren aktualisiert:

Sie haben in Ihrer Frage bereits gesagt: " Die Nachricht verschwindet, sobald der Echo-Bereich wieder verwendet wird. " Es klang also so, als würde man einen so kurzlebigen Raum verwenden, dass der Echo-Bereich nicht Ihren Anforderungen entspricht. Ihre Kommentarantworten scheinen dem zu widersprechen.

Wenn Sie den Echobereich wirklich verwenden möchten, verwenden minibuffer-inactive-mode-hookSie, wie bereits erwähnt, oder verwenden Sie einen Timer, um messagedie Zeitnachricht auf andere Weise in den Echobereich aufzurufen oder einzufügen. Sie haben jedoch bereits die Probleme damit festgestellt. Diese Probleme (Überschreiben, Löschen) ergeben sich aus der ( beabsichtigten ) kurzlebigen Natur des Echobereichs .

Zusammenfassend möchten Sie einen Bereich verwenden, der für kurzlebige Nachrichten vorgesehen ist, aber Sie möchten nicht, dass Ihre Nachrichten verschwinden, sobald dieser Bereich erneut verwendet wird.

(Übrigens - wenn Sie erwähnen, dass die Moduszeileninformationen in jeder Moduszeile wiederholt werden: Dies muss nicht der Fall sein. Sie können die Moduszeile für einen bestimmten Puffer usw. spezifisch machen. IOW, Sie können immer eine Moduszeile auswählen (oder regelmäßig) zeigen Sie Ihre Uhr oder was auch immer.)

Drew
quelle
Vielen Dank für Ihre Vorschläge! Zunächst verstehe ich jedoch nicht ganz, warum das problematisch ist. Ich möchte, dass Dinge, die in den Echobereich atm gehen, jede andere Verwendung des Echobereichs außer Kraft setzen, sodass das Löschen in Ordnung ist. Die zusätzlichen Informationen sollten nur angezeigt werden, wenn der Echobereich leer ist, sodass nichts gelöscht werden muss. Klingt das nicht nach einer vernünftigen Spezifikation? Bei # 1 ist das Problem, dass ich keinen Platz auf dem Bildschirm verschwenden möchte. Der Echo-Bereich ist immer da, auch wenn er leer ist. Ich habe einige Probleme mit # 2 aufgelistet, und # 3 und # 4 teilen viele dieser Probleme.
T. Verron
Warum ich Vollzeit - Anzeige der Informationen wünschen, nehmen Sie zum Beispiel das org-clockBeispiel aus der Frage: Ich möchte den Timer tickt , um mich daran zu erinnern , was ich tun sollte, und das soll ich das zu tun , gerade jetzt , da oft wie möglich.
T. Verron
"Die Meldung verschwindet, sobald der Echo-Bereich wieder verwendet wird." Ok, das war unklar. Was ich damit meinte war, dass minibuffer-inactive-mode-hookdie Meldung angezeigt wird, wenn ich den Minibuffer verwende und beende. Wenn dann ein anderer Befehl etwas in den Echo-Bereich druckt, wird diese neue Nachricht hinzugefügt und die kurzlebige Nachricht wird nicht zurückgegeben (da der Minibuffer diesmal nicht beteiligt war).
T. Verron
Bei der Modeline ist das Hauptproblem der kleine verfügbare Platz dort (ich habe häufig viele Fenster, die horizontal geteilt sind, also sehr kurze Modelines).
T. Verron
Nochmals - " In der Summe möchten Sie einen Bereich für kurzlebige Nachrichten verwenden, aber Sie möchten nicht, dass Ihre Nachrichten verschwinden, sobald dieser Bereich erneut verwendet wird. " Verwenden Sie einen Timer mit messageoder post-command-hook, wenn Sie möchten . Das wesentliche Problem des Verschwindens / Überschreibens wird jedoch manchmal den Kopf aufrichten, da Sie versuchen, einen temporären Anzeigebereich für etwas zu verwenden, das Sie nicht temporär sein möchten.
Drew