Saya memiliki string propertized. Saya ingin membuat salinan yang dalam untuk menambahkan lebih banyak properti, sambil mempertahankan properti dalam string asli. Bagaimana saya bisa melakukan itu (dengan mudah)?
Contoh
Evaluasi satu per satu:
(setq test-str-1
#(";; This `is' a test"
0 3 (fontified nil face font-lock-comment-delimiter-face)
3 9 (fontified nil face font-lock-comment-face)
9 11 (fontified nil face (font-lock-constant-face font-lock-comment-face))
11 19 (fontified nil face font-lock-comment-face)))
(setq test-str-2 (concat test-str-1))
(add-face-text-property 0 (length test-str-2) 'foobar t test-str-2)
Dan hasilnya:
test-str-2
;; =>
#(";; This `is' a test" 0 3 (fontified nil face (font-lock-comment-delimiter-face foobar))
3 9 (fontified nil face (font-lock-comment-face foobar))
9 11 (fontified nil face (font-lock-constant-face font-lock-comment-face foobar))
11 19 (fontified nil face (font-lock-comment-face foobar)))
test-str-1
;; =>
#(";; This `is' a test" 0 3 (face font-lock-comment-delimiter-face fontified nil)
3 9 (face font-lock-comment-face fontified nil)
9 11 (face (font-lock-constant-face font-lock-comment-face foobar) ; <= foobar is here
fontified nil)
11 19 (face font-lock-comment-face fontified nil))
add-face-text-property
. Seharusnya tidak merusak daftar, karena gagal ketika daftar itu disebut oleh orang lain.Jawaban:
Anda dapat menggunakan fungsi ini
font-lock-append-text-property
untuk menambahkan properti teks. Itu tidak mengubah nilai secara destruktif.Sebagai contoh:
Di sini, di
test-str-1
, telah mempertahankan nilai aslinya.sumber
Saya menemukan Anda dapat melakukan ini dengan mengulangi properti teks, menyalin data properti yang mendasarinya dan menimpa properti yang ada dengan salinan baru.
Dalam pengujian saya, ini sekitar 20% lebih cepat dari
read
solusi Anda . Saya juga menulis versi yang tidak menggunakan buffer temp dan memodifikasi properti string yang lebih sedikit kode tetapi lebih lambat.Melihat kode C itu menyalin daftar properti, dengan copy_afterence yang akan membangun kembali struktur daftar tetapi tidak menyalin elemen dengan nilai, sehingga properti seperti wajah dalam contoh Anda yang memiliki nilai daftar disalin oleh referensi dan dimodifikasi. Bug atau tidak, saya tidak tahu
sumber
Anda bisa menggunakannya
(concat the-original-string)
.Sebagai contoh:
sumber
concat
tidak berhasil.Menemukan solusi (tidak sangat efisien):
sumber
#
karakter.