Testo temporaneo nella posizione della finestra senza testo da correggere / sovrapporre?


9

D: come posso mostrare temporaneamente il testo in una finestra nelle posizioni dello schermo senza testo da correggere / sovrapporre?

Ho familiarità con l'idea di base dietro le proprietà del testo e le sovrapposizioni (vedi anche questo thread ), le ho usate alcune volte, ma non sono per nulla abile con esse. La mia comprensione limitata è che ci deve essere un testo da correggere o sovrapporre, ma mi chiedo come usare sezioni di una finestra che non contengono testo.

Ecco uno screenshot per un esempio:

inserisci qui la descrizione dell'immagine

Come si può mettere il testo (temporaneamente) in una delle caselle rosse dello screenshot, ovvero lo spazio vuoto a destra del testo o sotto l'ultima riga nel buffer?


In breve, è possibile utilizzare la proprietà display per visualizzare il testo che non è presente. Qualcuno potrebbe dare una risposta completa prima di tornare a casa.
Malabarba,

company-mode realizza l'inserimento di una sovrapposizione sul testo se c'è abbastanza dopo o prima del punto con la proprietà display, in alternativa usa la proprietà after-string per visualizzare qualcosa sotto la fine del buffer. Sono meno sicuro di visualizzare qualcosa sul lato, ma sembra possibile con la giusta larghezza e posizione della sovrapposizione.
Wasamasa,

Non puoi semplicemente insertscrivere nel buffer e correggerlo?
rekado,

Risposte:


6

Ho preparato un esempio funzionante di una funzione che accetta una stringa e la visualizza temporaneamente con un timeout dopo il testo del buffer:

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

Il seguente incantesimo si tradurrà nell'esempio della casella rossa inferiore:

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

Il motivo per cui funziona è perché gli overlay utilizzano i marker come posizioni da visualizzare tra. L'uso della posizione più esterna come inizio e fine della sovrapposizione consente di visualizzare il testo dopo di esso utilizzando la after-stringproprietà Poiché gli overlay possono contenere testo corretto, l'ho impostato per apparire rientrato e con spazi bianchi attorno ad esso.

L'altro esempio può utilizzare la stessa idea per visualizzare il testo dopo la fine della riga:

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

La seguente chiamata comporterà l'esempio della casella rossa sul lato destro:

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

Puoi diventare molto più pazzo e aggiungere facce per distinguere questi overlay dal testo del buffer, visualizzarli più a lungo che per un timeout, regolare la loro posizione, rilevare quando non c'è spazio vuoto e utilizzare normali overlay di testo corretto, ecc. Consiglio di guardare il codice sorgente della modalità azienda perché è molto leggibile e dimostra un uso più elaborato (e per lo più privo di bug) degli overlay per creare un menu popup flessibile con le funzionalità suggerite.


2

È possibile visualizzare temporaneamente il testo in un buffer con la funzione momentary-string-display. Ci vuole un messaggio per visualizzare e una posizione nel buffer.

Questo:

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

posizionerà la stringa "ciao lì" nella posizione 200 nel buffer. Sposterà tutto il resto del testo a questo punto sul lato per fare spazio a "ciao mondo", ma tutto verrà ripristinato dove era quando si preme un tasto qualsiasi.

Non è necessario il testo nel buffer per creare overlay, anche se questo è un requisito per le proprietà del testo. Ecco un overlay con larghezza zero che si traduce in ulteriore testo da visualizzare:

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

Si noti che questo overlay eliminerà il testo del buffer; non coprirà il testo in una determinata posizione.

Non sembra possibile posizionare un overlay in qualsiasi posizione nel buffer maggiore di point-max/ buffer-size, cioè probabilmente non sarai in grado di posizionare il testo in una posizione specifica sotto il testo del buffer a meno che tu non aggiri questa restrizione. Naturalmente, è possibile posizionare il testo subito dopo il testo del buffer con la after-stringproprietà su un overlay appuntato sulla point-maxposizione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.