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-overlays
jest
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-string
wł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.
i text properties
Oczywiście także (w tej samej instrukcji) .