Wofür sind Overlays und wie unterscheiden sie sich von Texteigenschaften?

23

Das Handbuch besagt:

Sie können Überlagerungen verwenden, um die Darstellung des Textes eines Puffers auf dem Bildschirm zu ändern, um die Präsentationsfunktionen zu nutzen.

Seinem Namen nach schlägt es vor, dass es verwendet werden kann, um „Ebenen“ über vorhandenem Text zu erstellen, aber die obige Beschreibung scheint darauf hinzudeuten, dass das Erscheinungsbild von Text geändert wird, was den Eigenschaften von Text sehr ähnlich ist.

Was ist eine konkrete Verwendung von Überlagerungen? Was bieten sie, was Texteigenschaften nicht bieten? Können sie verwendet werden, um Text über einen Puffer wie ein Popup, eine Infobox usw. zu schreiben?

Sébastien Le Callonnec
quelle
Lesen Sie mehr von diesem Handbuch als nur einen Satz. Es ist ziemlich klar erklärt, IMO. Einschließlich der Unterschiede zu Texteigenschaften. Siehe i text propertiesnatürlich auch (im selben Handbuch) .
Drew

Antworten:

10

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-overlaysist

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-stringkö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.

Malabarba
quelle
12

Überlagerungen und Texteigenschaften haben genau die gleichen Funktionen. Sie fügen einem bestimmten Teil des Texts Änderungsränder, Schaltflächen, Gesichter, Randsymbole, QuickInfos, Bilder, Hervorhebungen usw. hinzu. Es gibt jedoch einen großen konzeptionellen Unterschied:

Überlagerungen sind unabhängig , Texteigenschaften jedoch nicht. Emacs hat einen eigenen Overlay-Typ, aber keinen "Texteigenschaftstyp". Texteigenschaften sind von Natur aus an die Zeichenfolge gebunden, für die sie festgelegt wurden. Overlays hingegen sind an einen Puffer gebunden.

Dieser Unterschied hat einige praktische Auswirkungen:

  • Sie können Texteigenschaften für Zeichenfolgen festlegen, die nicht Teil eines Puffers sind, während Sie für Überlagerungen immer einen Puffer benötigen.
  • Sie können keine Liste von Texteigenschaften speichern, die Sie irgendwo hinzugefügt haben, während es einfach ist, eine Liste von Überlagerungen zu speichern, die einem Puffer hinzugefügt wurden, und beispielsweise alle Ihre Überlagerungen auf einmal zu löschen.
  • Sie können ein einzelnes Overlay verwenden, mit dem ein Text mehrfach überlagert wird (z. B. eine Fläche, ein Tooltip und ein Rand-Symbol), sodass Sie mit einem Overlay eine „Gruppe“ von Eigenschaften als einzelne Einheit verwalten können, während es keine gibt so etwas für Texteigenschaften. Sie legen sie einzeln fest und verwalten sie einzeln.

Das Wesentliche dabei ist, dass Sie Overlays unabhängig vom Textinhalt verwalten können. Konzeptionell würden Sie sie für Dinge verwenden, die Sie im Puffer anzeigen würden, obwohl sie vom Text unabhängig sind.

Praktischerweise würden Sie Überlagerungen verwenden, wenn sich das Material, das Sie zu Text hinzufügen möchten, häufig ändert, während Sie Texteigenschaften verwenden würden, wenn das Material konstant ist.

Beispielsweise verwendet Emacs Texteigenschaften, um die Schaltflächen und Eingabe-Widgets in einem M-x customizePuffer zu erstellen . Diese Widgets werden einmal erstellt und bleiben dort, solange der Puffer aktiv ist, sodass keine Überlagerungen erforderlich sind.

Allerdings Flycheck verwendet Overlays Fehler im Puffer zu markieren, da es häufig entfernen und hinzufügen Highlights muss.

Mondhorn
quelle