Apa itu Overlay?
Pertama-tama, mereka adalah objek elisp. Ini akan relevan nanti.
Seperti yang Anda katakan sendiri, mereka mewakili lapisan yang berlaku di atas wilayah buffer. Lapisan ini memiliki properti teks, sama seperti teks aktual di buffer. Properti reguler apa pun yang memiliki overlay, berlaku untuk teks di bawahnya. Namun, ada beberapa properti yang khusus untuk overlay (tidak melakukan apa-apa jika diterapkan pada teks).
Mengapa mereka Berguna?
Untuk dua alasan saya mengisyaratkan di atas:
Mereka adalah benda
Ini berarti Anda dapat menyimpannya dalam daftar dan menanganinya dengan mudah. Anda dapat mengubah propertinya tanpa harus melacak keberadaannya sekarang. Bahkan lebih baik, Anda dapat menggunakan mereka untuk melacak di mana hal-hal yang di dalam buffer.
Jawaban oleh Stefan ini adalah contoh yang baik dari overlay yang digunakan untuk melacak daerah buffer. Berikut cuplikan singkatnya.
(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))
Ia menggunakan overlay untuk mencatat daerah mana yang akan disejajarkan, dan regexp mana yang digunakan pada masing-masing. my--auto-align-overlays
aku s
daftar tempat overlay disimpan, dan mereka dapat diakses dengan mudah dengan melihat daftar ini.
Sebaliknya, jika kita menggunakan properti teks untuk ini (yang mungkin) kita tidak akan mudah mengaksesnya. Anda perlu mengurai buffer untuk menemukan properti teks.
Mereka sedikit lebih kuat
Ada beberapa properti teks yang hanya berpengaruh pada overlay. Anda dapat menemukan seluruh daftar
di manual . Terlalu besar untuk dimasukkan di sini, tapi ini sorotan singkat.
before-string Nilai
properti ini adalah string untuk ditambahkan ke tampilan di awal overlay. String tidak muncul dalam buffer dalam arti apa pun — hanya pada layar.
line-prefix
Properti ini menentukan spesifikasi tampilan untuk ditambahkan ke setiap baris non-kelanjutan pada waktu tampilan. Lihat Pemotongan.
wrap-prefix
Properti ini menentukan spesifikasi tampilan untuk ditambahkan ke setiap baris lanjutan pada waktu tampilan. Lihat Pemotongan.
Secara khusus, before-string
properti memungkinkan Anda untuk mempengaruhi tampilan buffer bahkan dengan overlay lebar 0. Yang merupakan sesuatu yang tidak dapat Anda lakukan dengan properti teks. Segala sesuatu yang Anda lakukan dengan kebutuhan properti teks baik pergi melalui teks yang ada (yang mungkin menyembunyikan teks ini) atau pergi ke sebuah string baru dari teks yang Anda masukkan (yang alter yang nyata isi buffer).
Berikut ini contoh cuplikan tentang itu. Evaluasilah dengan buffer sementara.
(overlay-put (make-overlay (point) (point)) 'before-string "Hi there!")
Kapan mereka buruk?
Overlay jauh lebih banyak menuntut (pemrosesan bijaksana) daripada properti teks. Beberapa operasi yang relevan (seperti penyisipan teks, jika saya tidak salah) membutuhkan waktu yang proporsional dengan jumlah overlay dalam buffer. Karena alasan itu, mereka tidak cocok ketika Anda membutuhkan banyak dari mereka. Dalam hal ini Anda harus mengundurkan diri ke properti teks.
i text properties
, tentu saja.