Tymczasowy tekst w położeniu okna bez tekstu do oświadczenia / nakładki?

9

P: Jak tymczasowo wyświetlać tekst w oknie w lokalizacjach ekranu bez tekstu do nadania / nakładania?

Znam podstawową ideę właściwości i nakładek tekstowych (patrz także ten wątek ), korzystałem z nich kilka razy, ale nie jestem z nich biegły. Moje ograniczone rozumienie polega na tym, że musi istnieć tekst do oświadczenia lub nakładki, ale zastanawiam się, jak korzystać z części okna, w których nie ma żadnego tekstu.

Oto zrzut ekranu dla przykładu:

wprowadź opis zdjęcia tutaj

Jak można wstawić tekst (tymczasowo) w jedno z czerwonych pól na zrzucie ekranu, czyli puste miejsce po prawej stronie tekstu lub poniżej ostatniego wiersza w buforze?

Dan
źródło
Krótko mówiąc, możesz użyć właściwości display do wyświetlenia tekstu, którego nie ma. Ktoś może udzielić pełnej odpowiedzi, zanim wrócę do domu.
Malabarba
tryb firmowy wykonuje nakładanie nakładki na tekst, jeśli jest wystarczająca liczba punktów za lub przed właściwością display, alternatywnie wykorzystuje właściwość after-string do wyświetlenia czegoś poniżej końca bufora. Nie jestem pewien co do wyświetlania czegoś z boku, ale wydaje się, że jest to możliwe przy odpowiedniej szerokości i położeniu nakładki.
wasamasa,
Czy nie możesz po prostu insertnapisać tekstu do bufora i oświadczyć tego?
rekado

Odpowiedzi:

6

Podsunąłem działający przykład funkcji, która pobiera ciąg i tymczasowo wyświetla go z limitem czasu po tekście bufora:

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

Następujące zaklęcie spowoduje dolny przykład czerwonej skrzynki:

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

Powodem tego jest to, że nakładki używają znaczników jako pozycji, które mają być wyświetlane między nimi. Użycie najbardziej zewnętrznej pozycji jako początku i końca nakładki umożliwia wyświetlanie tekstu po niej za pomocą after-stringwłaściwości Ponieważ nakładki mogą zawierać tekst zastrzeżony, ustawiłem go tak, aby pojawiał się z wcięciem i białą spacją wokół niego.

W drugim przykładzie można użyć tego samego pomysłu do wyświetlania tekstu po końcu wiersza:

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

Następujące wywołanie spowoduje przykład na czerwonym polu z prawej strony:

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

Możesz znacznie bardziej zwariować i dodać twarze, aby odróżnić te nakładki od tekstu buforowego, wyświetlić je dłużej niż po upływie limitu czasu, wyregulować ich położenie, wykryć, gdy nie ma pustej przestrzeni i użyć normalnych nakładek z tekstem poleconym itp. Polecam spojrzeć na kod źródłowy trybu firmowego, ponieważ jest bardzo czytelny i pokazuje bardziej skomplikowane (i przeważnie wolne od błędów) użycie nakładek w celu utworzenia elastycznego menu podręcznego z sugerowanymi funkcjami.

wasamasa
źródło
2

Za pomocą tej funkcji możesz tymczasowo wyświetlić tekst w buforze momentary-string-display. Wyświetlany jest komunikat i pozycja w buforze.

To:

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

umieści w buforze ciąg „hello there” na pozycji 200. Przeniesie on cały tekst w tym miejscu na bok, aby zrobić miejsce dla „hello world”, ale wszystko zostanie przywrócone do miejsca, w którym było po naciśnięciu dowolnego klawisza.

Nie potrzebujesz tekstu w buforze do tworzenia nakładek, chociaż jest to wymagane dla właściwości tekstu. Oto nakładka o zerowej szerokości, która powoduje wyświetlenie dodatkowego tekstu:

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

Zauważ, że ta nakładka odsunie tekst bufora; nie obejmie tekstu na danym stanowisku.

Wydaje się, że nie jest możliwe umieszczenie nakładki w żadnej pozycji w buforze większej niż point-max/ buffer-size, tzn. Prawdopodobnie nie będziesz w stanie umieścić tekstu w określonej pozycji poniżej tekstu bufora, chyba że zhakujesz to ograniczenie. Możesz oczywiście umieścić tekst bezpośrednio za tekstem buforowym z after-stringwłaściwością na nakładce przypiętej do point-maxpozycji.

rekado
źródło