vim - comment puis-je faire un "mot de changement" en utilisant le tampon de collage actuel

86

J'ai un peu de texte dans mon tampon de copie, par exemple, j'ai fait un ywmot (yank mot) et maintenant j'ai «foo» dans mon tampon.

Je passe maintenant au mot "barre" et je souhaite le remplacer par mon tampon de collage.

Pour remplacer le texte manuellement, je pourrais le faire cwpuis taper le nouveau mot.

Comment puis-je modifier le mot mais utiliser le contenu de mon tampon de collage au lieu de saisir manuellement le mot de remplacement?

La meilleure option que j’ai à l’heure est d’aller au début du mot que je veux remplacer et de le faire dw(supprimer le mot), puis de vous rendre à l’autre endroit et de faire le yw(mot sec), puis de revenir à la zone de remplacement et de p(pâte) qui est un peu maladroit surtout si elles ne sont pas sur le même écran.

Michael Durrant
la source

Réponses:

120

Option 1

Vous pouvez utiliser des registres pour le faire et créer un raccourci clavier pour le processus.

Tirez le mot que vous voulez remplacer par yw.

Le mot tiré est dans le 0registre que vous pouvez voir en l’émettant :registers.

Allez au mot que vous voulez remplacer et faites-le cw. Do Ctrl+ rsuivi de 0pour coller le 0registre.

La carte pour cela ressemblerait à quelque chose comme ça (en supposant que Ctrl+ jsoit notre combo clé):

:map <C-j> cw<C-r>0<ESC>

Option 2 (plus simple)

Avec votre mot tiré, déplacez le curseur sur le mot que vous voulez remplacer et faire viwp. Ce qui est visuel, sélectionnez mot intérieur et coller.

Avec l'aimable autorisation de @tlo dans les commentaires: vous pouvez également le faire vep. Un caractère plus court. Les inconvénients doivent positionner le curseur au début du mot et (comme avec le mien) modifie le tampon.

Commentaire (de Michael):

C'est bon. Remarque supplémentaire: la deuxième méthode est certes plus simple, mais elle ne fonctionne que pour une substitution car après chaque substitution, le tampon est alors remplacé par le champ remplacé (ancien texte). La première méthode est un peu plus difficile à utiliser MAIS avec l'avantage que le tampon 0 reste «tel quel», vous pouvez donc utiliser cette méthode pour effectuer plus d'un remplacement du même texte.

jmathew
la source
14
Option 3 (encore plus simple): le mot étant tiré, placez le curseur sur le premier caractère du mot à remplacer vep.
TLO
J'aime l'option 3 quand il n'y a qu'un mot à changer. S'il y a plus d'un mot à changer, l'option 1 me permet d'utiliser le. opérateur pour le répéter ..
typelogic
3
ve"0ptravaillerait pour vous permettre de répéter votre changement
JKillian
Si vous voulez le mapper sur quelque chose, il est probablement préférable d'utiliser: map <C-j> ciw<C-r>0<ESC>pour que peu importe d'où vient le mot que vous appuyez ^j.
Paul Parker
Quiconque veut savoir pourquoi CTRL-R fait sa magie: :help insertrecherchez ensuite CTRL-R /CTRL-R. Pour savoir comment ça ve"0pmarche, regardez:help registers
Paul Parker
12

ywpour tirer votre mot, puis déplacez le curseur sur le mot que vous souhaitez remplacer et utilisez-le "_dwpour le supprimer, en envoyant le texte au registre nul (pour ne pas écraser le contenu du "registre, où le texte coupé / coupé passe par défaut) ), puis simplement coller avec p.

Vous pouvez utiliser le mappage suivant pour rendre les choses un peu plus faciles:

nnoremap <leader>d "_d

... donc en mode normal, vous pouvez utiliser \dwpour supprimer un mot sans affecter le "registre.

maux de tête
la source
3

Pour faire cela de la manière VIM, vous utilisez intentionnellement les registres yank, delete et autres.

Register "0est le registre de yank. Tout ce que vous tirez sera mis ici, mais ne supprime jamais le registre "0.

Donc, dans votre exemple, vous venez de tirer un mot. Pour remplacer un mot par ce que vous venez de tirer, vous tirez parti des suppressions ne touchant jamais le registre des coups perdus. Alors déplacez-vous vers le mot cible, supprimez-le avec dw, puis collez-le dans votre registre yank "0p, ou mieux encore, cwensuite ^R0(qui est répétable).

Le registre des petites suppressions se trouve juste en face du registre de yank "-. Toute petite suppression ou suppression de modification est mise ici, mais les tirets ne se touchent jamais "-. Une suppression compte comme petite si elle est inférieure à une ligne complète.

Registres "1- "9sont les registres d’historique des suppressions. Avec "1contenant la dernière suppression importante ou suppression de modification, et "9contenant la suppression la plus ancienne ou importante de modification la plus ancienne. Seuls les suppressions qui ne sont pas petites, c'est-à-dire les suppressions d'une ligne ou plus, sont poussées sur "1- "9.

Pour toute opération qui modifie un registre, une copie est également toujours placée dans le registre par défaut, également appelé registre non nommé "". C'est le registre utilisé lorsque vous ne nommez pas explicitement un registre.

Register "_est le registre des trous noirs et il est toujours vide. Si vous le supprimez, aucun registre n’est modifié, pas même le ""registre par défaut , ni le registre des trous noirs lui-même. Le texte supprimé est complètement disparu, en dehors de votre historique d'annulation. Tirer ou coller du registre des trous noirs ne fait essentiellement rien.

