Texte temporaire à l'emplacement de la fenêtre sans texte à propertiser / superposer?


9

Q: comment afficher temporairement du texte dans une fenêtre à des emplacements d'écran sans texte à propertiser / superposer?

Je connais l'idée de base derrière les propriétés de texte et les superpositions (voir aussi ce fil ), les ai utilisées à quelques reprises, mais je ne suis pas du tout habile avec elles. Ma compréhension limitée est qu'il doit y avoir du texte à propertiser ou à superposer, mais je me demande comment utiliser les sections d'une fenêtre qui ne contiennent pas de texte.

Voici une capture d'écran pour un exemple:

entrez la description de l'image ici

Comment peut-on mettre du texte (temporairement) dans l'une des cases rouges de la capture d'écran, c'est-à-dire l'espace vide à droite du texte ou en dessous de la dernière ligne du tampon?


En bref, vous pouvez utiliser la propriété display pour afficher du texte qui n'est pas là. Quelqu'un peut donner une réponse complète avant mon retour à la maison.
Malabarba

Le mode entreprise accomplit la superposition sur le texte s'il y a suffisamment de points après ou avant avec la propriété d'affichage, ou bien il utilise la propriété after-string pour afficher quelque chose en dessous de la fin du tampon. Je suis moins sûr d'afficher quelque chose sur le côté, mais cela semble possible avec la bonne largeur et la bonne position de la superposition.
wasamasa

Ne pouvez-vous pas simplement envoyer du inserttexte dans le tampon et en faire la promotion?
rekado

Réponses:


6

J'ai concocté un exemple de travail d'une fonction qui prend une chaîne et l'affiche temporairement avec un délai d'attente après le texte du tampon:

(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)))

L'incantation suivante se traduira par votre exemple de boîte rouge inférieure:

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

La raison pour laquelle cela fonctionne est que les superpositions utilisent des marqueurs comme positions à afficher entre. L'utilisation de la position la plus à l'extérieur comme début et fin de la superposition vous permet d'afficher du texte après celle-ci à l'aide de la after-stringpropriété. Étant donné que les superpositions peuvent contenir du texte personnalisé, je l'ai configuré pour apparaître en retrait et avec des espaces autour.

L'autre exemple peut utiliser la même idée pour afficher du texte après la fin de la ligne:

(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)))

L'invocation suivante se traduira par votre exemple de boîte rouge à droite:

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

Vous pouvez devenir beaucoup plus fou et ajouter des visages pour distinguer ces superpositions du texte tampon, les afficher plus longtemps que pour un délai d'expiration, ajuster leur position, détecter s'il n'y a pas d'espace vide et utiliser des superpositions normales de texte adapté, etc. Je recommande de regarder le code source du mode entreprise car il est très lisible et démontre une utilisation plus élaborée (et surtout sans bug) des superpositions pour créer un menu contextuel flexible avec les fonctionnalités suggérées.


2

Vous pouvez temporairement afficher du texte dans un tampon avec la fonction momentary-string-display. Il faut un message à afficher et une position dans le tampon.

Cette:

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

placera la chaîne "bonjour là" à la position 200 dans le tampon. Il déplacera tous les autres textes à ce stade sur le côté pour faire de la place à "bonjour le monde", mais tout sera restauré à l'endroit où il était lorsque vous appuyez sur une touche.

Vous n'avez pas besoin de texte dans le tampon pour créer des superpositions, bien que ce soit une exigence pour les propriétés de texte. Voici une superposition avec une largeur nulle qui entraîne l'affichage de texte supplémentaire:

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

Notez que cette superposition repoussera le texte du tampon; il ne couvrira pas le texte à la position donnée.

Il ne semble pas possible de placer une superposition à n'importe quelle position dans le tampon qui soit supérieure à point-max/ buffer-size, c'est-à-dire que vous ne pourrez probablement pas placer du texte à une position spécifique en dessous du texte du tampon, sauf si vous piratez cette restriction. Vous pouvez, bien sûr, placer du texte juste après le texte tampon avec la after-stringpropriété sur une superposition épinglée à la point-maxposition.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.