Тимчасовий текст у розташуванні вікна без тексту для впорядкування / накладання?


9

Питання: як я можу тимчасово відображати текст у вікні на місцях екрана, без тексту, який можна впорядкувати / накладати?

Мені знайома основна ідея властивостей тексту та накладок (див. Також цю тему ), використовувала їх декілька разів, але я аж ніяк не вмію з ними. Моє обмежене розуміння полягає в тому, що для вдосконалення або накладання тексту повинен бути текст, але мені цікаво, як використовувати розділи вікна, які не містять у них тексту.

Ось скріншот для прикладу:

введіть тут опис зображення

Як можна було помістити текст (тимчасово) в одне з червоних полів на скріншоті, тобто порожній пробіл праворуч від тексту, або під останнім рядком у буфері?


Коротше кажучи, ви можете використовувати властивість відображення для відображення тексту, якого немає. Хтось може дати повну відповідь, перш ніж я повернуся додому.
Малабарба

компанія-режим здійснює накладання накладки або на текст, якщо є достатньо після або перед точкою з властивістю відображення, або, як варіант, він використовує властивість after-string для відображення чогось під кінцем буфера. Я менш впевнений у зображенні чогось збоку, але, здається, це можливо з потрібною шириною та положенням накладки.
wasamasa

Чи можете ви не просто insertнадсилати текст у буфер і це правити?
rekado

Відповіді:


6

Я зібрав робочий приклад функції, яка бере рядок і тимчасово відображає її з таймаутом після тексту буфера:

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

Наступний заклик призведе до прикладу нижнього червоного поля:

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

Причина цього працює в тому, що накладки використовують маркери як позиції для відображення між ними. Використання самого зовнішнього положення як початку та кінця накладення дозволяє відображати текст після нього за допомогою after-stringвластивості. Оскільки накладки можуть містити вдосконалений текст, я встановив його з відступом та з пробілом навколо нього.

Інший приклад може використовувати ту саму ідею для відображення тексту після закінчення рядка:

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

Наступний виклик призведе до прикладу червоного поля правого боку:

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

Ви можете піти набагато божевільніше і додати обличчя, щоб відрізнити ці накладки від буферного тексту, відобразити їх довше, ніж за тайм-аут, відрегулювати їх положення, виявити, коли немає порожнього простору, і використовувати звичайні накладки з належного тексту тощо. Я рекомендую переглянути вихідний код фірмового режиму, оскільки він дуже читабельний і демонструє більш детальне (і в основному помилка) використання накладок для створення гнучкого спливаючого меню з запропонованими функціями.


2

Ви можете тимчасово відображати текст у буфері за допомогою функції momentary-string-display. Це потребує повідомлення для відображення та положення в буфері.

Це:

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

помістить рядок "привіт туди" в позицію 200 в буфері. Він перемістить увесь інший текст у цій точці убік, щоб звільнити місце для "привіт світу", але все буде відновлено там, де було, коли ви натиснете будь-яку клавішу.

Для створення накладок вам не потрібен текст у буфері, хоча це є вимогою до властивостей тексту. Ось накладка з нульовою шириною, що призводить до відображення додаткового тексту:

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

Зауважте, що це накладення відштовхне текст буфера; він не охопить текст у заданій позиції.

Здається, неможливо розмістити накладку в будь-яку позицію в буфері, яка перевищує point-max/ buffer-size, тобто ви, ймовірно, не зможете розмістити текст у якомусь певному положенні нижче тексту буфера, якщо не зламаєте це обмеження. Звичайно, ви можете розмістити текст відразу після тексту буфера із after-stringвластивістю на накладеному на point-maxпозицію накладенні .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.