web-dev-qa-db-fra.com

vim: Comment remplacer un caractère sous mon curseur par du texte précédemment extrait (plus d'une fois)

Supposons que j'ai inséré 3 caractères "foo" dans mon presse-papiers en utilisant une sélection visuelle + yank, c'est-à-dire: "vllly"

Ensuite, j'ai déplacé mon curseur sur un autre caractère (appelons ce caractère x) sur la ligne 5 que j'aimerais remplacer par ce que j'ai précédemment téléchargé, à savoir foo.

Je peux utiliser 'p' pour coller foo après x, ou 'P' pour coller foo avant x, mais je veux remplacer x avec foo.

Je peux utiliser 'vp' pour remplacer x par foo, mais cela ne fonctionne qu'une fois, car cela me laisse avec x dans mon presse-papiers. En d'autres termes, si je passe à ma prochaine occurrence de x et que je clique à nouveau sur vp, il ne la remplace pas par foo.

Bien sûr, je pourrais faire une recherche/remplacement en utilisant: s/x/foo/gc et en ignorant toutes les occurrences de x que je ne souhaite pas remplacer, mais c’est un peu fastidieux à taper, en particulier lorsque j’ai besoin de do est remplacer 2 ou 3 occurrences de x qui sont très proches de mon curseur mais pas sur la même ligne (ie: lignes 2, 3 et 7).

J'utilise actuellement: 2,7s/x/foo/gc mais je me demande s'il existe un moyen de déplacer mon curseur sur x et d'appuyer sur [insérer un bouton magique ici] pour le remplacer par foo. Et puis je peux passer à ma prochaine occurrence de x et appuyer à nouveau sur [bouton magique] et bouger, il est à nouveau remplacé par foo.

Même si cela me fait mal d'utiliser cette analogie, imaginez que vous tapez dans le bloc-notes et que vous sélectionniez 3 caractères, appuyez sur Ctrl + c pour les copier dans votre presse-papiers, puis mettez en surbrillance x et appuyez sur Ctrl + v pour le remplacer foo. Ensuite, vous mettez un autre x en surbrillance, puis appuyez à nouveau sur Ctrl + v, etc.

Comment puis-je faire cela dans vim?

24
Kosta Kontos

Qu'en est-il de s<C-r>0, cela peut être répété avec .

  • s supprime le caractère sous le curseur et vous met en mode insertion.
  • <C-r>0 insère le registre 0, qui contient le texte extrait.

Vous pouvez également utiliser s et taper foo manuellement, ce qui est également répétable avec .

40
Stefan

Coller du registre 0 avec v"0p.

5
Raimondi

Copiez votre "truc" dans un autre registre, par exemple. enregistrer un:

"ay

Sélectionnez ensuite visuellement le caractère que vous souhaitez remplacer par "foo" et appuyez sur 

"AP

1
Habi

J'ai besoin de ça si souvent, j'ai écrit un plugin pour ça: ReplaceWithRegister .

Ce plugin offre une commande deux-en-un gr qui remplace le texte couvert par un {mouvement}, 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 est parti.

0
Ingo Karkat

Ceci est moins qu'idéal, mais si vous utilisez le tampon nommé a (par exemple yank avec "ay), vous pouvez utiliser x"aP. Utilisez votre carte préférée pour en faire une frappe unique.

0
William Pursell