2009-11-24 4 views
1

Je souhaite copier un texte d'un tampon vers un autre avec les propriétés du texte. Donc, j'aiDéfinir les propriétés du texte

(with-current-buffer from-buffer 
    (setq text-to-copy (buffer-substring beg end))) 

Comment puis-je insérer le texte à copier dans un autre tampon avec toutes les propriétés du texte? Je suis particulièrement intéressé par les propriétés 'visage'.

La fonction tampon substring retourne une liste, par exemple ("substring" 42 51 (face font-lock-keyword-face) 52 59 (face font-lock-function-name-face))

Si je passe cette liste à (insert text-to-copy) il semble qu'il ne tient pas compte des propriétés de texte

Répondre

2

Si font-lock-mode est activée dans le tampon cible d'insertion, la propriété de visage sera réinitialisée une fois que la fontification entrera en jeu. Je pense que vous devrez soit désactiver font-lock-mode, soit modifier les propriétés du texte pour remplacer «face» par «font-lock-face» avant l'insertion.

+0

oui, c'était le mode font-lock. Merci beaucoup! –

0

La fonction « insert » doit gérer les chaînes qui incluent texte- propriétés, en l'état. Puisque buffer-substring retournera par défaut une chaîne avec des propriétés de texte si présentes, '(insert text-to-copy)' devrait être tout ce que vous devez faire.

Si d'autre part vous voulez extraire la chaîne sans le texte-propriétés, vous voulez être en utilisant à la place buffer-substring-no-properties

+0

Merci pour votre réponse. Il semble que (insérer) ne prenne pas en compte les propriétés du texte. Ils disent cela aussi dans la documentation pour (insérer) –

+0

Je viens de vérifier, et vous avez raison ... mais sur quoi je fondais ma réponse était ce commentaire du manuel elisp sur les propriétés de texte (dont je me suis souvenu après "Copier du texte entre des chaînes et des tampons préserve les propriétés avec les caractères, ce qui inclut des fonctions aussi diverses que la sous-chaîne, l'insertion et la sous-mémoire tampon. " Donc, des informations contradictoires, ... J'imagine que la seule option qui reste est d'itérer sur les résultats avec 'get-text-property' et' set-text-property' - ne semble pas élégant bien que – NikkiA

0

Cela devrait fonctionner. Ceci est d'Emacs 23.1.1:

buffer-substring is a built-in function in `C source code'. 

(buffer-substring start end) 

Return the contents of part of the current buffer as a string. 
The two arguments start and end are character positions; 
they can be in either order. 
The string returned is multibyte if the buffer is multibyte. 

This function copies the text properties of that part of the buffer 
into the result string; if you don't want the text properties, 
use `buffer-substring-no-properties' instead. 

Vous pouvez utiliser la commande interactive describe-text-properties pour voir ce qu'il vous est réellement obtenu:

describe-text-properties is an interactive compiled Lisp function in 
`descr-text.el'. 

It is bound to <C-down-mouse-2> <dp>, <menu-bar> <edit> <props> <dp>. 
(describe-text-properties pos &optional output-buffer) 

Describe widgets, buttons, overlays and text properties at pos. 
Interactively, describe them for the character after point. 
If optional second argument output-buffer is non-nil, 
insert the output into that buffer, and don't initialize or clear it 
otherwise. 
+0

j'ai besoin pour appliquer les propriétés de texte renvoyées de (buffer-substring) au texte inséré –

Questions connexes