Status manual :
Anda dapat menggunakan overlay untuk mengubah tampilan teks buffer di layar, demi fitur presentasi.
Dari namanya, ini menunjukkan bahwa itu dapat digunakan untuk membuat "lapisan" di atas teks yang ada, tetapi deskripsi di atas tampaknya mengindikasikan itu mengubah tampilan teks, yang terasa sangat mirip dengan apa yang dilakukan properti teks.
Apa penggunaan konkret overlay? Apa yang mereka tawarkan yang tidak dimiliki properti teks? Bisakah mereka digunakan untuk menulis teks di atas teks dalam buffer, seperti popup, kotak info, dll?
text-properties
overlays
Sébastien Le Callonnec
sumber
sumber
i text properties
, tentu saja.Jawaban:
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.
Ia menggunakan overlay untuk mencatat daerah mana yang akan disejajarkan, dan regexp mana yang digunakan pada masing-masing.
my--auto-align-overlays
aku sdaftar 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.
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.
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.
sumber
Overlay dan properti teks memiliki kemampuan yang persis sama. Mereka menambahkan margin perubahan, tombol, wajah, ikon pinggiran, tooltip, gambar, sorotan, dll ke bagian tertentu dari teks. Namun, ada perbedaan konseptual yang sangat besar:
Overlay independen , properti teks tidak. Emacs memiliki jenis overlay yang berbeda , tetapi tidak ada "tipe properti teks". Properti teks secara inheren terikat pada string yang ditetapkan. Overlay di sisi lain melekat pada buffer.
Ada beberapa implikasi praktis dari perbedaan ini:
Inti dari semua ini adalah Anda dapat mengelola overlay secara terpisah dari konten teks. Secara konseptual Anda akan menggunakannya untuk hal-hal yang akan Anda perlihatkan di buffer, meskipun tidak tergantung pada teks.
Secara praktis, Anda akan menggunakan overlay jika hal-hal yang ingin Anda tambahkan ke teks sering berubah, sedangkan Anda akan menggunakan properti teks jika barang-barang itu konstan.
Misalnya, Emacs menggunakan properti teks untuk membuat tombol dan memasukkan widget dalam
M-x customize
buffer. Widget ini dibuat sekali, dan tetap di sana selama buffer masih hidup, jadi tidak perlu membawa overlay.Namun, Flycheck menggunakan overlay untuk menyoroti kesalahan dalam buffer, karena itu sering harus menghapus dan menambahkan highlight.
sumber