43 votes

Comment remplacer une région dans emacs par le contenu du tampon yank ?

Lorsque j'utilise VIM ou la plupart des éditeurs sans modèle (Eclipse, NetBeans, etc.), je procède fréquemment comme suit. Si j'ai des blocs de texte similaires et que je dois tous les modifier, j'en modifie un, je le copie (ou j'utilise un tiret non supprimant), je sélectionne le bloc suivant dont j'ai besoin et je colle la version modifiée par-dessus. Si je fais la même chose dans emacs (sélectionner la région et coller avec C-y), la région n'est pas remplacée, elle est juste collée à la position du curseur. Quelle est la façon de faire cela dans emacs ?

0 votes

Avoir des blocs de texte similaires (dans votre code ?), suggère généralement que vous avez besoin d'un remaniement, par exemple en remplaçant les blocs de texte similaires par un appel de fonction/méthode qui contient le "texte similaire". Je crois que c'est l'une des raisons pour lesquelles la fonction "remplacer la région" d'Emacs ne m'a jamais vraiment manqué...

0 votes

@slu comment renommez-vous la belle fonction/méthode que vous avez extraite ?

1 votes

@slu c'était clairement un exemple de vouloir remplacer une région sélectionnée par le presse-papiers. La réponse que vous avez donnée n'était en aucun cas constructive et montrait un désir de donner un signal de vertu sur les pratiques de codage plutôt que de répondre à la question légitime.

74voto

Michael Mrozek Points 44120

Ajoutez ceci à votre .emacs :

(delete-selection-mode 1)

Tout ce qui est écrit dans le tampon pendant que la région est active l'écrase, y compris le collage, mais aussi le fait de taper quelque chose ou d'appuyer sur la touche retour arrière.

3 votes

Pourquoi n'est-ce pas le cas par défaut ?

3 votes

@mcb Probablement pour la même raison que la région n'était pas visible par défaut jusqu'à récemment ; la pratique standard d'emacs est (ou était, peut-être) de garder la marque à un endroit pendant que vous déplacez le point, et le fait qu'il y ait une région entre eux n'est pas pertinent à moins que vous n'utilisiez une commande qui opère spécifiquement sur elle. Vous ne voulez pas détruire la région à chaque fois que vous tapez, et il existe des commandes comme exchange-point-and-mark pour sauter à l'endroit où vous avez laissé la marque. Aujourd'hui, je pense que la plupart des gens n'utilisent pas la marque de cette façon, donc il est probablement bon de toujours afficher la région et de la traiter comme "active".

3 votes

Cela fonctionne quand on tape manuellement dans les régions marquées, mais pas quand on colle du texte :( Emacs 24 / Ubuntu 14.04.

16voto

offby1 Points 3412

Réglage de delete-selection-mode comme Michael l'a suggéré, semble la façon la plus naturelle de procéder.

Cependant, ce n'est pas ce que je fais :) Au lieu de cela, je mets les bonnes choses dans un "registre" -- par exemple, le registre "a" -- avec C-x r x a . Ensuite, je tue l'autre copie, et je copie le registre au même endroit avec C-x r g a .

C'est pratique car tuer n'affecte pas les registres, donc C-x r g a insère toujours les bonnes choses.

8voto

BobS Points 804

La manière par défaut de faire quelque chose comme ça est la suivante, qui n'est pas très élégante :

  1. Mettez le texte de remplacement souhaité dans le kill ring d'une manière ou d'une autre (par exemple, M-w).
  2. Mettez en surbrillance la région à remplacer.
  3. Supprimez-le ( C-w ).
  4. Remplacez-la par la région copiée précédemment ( C-y , M-y ). Cela remplace le contenu fraîchement supprimé par le même texte que celui que vous venez de supprimer ( C-y ), puis le remplace par le tampon suivant le plus récemment sauvegardé dans l'anneau de tampons ( M-y ).

Cela deviendrait vraiment pénible si vous vouliez faire cela 10 fois avec le même texte, car le remplacement souhaité serait repoussé plus loin dans l'anneau de suppression à chaque fois que vous supprimez une région, de sorte que vous devriez appeler M-w un nombre croissant de fois chaque fois que vous vouliez le tirer.

Je viens aussi de découvrir M-x delete-region grâce à Emacs : comment supprimer du texte sans kill ring ? . Comme la question l'indique, cela permet de supprimer le texte incriminé sans le mettre dans l'anneau de mort, ce qui évite de pousser le texte de remplacement plus bas sur la pile. Et, comme le mentionne la réponse pertinente, vous pouvez lier cette fonction à un raccourci clavier de votre choix.

3voto

user310031 Points 31

Si vous activez le mode CUA, cette coller sur la région sélectionnée devient le comportement normal.

3voto

Singletoned Points 2652

La façon dont je fais ça est :

  • allez à l'endroit où vous voulez les nouvelles choses
  • coller les bonnes choses
  • votre curseur est maintenant entre les nouveaux éléments et ceux dont vous voulez vous débarrasser.
  • sélectionner vers l'avant jusqu'à ce que tout ce dont vous voulez vous débarrasser soit sélectionné
  • le supprimer

C'est une façon légèrement différente d'y penser. Collez ce que vous voulez, puis débarrassez-vous de ce que vous ne voulez pas, plutôt que de remplacer ce que vous ne voulez pas par ce que vous voulez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X