Wie entferne ich Dekorationen (Texteigenschaften) von einem String?

17

Mit einem "verzierten String" meine ich so etwas wie

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

... im Gegensatz zur "normalen Saite"

"foo"

(Wenn Elisp-Code eine Zeichenfolge direkt aus einem Puffer liest, kann dies so aussehen.)

Was ist die einfachste Möglichkeit, eine dekorierte Zeichenfolge in eine einfache Zeichenfolge umzuwandeln (indem alle Dekorationen entfernt werden)?

kjo
quelle
7
substring-no-properties
Dan
Warum müssen diese Eigenschaften entfernt werden? Sie richten normalerweise keinen Schaden an. Tun Sie einfach so, als ob sie nicht existieren, könnte eine gute Lösung sein.
YoungFrog

Antworten:

15

[Ihre Eigenschaftszeichenfolge sieht falsch aus - vielleicht haben Sie sie falsch kopiert. fooHat nur 3 Zeichen, so dass es unmöglich ist, eine Schriftart für die Zeichen 0 bis 4 zu erstellen (dh Zeichen 0, 1, 2 und 3 - das sind 4 Zeichen). Ich verwende hier im Beispiel 3 statt 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-propertiesist eine eingebaute Funktion in C source code.

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

Ersetzen Sie die Texteigenschaften von STARTbis vollständig END.

Das dritte Argument PROPERTIESist die neue Eigenschaftsliste.

Wenn das optionale vierte Argument OBJECTein Puffer ist (oder nil, was den aktuellen Puffer bedeutet) STARTund ENDPufferpositionen (ganze Zahlen oder Markierungen) sind. If OBJECTist eine Zeichenfolge STARTund enthält ENDauf 0 basierende Indizes. Ist dies nicht der PROPERTIESFall, werden alle Eigenschaften aus dem angegebenen Teil von OBJECT entfernt.

Siehe Elisp-Handbuch, Knoten Eigenschaften ändern . Dort sehen Sie unter Funktion remove-text-properties(mit der Sie auch die Arbeit erledigen können):

Um alle Texteigenschaften aus einem bestimmten Text zu entfernen , verwenden Sie die neue Eigenschaftenliste set-text-propertiesund geben Sie sie nilan.


Wie bereits erwähnt, können Sie auch @Dan verwenden. Beachten Sie substring-no-propertiesjedoch, dass es eine neue Zeichenfolge zurückgibt. Das tatsächlich übergebene String-Objekt wird nicht geändert. Beide remove-text-propertiesund set-text-propertiesändern Sie die Zeichenfolge, die Sie übergeben.

Beispielsweise:

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

Beides foound barjetzt eben "foo"ohne Eigenschaften.

Aber:

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

Hat jetzt fookeine Eigenschaften aber barhat sie noch.

Drew
quelle