Do czego służą nakładki i czym różnią się od właściwości tekstu?

23

Te ręczne stany:

Możesz użyć nakładek, aby zmienić wygląd tekstu bufora na ekranie ze względu na funkcje prezentacji.

Ze swojej nazwy sugeruje, że można go używać do tworzenia „warstw” na istniejącym tekście, ale powyższy opis wydaje się wskazywać, że zmienia wygląd tekstu, co wydaje się bardzo podobne do właściwości tekstu.

Jakie jest konkretne zastosowanie nakładek? Co oferują, że właściwości tekstu nie? Czy można ich używać do pisania tekstu nad tekstem w buforze, takim jak wyskakujące okienko, pole informacyjne itp.?

Sébastien Le Callonnec
źródło
Przeczytaj więcej tego podręcznika niż tylko jedno zdanie. Jest dość jasno wyjaśnione, IMO. W tym różnice między właściwościami tekstu. i text propertiesOczywiście także (w tej samej instrukcji) .
Drew

Odpowiedzi:

10

Co to są nakładki?

Przede wszystkim są elipskimi obiektami. Będzie to miało znaczenie później.

Jak sam powiedziałeś, reprezentują one warstwy nakładające się na regiony bufora. Warstwy te mają właściwości tekstowe, podobnie jak tekst w buforze. Każda zwykła właściwość, którą ma nakładka, dotyczy tekstu pod nią. Jednak istnieją pewne właściwości, które są specjalne dla nakładek (nic nie robią, jeśli zostaną zastosowane do tekstu).

Dlaczego są przydatne?

Z dwóch powodów, o których wspomniałem powyżej:

To są przedmioty

Oznacza to, że możesz przechowywać je na listach i łatwo je obsługiwać. Możesz zmienić ich właściwości bez konieczności śledzenia, gdzie są teraz. Co więcej, możesz ich użyć do śledzenia miejsca w buforze.

Ta odpowiedź Stefana jest dobrym przykładem nakładek używanych do śledzenia regionów buforowych. Oto krótki fragment.

(let ((ol (make-overlay beg end)))
  (overlay-put ol 'evaporate t)
  (overlay-put ol 'my--auto-align-regexp regexp)
  (push ol my--auto-align-overlays))

Używa nakładek, aby zarejestrować, które regiony mają zostać wyrównane, a które wyrażenie regularne użyć w każdym z nich. my--auto-align-overlaysjest

lista, w której są przechowywane nakładki, i można do nich łatwo uzyskać dostęp, przeglądając tę ​​listę.
Natomiast gdybyśmy użyli do tego właściwości tekstu (co jest możliwe), nie mielibyśmy łatwego dostępu do nich. Musisz przeanalizować bufor, aby znaleźć właściwości tekstu.

Są nieco mocniejsze

Istnieje kilka właściwości tekstu, które mają wpływ tylko na nakładki. Całą listę można znaleźć w instrukcji . Jest za duży, aby go tu umieścić, ale oto krótkie wyróżnienie.

before-string
Wartość tej właściwości to ciąg znaków, który należy dodać do wyświetlania na początku nakładki. Ciąg nie pojawia się w buforze w żadnym sensie - tylko na ekranie.
prefiks linii
Ta właściwość określa specyfikację wyświetlania, która ma być dołączona do każdej nie kontynuowanej linii w czasie wyświetlania. Zobacz Obcięcie.
wrap-prefix
Ta właściwość określa specyfikację wyświetlania, która ma być dołączona do każdej linii kontynuacji w czasie wyświetlania. Zobacz Obcięcie.

W szczególności before-stringwłaściwość pozwala wpływać na wyświetlanie bufora nawet przy nakładce o szerokości 0. Tego nie można zrobić z właściwością text. Wszystko, co robisz z właściwościami tekstu, musi albo przejść do istniejącego tekstu (który może ukryć ten tekst), albo przejść do nowego ciągu tekstu, który wstawiasz (co zmienia rzeczywistą zawartość bufora).

Oto przykład tego fragmentu. Oceń to w tymczasowym buforze.

(overlay-put (make-overlay (point) (point)) 'before-string "Hi there!")

Kiedy oni są źli?

Nakładki są znacznie bardziej wymagające (pod względem przetwarzania) niż właściwości tekstu. Niektóre istotne operacje (takie jak wstawianie tekstu, jeśli się nie mylę) zajmują czas proporcjonalny do liczby nakładek w buforze. Z tego powodu nie są odpowiednie, gdy potrzebujesz dużej ich liczby. W takim przypadku powinieneś zrezygnować z właściwości tekstu.

Malabarba
źródło
12

Nakładki i właściwości tekstu mają dokładnie takie same możliwości. Dodają marginesy zmian, przyciski, twarze, ikony z marginesów, podpowiedzi, obrazy, podświetlenia itp. Do określonej części tekstu. Istnieje jednak ogromna różnica pojęciowa:

Nakładki są niezależne , właściwości tekstu nie. Emacs ma odrębny typ nakładki, ale nie ma „typu właściwości tekstu”. Właściwości tekstu są z natury powiązane z ciągiem, na którym zostały ustawione. Z drugiej strony nakładki są dołączone do bufora.

Istnieje kilka praktycznych implikacji tej różnicy:

  • Możesz ustawić właściwości tekstu dla ciągów, które nie są częścią żadnego bufora, podczas gdy zawsze potrzebujesz bufora dla nakładek.
  • Nie możesz zachować listy właściwości tekstu, które gdzieś dodałeś, podczas gdy łatwo jest zachować listę nakładek dodanych do bufora i na przykład usunąć wszystkie nakładki za jednym razem.
  • Możesz mieć pojedynczą nakładkę, która ustawia wiele nakładek na tekst (np. Twarz, etykietkę narzędzia i ikonę marginesu), dzięki czemu możesz użyć nakładki do zarządzania „grupą” właściwości jako pojedynczą jednostką, podczas gdy nie ma coś takiego dla właściwości tekstu. Ustawiasz je indywidualnie i zarządzasz nimi indywidualnie.

Istotą tego wszystkiego jest to, że możesz zarządzać nakładkami niezależnie od zawartości tekstu. Koncepcyjnie użyłbyś ich do rzeczy, które pokazałeś w buforze, nawet jeśli są one niezależne od tekstu.

Praktycznie używasz nakładek, jeśli rzeczy, które chcesz dodać do tekstu, często się zmieniają, a właściwości tekstu, jeśli rzeczy są stałe.

Na przykład Emacs używa właściwości tekstu do tworzenia przycisków i widżetów wejściowych w M-x customizebuforze. Te widżety są tworzone raz i pozostają tam tak długo, jak bufor jest aktywny, więc nie ma potrzeby wprowadzania nakładek.

Jednak Flycheck używa nakładek, aby wyróżnić błędy w buforze, ponieważ często musi usuwać i dodawać podświetlenia.

księżycowy
źródło