Was sind Überlagerungen?
Erstens sind sie Elisp-Objekte. Dies wird später relevant sein.
Wie Sie selbst sagten, stellen sie Ebenen dar, die auf Regionen des Puffers angewendet werden. Diese Ebenen haben genau wie der eigentliche Text im Puffer Texteigenschaften. Jede reguläre Eigenschaft, über die eine Überlagerung verfügt, gilt für den Text darunter. Es gibt jedoch einige Eigenschaften, die speziell für Überlagerungen gelten (sie haben keine Auswirkung, wenn sie auf Text angewendet werden).
Warum sind sie nützlich?
Aus den beiden Gründen habe ich oben angedeutet:
Sie sind Objekte
Dies bedeutet, dass Sie sie in Listen speichern und einfach handhaben können. Sie können ihre Eigenschaften ändern, ohne den aktuellen Standort verfolgen zu müssen. Noch besser, Sie können sie verwenden , um zu verfolgen, wo sich Dinge im Puffer befinden.
Diese Antwort von Stefan ist ein gutes Beispiel für die Verwendung von Overlays, um die Pufferbereiche zu verfolgen. Hier ist ein kleiner Ausschnitt davon.
(let ((ol (make-overlay beg end)))
(overlay-put ol 'evaporate t)
(overlay-put ol 'my--auto-align-regexp regexp)
(push ol my--auto-align-overlays))
Mithilfe von Overlays wird aufgezeichnet, welche Bereiche ausgerichtet werden sollen und welche Regexp-Werte für die einzelnen Bereiche verwendet werden sollen. my--auto-align-overlays
ist
eine Liste, in der die Overlays gespeichert sind und auf die Sie bequem zugreifen können, indem Sie diese Liste durchsehen.
Wenn wir dagegen Texteigenschaften verwenden würden (was möglich ist), hätten wir keine einfache Möglichkeit, darauf zuzugreifen. Sie müssen den Puffer analysieren, um Texteigenschaften zu finden.
Sie sind etwas mächtiger
Es gibt einige Texteigenschaften, die sich nur auf Overlays auswirken. Die gesamte Liste finden Sie
im Handbuch . Es ist zu groß, um es hier aufzunehmen, aber hier ist ein kurzes Highlight.
Vorzeichenfolge
Der Wert dieser Eigenschaft ist eine Zeichenfolge, die der Anzeige am Anfang der Überlagerung hinzugefügt werden soll. Die Zeichenfolge wird in keiner Weise im Puffer angezeigt - nur auf dem Bildschirm.
Zeilenpräfix
Diese Eigenschaft gibt eine Anzeigespezifikation an, die zur Anzeigezeit jeder nicht fortgesetzten Zeile vorangestellt werden soll. Siehe Kürzung.
wrap-prefix
Diese Eigenschaft gibt eine Anzeigespezifikation an, die jeder Fortsetzungszeile zur Anzeigezeit vorangestellt werden soll. Siehe Kürzung.
Insbesondere before-string
können Sie mit dieser Eigenschaft die Anzeige des Puffers auch bei einer Überlagerung mit der Breite 0 beeinflussen. Welches ist etwas, das Sie nicht mit Texteigenschaft tun können. Alles, was Sie mit Texteigenschaften tun, muss entweder über einen vorhandenen Text gehen (der diesen Text möglicherweise verdeckt) oder über eine neue Textzeichenfolge, die Sie einfügen (die den tatsächlichen Inhalt des Puffers ändert ).
Hier ist ein Beispiel-Snippet dazu. Bewerten Sie es in einem temporären Puffer.
(overlay-put (make-overlay (point) (point)) 'before-string "Hi there!")
Wann sind sie schlecht?
Overlays sind viel anspruchsvoller (verarbeitungstechnisch) als Texteigenschaften. Einige relevante Vorgänge (z. B. das Einfügen von Text, wenn ich mich nicht irre) benötigen Zeit, die proportional zur Anzahl der Überlagerungen in einem Puffer ist. Aus diesem Grund sind sie ungeeignet, wenn Sie eine große Anzahl von ihnen benötigen. In diesem Fall sollten Sie auf Texteigenschaften verzichten.
i text properties
natürlich auch (im selben Handbuch) .