Que sont les superpositions?
Tout d'abord, ce sont des objets élis. Cela sera pertinent plus tard.
Comme vous l'avez dit vous-même, ils représentent des couches qui s'appliquent au-dessus des régions du tampon. Ces couches ont des propriétés de texte, tout comme le texte réel dans le tampon. Toute propriété régulière d'une superposition s'applique au texte en dessous. Cependant, certaines propriétés sont spécifiques aux superpositions (elles ne font rien si elles sont appliquées au texte).
Pourquoi sont-ils utiles?
Pour les deux raisons que j'ai évoquées ci-dessus:
Ce sont des objets
Cela signifie que vous pouvez les stocker dans des listes et les manipuler facilement. Vous pouvez modifier leurs propriétés sans avoir à suivre où ils se trouvent actuellement. Mieux encore, vous pouvez utiliser les garder une trace de l' endroit où les choses sont dans la mémoire tampon.
Cette réponse de Stefan est un bon exemple de superpositions utilisées pour garder une trace des régions tampons. En voici un court extrait.
(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))
Il utilise des superpositions pour enregistrer les régions à aligner et les expressions rationnelles à utiliser sur chacune d'elles. my--auto-align-overlays
est
une liste où les superpositions sont stockées, et elles sont facilement accessibles en parcourant cette liste.
En revanche, si nous utilisions des propriétés de texte pour cela (ce qui est possible), nous n'aurions aucun moyen facile d'y accéder. Vous devez analyser le tampon pour trouver les propriétés du texte.
Ils sont légèrement plus puissants
Il y a quelques propriétés de texte qui n'ont d'effet que sur les superpositions. Vous pouvez trouver la liste complète
sur le manuel . Il est trop grand pour être inclus ici, mais voici un bref point culminant.
before-string
La valeur de cette propriété est une chaîne à ajouter à l'affichage au début de la superposition. La chaîne n'apparaît en aucun cas dans le tampon, uniquement à l'écran.
line-prefix
Cette propriété spécifie une spécification d'affichage à ajouter à chaque ligne de non-continuité au moment de l'affichage. Voir Troncature.
wrap-prefix
Cette propriété spécifie une spécification d'affichage à ajouter à chaque ligne de continuation au moment de l'affichage. Voir Troncature.
En particulier, la before-string
propriété vous permet d'affecter l'affichage du tampon même avec une superposition de largeur 0. C'est quelque chose que vous ne pouvez pas faire avec la propriété text. Tout ce que vous faites avec les propriétés de texte doit soit passer par-dessus un texte existant (ce qui pourrait masquer ce texte), soit parcourir une nouvelle chaîne de texte que vous insérez (ce qui modifie le contenu réel du tampon).
Voici un exemple d'extrait à ce sujet. Évaluez-le sur un tampon temporaire.
(overlay-put (make-overlay (point) (point)) 'before-string "Hi there!")
Quand sont-ils mauvais?
Les superpositions sont beaucoup plus exigeantes (en termes de traitement) que les propriétés de texte. Certaines opérations pertinentes (telles que l'insertion de texte, si je ne me trompe pas) prennent du temps proportionnel au nombre de superpositions dans un tampon. Pour cette raison, ils ne conviennent pas lorsque vous en avez besoin d'un grand nombre. Dans ce cas, vous devez vous résigner aux propriétés du texte.
i text properties
, bien sûr.