Como insiro texto com um rosto específico?

14

Eu tenho um rosto, criado desta maneira:

(defface test-face
  '((t . (:height 2.0)))
  "A face for testing.")

Eu gostaria de inserir algum texto com esse rosto. Mas estas formas inserem o texto sem o rosto:

(insert (propertize "text to insert" 'face 'test-face))

(let ((current-string "text to insert"))
  (put-text-property 1 (length current-string) 'face 'test-face)
  (insert current-string))

E até mesmo inserir o texto primeiro e depois voltar a colocar o rosto não está funcionando:

(progn
  (insert "text to insert")
  (add-text-properties
   (save-excursion
     (backward-word 3)
     (point))
   (point)
   '(face test-face)))

O problema não é a definição do rosto, porque se eu for personalizá-lo, ele já estará aparecendo com a altura duas vezes maior. Mesmo assim, embutir o rosto também não funciona:

(insert (propertize "to insert" 'face '(:height 2.0)))

Então, como posso inserir algum texto com o rosto específico? Eu sei que posso usar uma sobreposição, mas isso parece exagero, porque é mais detalhado, requer que o texto seja inserido primeiro (portanto, precisamos descobrir o tamanho e a posição do texto a ser sobreposto) e exige que mais lixo seja coletados.

zck
fonte
2
Experimente os exemplos acima no modo fundamental ou em qualquer outro modo com o bloqueio de fonte desativado (eles funcionariam bem). O problema é que o bloqueio de fonte também usa facepara destacar o código de sintaxe, substituindo sua propriedade de face. Estou certo de que deve haver alguma maneira de desativar o bloqueio de fonte para um determinado texto, mas terei que pesquisar um pouco o código (não há tempo agora). Talvez lendo font-lock.elcódigo poderia dar alguma pista
Iqbal Ansari

Respostas:

15

Há algum problema com o código:

  • put-text-propertyé aplicado a um objeto. Nesse caso, sua string. Você precisa passá-lo como o último parâmetro.
  • put-text-property começa a contar em zero.
  • Se font-lock-modeestiver ativado, ele removerá qualquer texto da facepropriedade.

O seguinte trecho de código funciona, se o modo de bloqueio de fonte estiver desativado:

(let ((current-string "text to insert"))
  (put-text-property 0 (length current-string) 'face 'font-lock-warning-face
                     current-string)
  (insert current-string))

Se você quiser usar isso com o bloqueio de fonte ativado, poderá definir a propriedade font-lock-face. Tem o mesmo efeito, mas não é afetado por font-lock.

Lindydancer
fonte
Resposta clara e completa.
Tirou