J'ai une chaîne propertized. Je veux en faire une copie complète pour ajouter plus de propriétés, tout en préservant les propriétés dans la chaîne d'origine. Comment puis-je faire cela (facilement)?
Exemple
Évaluez un par un:
(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)
Et le résultat:
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
. Il ne doit pas modifier de manière destructive la liste, car il échoue lorsque cette liste est référencée par d'autres.Réponses:
Vous pouvez utiliser la fonction
font-lock-append-text-property
pour ajouter la propriété text. Il ne modifie pas la valeur de manière destructive.Par exemple:
Ici, en
test-str-1
, a conservé sa valeur d'origine.la source
J'ai trouvé que vous pouvez le faire en itérant sur les propriétés du texte, en copiant les données de propriété sous-jacentes et en remplaçant les propriétés existantes par de nouvelles copies.
Dans mes tests, c'était environ 20% plus rapide que votre
read
solution. J'ai également écrit une version qui n'utilisait pas de tampon temporaire et j'ai modifié les propriétés d'une chaîne qui était moins de code mais plus lente.En regardant le code C, il copie les listes de propriétés, avec copy_sequence qui reconstruira la structure de la liste mais ne copiera pas les éléments par valeur, de sorte que les propriétés comme face dans votre exemple qui ont une valeur de liste sont copiées par référence et modifiées. Bug ou pas, je ne sais pas
la source
Vous pouvez utiliser
(concat the-original-string)
.Par exemple:
la source
concat
ça ne marche pas.Trouvé une solution de contournement (pas très efficace):
la source
#
caractère.