À quoi servent les superpositions et en quoi diffèrent-elles des propriétés du texte?

23

Le manuel indique:

Vous pouvez utiliser des superpositions pour modifier l'apparence du texte d'un tampon à l'écran, pour des raisons de présentation.

D'après son nom, il suggère qu'il peut être utilisé pour créer des «calques» sur du texte existant, mais la description ci-dessus semble indiquer qu'il modifie l'apparence du texte, ce qui ressemble beaucoup à ce que font les propriétés du texte.

Qu'est-ce qu'une utilisation concrète des superpositions? Que proposent-ils que les propriétés de texte ne proposent pas? Peuvent-ils être utilisés pour écrire du texte sur du texte dans un tampon, comme une fenêtre contextuelle, une boîte d'informations, etc.?

Sébastien Le Callonnec
la source
Lisez plus de cette section du manuel qu'une seule phrase. C'est assez clairement expliqué, OMI. Y compris les différences par rapport aux propriétés du texte. Voir aussi (dans le même manuel) i text properties, bien sûr.
Drew

Réponses:

10

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

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-stringproprié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.

Malabarba
la source
12

Les superpositions et les propriétés de texte ont exactement les mêmes capacités. Ils ajoutent des marges de changement, des boutons, des visages, des icônes de franges, des info-bulles, des images, des reflets, etc. à une partie spécifique du texte. Cependant, il existe une énorme différence conceptuelle:

Les superpositions sont indépendantes , les propriétés de texte ne le sont pas. Emacs a un type de superposition distinct , mais il n'y a pas de «type de propriété de texte». Les propriétés de texte sont intrinsèquement liées à la chaîne sur laquelle elles ont été définies. Les superpositions, d'autre part, sont attachées à un tampon.

Il y a quelques implications pratiques de cette différence:

  • Vous pouvez définir des propriétés de texte sur des chaînes qui ne font partie d'aucun tampon, tandis que vous avez toujours besoin d'un tampon pour les superpositions.
  • Vous ne pouvez pas conserver une liste des propriétés de texte que vous avez ajoutées quelque part, alors qu'il est facile de conserver une liste de superpositions ajoutées à un tampon, et par exemple, de supprimer toutes vos superpositions en une seule fois.
  • Vous pouvez avoir une superposition unique qui définit plusieurs superpositions sur un texte (par exemple, une face, une info-bulle et une icône de frange), vous pouvez donc utiliser une superposition pour gérer un «groupe» de propriétés comme une seule unité, alors qu'il n'y a pas une telle chose pour les propriétés du texte. Vous les définissez individuellement et vous les gérez individuellement.

L'essence de tout cela est que vous pouvez gérer les superpositions séparément du contenu du texte. Conceptuellement, vous les utiliseriez pour des éléments que vous afficheriez dans le tampon, même s'ils sont indépendants du texte.

En pratique, vous utiliseriez des superpositions si les éléments que vous souhaitez ajouter au texte changent fréquemment, tandis que vous utiliseriez les propriétés de texte si les éléments sont constants.

Par exemple, Emacs utilise des propriétés de texte pour créer les boutons et les widgets d'entrée dans un M-x customizetampon. Ces widgets sont créés une fois et y restent tant que le tampon est vivant, il n'est donc pas nécessaire d'ajouter des superpositions.

Cependant, Flycheck utilise des superpositions pour mettre en évidence les erreurs dans le tampon, car il doit fréquemment supprimer et ajouter des surbrillances.

lunaryorn
la source