Apa itu overlay, dan apa bedanya dengan properti teks?

23

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?

Sébastien Le Callonnec
sumber
Baca lebih banyak bagian manual itu dari hanya satu kalimat. Ini cukup jelas dijelaskan, IMO. Termasuk perbedaan dari properti teks. Lihat juga (dalam manual yang sama) i text properties, tentu saja.
Drew

Jawaban:

10

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-overlaysaku 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-stringproperti 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.

Malabarba
sumber
12

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:

  • Anda dapat mengatur properti teks pada string yang bukan bagian dari buffer apa pun, sedangkan Anda selalu membutuhkan buffer untuk overlay.
  • Anda tidak dapat menyimpan daftar properti teks yang Anda tambahkan di suatu tempat, padahal mudah untuk menyimpan daftar overlay yang ditambahkan ke buffer, dan misalnya, hapus semua overlay Anda sekaligus.
  • Anda dapat memiliki overlay tunggal yang menetapkan beberapa overlay pada teks (misalnya wajah, tooltip, dan ikon pinggiran), sehingga Anda dapat menggunakan overlay untuk mengelola "grup" properti sebagai satu unit, sedangkan tidak ada hal seperti itu untuk properti teks. Anda mengaturnya secara individual, dan Anda mengelolanya secara individual.

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 customizebuffer. 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.

lunaryorn
sumber