Eu tenho uma string apropriada. Quero fazer uma cópia profunda para adicionar mais propriedades, preservando as propriedades na string original. Como posso fazer isso (facilmente)?
Exemplo
Avalie um por um:
(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)
E o resultado:
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
. Não deve modificar destrutivamente a lista, pois falha quando essa lista é referida por outras pessoas.Respostas:
Você pode usar a função
font-lock-append-text-property
para adicionar a propriedade de texto. Não modifica o valor destrutivamente.Por exemplo:
Aqui, em
test-str-1
, manteve seu valor original.fonte
Descobri que você pode fazer isso iterando sobre as propriedades do texto, copiando os dados da propriedade subjacente e substituindo as propriedades existentes por novas cópias.
Nos meus testes, isso foi cerca de 20% mais rápido que a sua
read
solução. Também escrevi uma versão que não usava um buffer temporário e modifiquei as propriedades de uma string com menos código, mas mais lenta.Observando o código C, ele copia as listas de propriedades, com copy_sequence, que reconstruirá a estrutura da lista, mas não copiará os elementos por valor; portanto, as propriedades como face no seu exemplo que possuem um valor de lista são copiadas por referência e modificadas. Bug ou não, eu não sei
fonte
Você pode usar
(concat the-original-string)
.Por exemplo:
fonte
concat
não funciona.Foi encontrada uma solução alternativa (não muito eficiente):
fonte
#
caractere.