Bagaimana cara menghapus dekorasi (properti teks) dari string?

17

Dengan "string yang didekorasi" maksud saya sesuatu seperti

#("foo" 0 4 (fontified t face font-lock-function-name-face))

... sebagai lawan dari "string biasa"

"foo"

(Jika kode Elisp membaca string langsung dari buffer, kode tersebut dapat didekorasi seperti ini.)

Apa cara paling sederhana untuk mengubah string yang didekorasi menjadi yang polos (dengan melepas semua dekorasi)?

kjo
sumber
7
substring-no-properties
Dan
Mengapa Anda perlu properti ini dihapus? Mereka biasanya tidak membahayakan. Hanya berpura-pura mereka tidak ada mungkin merupakan solusi yang cukup baik.
YoungFrog

Jawaban:

15

[String propertized Anda terlihat salah - mungkin Anda salah menyalinnya. foohanya memiliki 3 karakter, jadi tidak mungkin untuk diklasifikasi pada karakter 0 hingga 4 (yaitu, karakter 0, 1, 2, dan 3 - itu 4 karakter). Saya menggunakan 3 bukannya 4 dalam contoh di sini.]

(let* ((foo    #("foo" 0 3 (fontified t face font-lock-function-name-face)))
       (start  0)
       (end    (length foo)))
  (set-text-properties start end nil foo)
  foo)

set-text-propertiesadalah fungsi bawaan di C source code.

(set-text-properties START END PROPERTIES &optional OBJECT)

Ganti sepenuhnya properti teks dari STARTmenjadi END.

Argumen ketiga PROPERTIESadalah daftar properti baru.

Jika argumen keempat opsional OBJECTadalah buffer (atau nil, yang berarti buffer saat ini), STARTdan ENDmerupakan posisi buffer (integer atau spidol). Jika OBJECTadalah string, STARTdan ENDindeks berbasis 0 ke dalamnya. Jika PROPERTIESnihil, efeknya adalah untuk menghapus semua properti dari bagian yang ditunjuk OBJECT.

Lihat manual Elisp, simpul Mengubah Properti . Di sana Anda akan melihat ini, di bawah fungsi remove-text-properties(yang juga dapat Anda gunakan untuk melakukan pekerjaan):

Untuk menghapus semua properti teks dari teks tertentu, gunakan set-text-propertiesdan tentukan niluntuk daftar properti baru.


Seperti yang disebutkan oleh @Dan, Anda juga dapat menggunakan substring-no-properties, tetapi ketahuilah bahwa ia mengembalikan string baru. Itu tidak mengubah objek string aktual yang Anda lewati. Keduanya remove-text-propertiesdan set-text-propertiesubah string yang Anda lewati.

Sebagai contoh:

(setq foo #("foo" 0 3 (fontified t face font-lock-function-name-face)))
(setq bar foo)
(set-text-properties 0 (length foo) nil foo)

Keduanya foodan barsekarang adil "foo", tanpa properti.

Tapi:

(setq foo #("foo" 0 3 (fontified t face font-lock-function-name-face)))
(setq bar foo)
(setq foo (substring-no-properties foo))

Sekarang footidak memiliki properti tetapi barmasih memilikinya.

Drew
sumber