Come rimuovere le decorazioni (proprietà del testo) da una stringa?


17

Per "filo decorato" intendo qualcosa del genere

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

... al contrario della "semplice stringa"

"foo"

(Se il codice Elisp legge una stringa direttamente da un buffer, può essere decorato in questo modo.)

Qual è il modo più semplice per convertire una stringa decorata in una semplice (togliendo tutte le decorazioni)?


7
substring-no-properties
Dan

Perché hai bisogno di queste proprietà rimosse? Di solito non fanno male. Fingere solo che non esistano potrebbe essere una soluzione abbastanza buona.
YoungFrog

Risposte:


15

[La tua stringa corretta sembra sbagliata - forse l'hai copiata male. fooha solo 3 caratteri, quindi non è possibile che si disponga di caratteri sui caratteri da 0 a 4 (cioè, i caratteri 0, 1, 2 e 3 - sono 4 caratteri). Uso 3 anziché 4 nell'esempio qui.]

(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è una funzione integrata in C source code.

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

Sostituisci completamente le proprietà del testo da STARTa END.

Il terzo argomento PROPERTIESè il nuovo elenco di proprietà.

Se il quarto argomento facoltativo OBJECTè un buffer (o zero, che significa il buffer corrente), STARTe ENDsono posizioni del buffer (numeri interi o marker). If OBJECTè una stringa STARTe ENDcontiene indici basati su 0. Se PROPERTIESè zero, l'effetto è rimuovere tutte le proprietà dalla parte designata di OBJECT.

Vedere il manuale Elisp, nodo Modifica proprietà . Lì vedrai questo, sotto la funzione remove-text-properties(che potresti anche usare per fare il lavoro):

Per rimuovere tutte le proprietà del testo da un determinato testo, utilizzare set-text-propertiese specificare nilper il nuovo elenco di proprietà.


Come accennato da @ Dan, puoi anche usare substring-no-properties, ma tieni presente che restituisce una nuova stringa. Non modifica l'oggetto stringa effettivo che viene passato. Entrambi remove-text-propertiese set-text-propertiescambia la stringa che li passi.

Per esempio:

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

Entrambi fooe barora sono solo "foo", senza proprietà.

Ma:

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

Ora foonon ha proprietà ma le barha ancora.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.