Como retirar decorações (propriedades de texto) de uma string?

17

Por uma "corda decorada" quero dizer algo como

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

... em oposição à "sequência simples"

"foo"

(Se o código Elisp lê uma string diretamente de um buffer, ela pode ser decorada assim.)

Qual é a maneira mais simples de converter uma corda decorada em uma simples (removendo todas as decorações)?

kjo
fonte
7
substring-no-properties
Dan
Por que você precisa dessas propriedades removidas? Eles geralmente não fazem mal. Apenas finja que eles não existem pode ser uma solução boa o suficiente.
YoungFrog

Respostas:

15

[Sua corda propertizada parece errada - talvez você tenha copiado errado. foopossui apenas 3 caracteres, portanto, é impossível que ele seja tipificado nos caracteres 0 a 4 (ou seja, caracteres 0, 1, 2 e 3 - são 4 caracteres). Eu uso 3 em vez de 4 no exemplo aqui.]

(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-propertiesé uma função interna do C source code.

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

Substitua completamente as propriedades do texto de STARTpara END.

O terceiro argumento PROPERTIESé a nova lista de propriedades.

Se o quarto argumento opcional OBJECTfor um buffer (ou nulo, que significa o buffer atual) STARTe ENDforem posições de buffer (números inteiros ou marcadores). If OBJECTé uma sequência STARTe ENDsão índices baseados em 0 nela. Se PROPERTIESfor nulo, o efeito é remover todas as propriedades da parte designada de OBJECT.

Consulte o manual do Elisp, nó Alterando propriedades . Lá você verá isso, na função remove-text-properties(que você também pode usar para fazer o trabalho):

Para remover todas as propriedades de texto de determinado texto, use set-text-propertiese especifique nila nova lista de propriedades.


Como o @Dan mencionou, você também pode usar substring-no-properties, mas saiba que ele retorna uma nova string. Ele não modifica o objeto de cadeia real que você o transmite. Ambos remove-text-propertiese set-text-propertiesaltere a string que você os passa.

Por exemplo:

(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 fooe baragora são justos "foo", sem propriedades.

Mas:

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

Agora foonão tem propriedades, mas barainda as possui.

Desenhou
fonte