¿Cómo pelar decoraciones (propiedades de texto) de una cadena?

17

Por "cuerda decorada" quiero decir algo como

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

... a diferencia de la "cadena simple"

"foo"

(Si el código Elisp lee una cadena directamente desde un búfer, puede decorarse así).

¿Cuál es la forma más sencilla de convertir una cadena decorada en una simple (quitando todas las decoraciones)?

kjo
fuente
77
substring-no-properties
Dan
¿Por qué necesita eliminar estas propiedades? Por lo general, no hacen daño. Solo pretender que no existen podría ser una solución lo suficientemente buena.
YoungFrog

Respuestas:

15

[Su cadena de propiedad se ve mal, tal vez la copió mal. footiene solo 3 caracteres, por lo que es imposible que se fontifique en los caracteres 0 a 4 (es decir, los caracteres 0, 1, 2 y 3, es decir, 4 caracteres). Yo uso 3 en lugar de 4 en el ejemplo aquí.]

(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-propertieses una función incorporada en C source code.

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

Reemplazar completamente las propiedades del texto de STARTa END.

El tercer argumento PROPERTIESes la nueva lista de propiedades.

Si el cuarto argumento opcional OBJECTes un búfer (o nulo, que significa el búfer actual), STARTy ENDson posiciones de búfer (enteros o marcadores). If OBJECTes una cadena STARTy ENDtiene índices basados ​​en 0. Si PROPERTIESes nulo, el efecto es eliminar todas las propiedades de la parte designada de OBJECT.

Consulte el manual de Elisp, nodo Cambio de propiedades . Allí verá esto, en función remove-text-properties(que también podría usar para hacer el trabajo):

Para eliminar todas las propiedades de texto de cierto texto, use set-text-propertiesy especifique nilpara la nueva lista de propiedades.


Como @Dan mencionó, también puede usar substring-no-properties, pero tenga en cuenta que devuelve una nueva cadena. No modifica el objeto de cadena real que le pasa. Ambos remove-text-propertiesy set-text-propertiescambian la secuencia que les pasas.

Por ejemplo:

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

Ambos fooy barahora son justos "foo", sin propiedades.

Pero:

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

Ahora foono tiene propiedades pero baraún las tiene.

Dibujó
fuente