Tengo una cadena de propiedad. Quiero hacer una copia profunda de él para agregar más propiedades, conservando las propiedades en la cadena original. ¿Cómo puedo hacer eso (fácilmente)?
Ejemplo
Evaluar uno por uno:
(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)
Y el resultado:
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
. No debe modificar destructivamente la lista, ya que falla cuando otros hacen referencia a esa lista.Respuestas:
Puede usar la función
font-lock-append-text-property
para agregar la propiedad de texto. No modifica el valor de forma destructiva.Por ejemplo:
Aquí, en
test-str-1
, ha conservado su valor original.fuente
Descubrí que puede hacer esto iterando sobre las propiedades del texto, copiando los datos de propiedad subyacentes y sobrescribiendo las propiedades existentes con nuevas copias.
En mis pruebas, esto fue aproximadamente un 20% más rápido que su
read
solución. También escribí una versión que no usaba un búfer temporal y modifiqué las propiedades de una cadena que tenía menos código pero era más lenta.Al mirar el código C, copia las listas de propiedades, con copy_sequence que reconstruirá la estructura de la lista pero no copiará los elementos por valor, por lo que las propiedades como la cara en su ejemplo que tienen un valor de lista se copian por referencia y se modifican. Error o no, no lo sé
fuente
Puedes usar
(concat the-original-string)
.Por ejemplo:
fuente
concat
no funciona.Se encontró una solución alternativa (no muy eficiente):
fuente
#
personaje.