Jak zdjąć dekoracje (właściwości tekstu) z łańcucha?

18

Przez „zdobiony sznurek” mam na myśli coś takiego

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

... w przeciwieństwie do „zwykłego ciągu”

"foo"

(Jeśli kod Elisp odczytuje ciąg bezpośrednio z bufora, może być ozdobiony w ten sposób.)

Jaki jest najprostszy sposób przekonwertowania ozdobnego sznurka na zwykły (poprzez usunięcie wszystkich ozdób)?

kjo
źródło
7
substring-no-properties
Dan
Dlaczego chcesz usunąć te właściwości? Zazwyczaj nie wyrządzają szkody. Udawaj, że ich nie ma, może być wystarczająco dobrym rozwiązaniem.
YoungFrog,

Odpowiedzi:

16

[Twój łańcuch znaków wygląda źle - być może źle go skopiowałeś. fooma tylko 3 znaki, więc nie można go czcionki w znakach od 0 do 4 (tj. znaki 0, 1, 2 i 3 - to 4 znaki). W tym przykładzie używam 3 zamiast 4.]

(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-propertiesjest wbudowaną funkcją w C source code.

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

Całkowicie zastąp właściwości tekstu od STARTdo END.

Trzecim argumentem PROPERTIESjest nowa lista właściwości.

Jeśli opcjonalny czwarty argument OBJECTjest buforem (lub zero, co oznacza bieżący bufor), STARTi ENDsą pozycjami bufora (liczby całkowite lub znaczniki). If OBJECTjest łańcuchem STARTi ENDzawiera w nim indeksy 0. Jeśli PROPERTIESjest zero, efektem jest usunięcie wszystkich właściwości z wyznaczonej części OBIEKTU.

Zobacz instrukcję Elisp, węzeł Zmiana właściwości . Tam zobaczysz to, w funkcji remove-text-properties(której możesz również użyć do wykonania zadania):

Aby usunąć wszystkie właściwości tekstu z określonego tekstu, użyj set-text-propertiesi określ nilnową listę właściwości.


Jak wspomniano @Dan, możesz także użyć substring-no-properties, ale pamiętaj, że zwraca nowy ciąg. Nie modyfikuje przekazanego obiektu ciąg znaków. Zarówno remove-text-propertiesi set-text-propertieszmień ciąg, który im przekazujesz.

Na przykład:

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

Zarówno fooa barteraz po prostu "foo", bez żadnych właściwości.

Ale:

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

Teraz foonie ma właściwości, ale barnadal je ma.

Rysował
źródło