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?


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.