Comment supprimer des décorations (propriétés de texte) d'une chaîne?

17

Par "chaîne décorée", je veux dire quelque chose comme

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

... par opposition à la "chaîne simple"

"foo"

(Si le code Elisp lit une chaîne directement à partir d'un tampon, elle peut être décorée comme ceci.)

Quelle est la façon la plus simple de convertir une chaîne décorée en une chaîne simple (en supprimant toutes les décorations)?

kjo
la source
7
substring-no-properties
Dan
Pourquoi avez-vous besoin de supprimer ces propriétés? Ils ne font généralement pas de mal. Prétendre simplement qu'ils n'existent pas pourrait être une assez bonne solution.
YoungFrog

Réponses:

15

[Votre chaîne de propriété semble incorrecte - vous l'avez peut-être mal copiée. foone possède que 3 caractères, il est donc impossible de le faire caractériser sur les caractères 0 à 4 (c'est-à-dire les caractères 0, 1, 2 et 3 - c'est 4 caractères). J'utilise 3 au lieu de 4 dans l'exemple ici.]

(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-propertiesest une fonction intégrée dans C source code.

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

Remplacez complètement les propriétés du texte de STARTà END.

Le troisième argument PROPERTIESest la nouvelle liste de propriétés.

Si le quatrième argument facultatif OBJECTest un tampon (ou nil, ce qui signifie le tampon actuel), STARTet ENDsont des positions de tampon (entiers ou marqueurs). Si OBJECTest une chaîne STARTet ENDcontient des indices basés sur 0. Si PROPERTIESest nul, l'effet est de supprimer toutes les propriétés de la partie désignée de OBJECT.

Voir le manuel Elisp, nœud Changer les propriétés . Là, vous verrez ceci, sous fonction remove-text-properties(que vous pouvez également utiliser pour faire le travail):

Pour supprimer toutes les propriétés de texte d'un certain texte, utilisez set-text-propertieset spécifiez nilla nouvelle liste de propriétés.


Comme @Dan l'a mentionné, vous pouvez également l'utiliser substring-no-properties, mais sachez qu'il renvoie une nouvelle chaîne. Il ne modifie pas l'objet chaîne réel que vous lui transmettez. Les deux remove-text-propertieset set-text-propertieschangez la chaîne que vous leur passez.

Par exemple:

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

Les deux fooet barsont maintenant justes "foo", sans propriétés.

Mais:

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

N'a maintenant fooaucune propriété mais baren possède toujours.

A dessiné
la source