Ich habe eine besetzte Zeichenfolge. Ich möchte eine tiefe Kopie davon erstellen, um weitere Eigenschaften hinzuzufügen, während die Eigenschaften in der ursprünglichen Zeichenfolge erhalten bleiben. Wie kann ich das (leicht) machen?
Beispiel
Nacheinander bewerten:
(setq test-str-1
#(";; This `is' a test"
0 3 (fontified nil face font-lock-comment-delimiter-face)
3 9 (fontified nil face font-lock-comment-face)
9 11 (fontified nil face (font-lock-constant-face font-lock-comment-face))
11 19 (fontified nil face font-lock-comment-face)))
(setq test-str-2 (concat test-str-1))
(add-face-text-property 0 (length test-str-2) 'foobar t test-str-2)
Und das Ergebnis:
test-str-2
;; =>
#(";; This `is' a test" 0 3 (fontified nil face (font-lock-comment-delimiter-face foobar))
3 9 (fontified nil face (font-lock-comment-face foobar))
9 11 (fontified nil face (font-lock-constant-face font-lock-comment-face foobar))
11 19 (fontified nil face (font-lock-comment-face foobar)))
test-str-1
;; =>
#(";; This `is' a test" 0 3 (face font-lock-comment-delimiter-face fontified nil)
3 9 (face font-lock-comment-face fontified nil)
9 11 (face (font-lock-constant-face font-lock-comment-face foobar) ; <= foobar is here
fontified nil)
11 19 (face font-lock-comment-face fontified nil))
add-face-text-property
. Die Liste sollte nicht destruktiv geändert werden, da dies fehlschlägt, wenn andere auf diese Liste verweisen.Antworten:
Mit der Funktion können Sie die Texteigenschaft
font-lock-append-text-property
hinzufügen. Der Wert wird nicht destruktiv geändert.Beispielsweise:
Hier hat in
test-str-1
seinen ursprünglichen Wert beibehalten.quelle
Ich habe festgestellt, dass Sie dies tun können, indem Sie die Texteigenschaften durchlaufen, die zugrunde liegenden Eigenschaftsdaten kopieren und die vorhandenen Eigenschaften mit neuen Kopien überschreiben.
In meinen Tests war dies ungefähr 20% schneller als Ihre
read
Lösung. Ich habe auch eine Version geschrieben, die keinen temporären Puffer verwendet und die Eigenschaften einer Zeichenfolge geändert hat, die weniger Code, aber langsamer war.Wenn Sie sich den C-Code ansehen, werden die Eigenschaftslisten mit copy_sequence kopiert, wodurch die Listenstruktur neu erstellt wird, die Elemente jedoch nicht nach Wert kopiert werden. Daher werden die Eigenschaften wie face in Ihrem Beispiel mit einem Listenwert als Referenz kopiert und geändert. Bug oder nicht, ich weiß es nicht
quelle
Sie können verwenden
(concat the-original-string)
.Beispielsweise:
quelle
concat
geht das nicht.Es wurde eine (nicht sehr effiziente) Problemumgehung gefunden:
quelle
#
Eigenschaften den Charakter enthalten .