Le registre des trous noirs "_vous permet de faire des choses comme une première petite suppression, puis un certain nombre d'autres suppressions "_sans changer votre registre de petites suppressions "-, puis de coller votre première petite suppression.

Les autres registres sont le dernier registre inséré "., les registres de nom de fichier "%et "#le registre de commandes, le registre de ":recherche "/et le registre d'expression "=.

Vous pouvez obtenir une liste de tous ces registres et de leur contenu à l'aide de la commande :register. Cette commande est très utile pour expérimenter et apprendre ce qui finit où.

00prométhée
la source
2

J'en ai besoin si souvent, j'ai écrit un plugin pour simplifier et permettre une vitesse maximale: ReplaceWithRegister .

Ce plugin propose une commande deux en un grqui remplace le texte couvert par un objet {motion} / text, des lignes entières ou la sélection en cours par le contenu d'un registre; l'ancien texte est supprimé dans le registre des trous noirs, c'est-à-dire qu'il a disparu. Il gère de manière transparente de nombreux cas d'angle et permet une répétition rapide via la .commande standard . Si ça ne vous plait pas, sa page contient des liens vers des alternatives.

Ingo Karkat
la source
2

Pour répéter le collage, utilisez la commande de changement.

cw ^R0ESC (^ R = Contrôle + R; 0 pour le registre 0)

remplacera le mot avec le contenu de reg. 0 et vous permet de répéter avec.

C'est génial pour cgn(VIM 7.4) de remplacer les modèles de recherche:

  • Première recherche avec /ou*
  • cgn ^R0ESC
  • .à répéter au prochain match ou nà sauter
laktak
la source
1

Comme il n'est pas encore inclus, vous remplacez généralement les chaînes :%s/.../.../par des mots et vous pouvez également le faire avec le mot situé sous votre curseur.

  1. Vous entrez la première partie de la commande, ce que vous recherchez: :s/find/
  2. Ensuite, vous cliquez <ctrl-r>et choisissez avec le curseur le mot avec lequel vous souhaitez le remplacer.
  3. Puis vous cliquez <ctrl-w>(petit "mot") ou <ctrl-a>(gros "mot) pour coller le mot sous le curseur dans la ligne de commande
  4. Ensuite, vous terminez la commande.

Voir le lien sur l'utilisation des éléments de curseur dans la ligne de commande .

erikbwork
la source
1

J'utilise habituellement ceci: ywpour tirer foo, puis supprimer baravec dw, et comme dernière étape, mettre foodans le registre 0qui contient le texte arrêté avec "0p. Répétez la mise avec un point ( .) si nécessaire.

En outre, au lieu de ywet dw, vous pouvez utiliser yiwet diw(remarquez le supplément i- cela signifie à l' intérieur ). Cela vous permet d’effacer ou de supprimer un mot de n’importe quel endroit à l’ intérieur de celui-ci, pas seulement au début du mot.

Nino
la source
0

J'utilise ce plugin pour élargir la région de sélection: https://github.com/terryma/vim-expand-region

Donc, ma combinaison pour changer un mot sera: vvpà n'importe quel endroit d'un mot.

J'ai aussi un hack pour sauvegarder le contenu du registre sans nom après la coller afin de pouvoir le répéter.

vnoremap p p:let @"=@0 <CR>
vnoremap P P:let @"=@0 <CR>

(mon presse-papiers est autoselect)

utilisateur2656799
la source
0

J'utilise le mappage de clé ci-dessous pour remplacer le mot actuel par le mot copié.
" replace with Register 0
map <leader>rr ciw<C-r>0<Esc>

yiwcopier un mot. Accédez à un mot. ,rrremplace le mot.
La clé du leader est map to ,.

Pêcheur
la source
,rwCela aurait plus de sens, et sur QWERTY, il est probablement plus facile et rapide de déconner. Sur DVORAK, j’ai choisi ,rc, qui bien que cela n’ait pas beaucoup de sens, c’est plus facile et plus rapide que tous. Sur DVORAK, ,rwest un spectacle d'horreur;)
Paul Parker
0

Tout d’abord, naviguez jusqu’au début du mot que vous voulez extraire. Si vous êtes au milieu du mot, il suffit bde revenir au début. Ensuite, faites yeglisser le mot entier, sans espaces yfinaux ( repère / fin e). Pour finir, allez au mot que vous voulez remplacer - peut-être wplusieurs fois - et vepentrez le vmode de sélection isuel, sélectionnez le nom edu mot et ple contenu qui a été retiré pour la dernière fois.

(Si quelqu'un veut savoir pourquoi je ne me suis pas contenté de commenter la réponse acceptée, pour une petite modification, yeplutôt que d'utiliser yw, c'est que ma réputation sur cette pile est encore trop basse.)

Anomalie
la source
0
  1. utilisez ywpour tirer le monde, allez dans le monde que vous voulez changer.
  2. utilisez vpour sélectionner le monde veou vwselon votre situation.
  3. entrez ppour coller le monde que vous avez copié pour remplacer le bloc sélectionné
ramwin
la source
0

Ajouter à l'autre de meilleures réponses. Un peu trop évident mais vous pouvez simplement coller avant de supprimer. "yw" puis allez le mot que vous voulez remplacer, "pldw" (coller, déplacer un caractère à droite, supprimer le mot.

Ali Almoullim
la source