Temporärer Text am Fenster ohne Text zum Zuordnen / Überlagern?

9

F: Wie zeige ich vorübergehend Text in einem Fenster an Bildschirmpositionen ohne Text zum Zuordnen / Überlagern an?

Ich bin mit der Grundidee hinter Texteigenschaften und Überlagerungen vertraut (siehe auch diesen Thread ), habe sie einige Male verwendet, bin aber keineswegs mit ihnen vertraut . Mein begrenztes Verständnis ist, dass es Text zum Eigenmachen oder Überlagern geben muss, aber ich frage mich, wie man Abschnitte eines Fensters verwendet, in denen kein Text enthalten ist.

Hier ist ein Screenshot für ein Beispiel:

Geben Sie hier die Bildbeschreibung ein

Wie kann man Text (vorübergehend) in eines der roten Kästchen im Screenshot einfügen, dh in das Leerzeichen rechts neben dem Text oder unter die letzte Zeile im Puffer?

Dan
quelle
Kurz gesagt, Sie können die Anzeigeeigenschaft verwenden, um Text anzuzeigen, der nicht vorhanden ist. Jemand kann eine vollständige Antwort geben, bevor ich nach Hause komme.
Malabarba
Im Firmenmodus wird eine Überlagerung entweder auf Text gesetzt, wenn mit der Anzeigeeigenschaft genügend Nach- oder Vorher-Punkt vorhanden ist. Alternativ wird die Nach-Zeichenfolge-Eigenschaft verwendet, um etwas unterhalb des Pufferendes anzuzeigen. Ich bin mir weniger sicher, ob ich etwas an der Seite anzeigen soll, aber es scheint möglich zu sein, die richtige Breite und Position der Überlagerung zu verwenden.
Wasamasa
Können Sie nicht einfach insertText in den Puffer schreiben und diesen anpassen?
rekado

Antworten:

6

Ich habe ein funktionierendes Beispiel für eine Funktion erstellt, die eine Zeichenfolge verwendet und diese vorübergehend mit einem Timeout nach dem Puffertext anzeigt:

(defun my-momentarily-display-after-buffer-end (string &optional timeout)
  (let ((ov (make-overlay (point-max) (point-max))))
    (overlay-put ov 'after-string
                 (concat (propertize " " 'display
                                     '(space :align-to (+ left-fringe 10)))
                         (propertize string 'display
                                     '(raise -1))
                         "\n\n"))
    (sit-for (or timeout 5))
    (delete-overlay ov)))

Die folgende Beschwörung führt zu Ihrem unteren roten Kästchen:

(my-momentarily-display-after-buffer-end "Nothing to see here...")

Der Grund dafür ist, dass Overlays Markierungen als Positionen verwenden, zwischen denen angezeigt werden soll. Wenn Sie die äußerste Position als Anfang und Ende der Überlagerung verwenden, können Sie mithilfe der Eigenschaft Text danach anzeigen after-string. Da Überlagerungen den richtigen Text enthalten können, habe ich ihn so eingerichtet, dass er eingerückt und mit Leerzeichen versehen ist.

Das andere Beispiel kann dieselbe Idee verwenden, um Text nach dem Zeilenende anzuzeigen:

(defun my-momentarily-display-after-line-end (string &optional timeout)
  (let ((ov (make-overlay (line-end-position) (line-end-position))))
    (overlay-put
     ov 'after-string
     (concat (propertize " " 'display
                         `(space :align-to (- right-fringe
                                              ,(1+ (length string)))))
             string))
    (sit-for (or timeout 5))
    (delete-overlay ov)))

Der folgende Aufruf führt zu Ihrem Beispiel für das rote Feld auf der rechten Seite:

(my-momentarily-display-after-line-end "annotation")

Sie können viel verrückter werden und Gesichter hinzufügen, um diese Überlagerungen von Puffertext zu unterscheiden, sie länger als für eine Zeitüberschreitung anzuzeigen, ihre Position anzupassen, zu erkennen, wenn kein leerer Raum vorhanden ist, und normale Überlagerungen von richtigem Text zu verwenden usw. Ich empfehle, einen Blick darauf zu werfen Der Quellcode des Unternehmensmodus, da er sehr gut lesbar ist und eine aufwändigere (und meist fehlerfreie) Verwendung von Overlays zum Erstellen eines flexiblen Popup-Menüs mit den vorgeschlagenen Funktionen demonstriert.

Wasamasa
quelle
2

Mit der Funktion können Sie vorübergehend Text in einem Puffer anzeigen momentary-string-display. Es wird eine Meldung und eine Position im Puffer benötigt.

Diese:

(momentary-string-display "hello there" 200)

platziert die Zeichenfolge "Hallo" an Position 200 im Puffer. Der gesamte andere Text wird an dieser Stelle zur Seite verschoben, um Platz für "Hallo Welt" zu schaffen. Es wird jedoch alles so wiederhergestellt, wie es war, als Sie eine beliebige Taste gedrückt haben.

Sie benötigen keinen Text im Puffer, um Überlagerungen zu erstellen, obwohl dies eine Voraussetzung für Texteigenschaften ist. Hier ist eine Überlagerung mit einer Breite von Null, die dazu führt, dass zusätzlicher Text angezeigt wird:

(let ((ov (make-overlay 1 1)))
  (overlay-put ov 'before-string "this text is not part of the buffer"))

Beachten Sie, dass diese Überlagerung den Puffertext wegschiebt. Der Text wird an der angegebenen Position nicht abgedeckt.

Es scheint nicht möglich zu sein, eine Überlagerung an einer Position im Puffer zu platzieren, die größer als point-max/ ist buffer-size, dh Sie können wahrscheinlich keinen Text an einer bestimmten Position unterhalb des Puffertextes platzieren, es sei denn, Sie hacken diese Einschränkung. Sie können natürlich Text direkt nach dem Puffertext mit der after-stringEigenschaft auf einer Überlagerung platzieren, die an der point-maxPosition befestigt ist .

rekado
quelle