Comment remplacer le texte intérieur par du texte tiré

17

Un modèle d'édition que je rencontre fréquemment est le suivant: Je veux extraire un morceau de texte entre guillemets ou crochets et remplacer ce morceau de texte dans une autre paire de guillemets / crochets.

Par exemple, si je veux copier le nom de la classe foo baret le coller ailleurs:

<span class="foo bar">

<div class="this-should-be-replaced-with-foo-and-bar">

Ce que je sais, c'est ceci: si je me déplace à l'intérieur de la classe du span, j'utilise yi"pour tirer le texte à l'intérieur des guillemets.

Maintenant, je l'ai dans mon registre, je devrais donc être en mesure de remplacer le contenu de la classe du div par lui. Mais je ne trouve pas de moyen pratique de le faire.

Si j'utilise ciwcela finit par écraser mon registre avec du contenu à changer, alors je perds mon texte tiré.

La meilleure chose que je puisse trouver est de passer à la première citation de la classe du div, de frapper p, puis de supprimer la citation suivante avec dt".

Habituellement, je fous ma position, et je la colle quelque part dans les guillemets fusionnant les deux chaînes, et ça gâche les choses.

J'espère qu'il existe un moyen de faire une combinaison "remplacer le texte intérieur par mon contenu tiré s'il vous plaît" pour rendre cela plus facile.

jurgenb
la source

Réponses:

19

Vous pouvez utiliser vi"pà l'intérieur "". Cela peut remplacer le texte dans le registre yank, c'est donc important lorsque vous souhaitez utiliser le texte yanked original plus d'une fois.

EDIT : Informations supplémentaires du commentaire d'Octaviour concernant le fait de le rendre réutilisable plusieurs fois:

Pour ce faire, je voudrais tirer sur un registre nommé, ce qui rend les deux commandes: "ayi"et vi""apsi vous utilisez Register a.

grodzik
la source
2
Je vais développer cette solution. Vous tirez d'abord le texte que vous souhaitez copier. Ensuite, vous allez à l'endroit que vous souhaitez coller, sélectionnez visuellement à l'aide de vi ". Une commande de collage place désormais simultanément le contenu du registre sans nom au curseur et supprime le texte sélectionné. Par conséquent, vi" p accomplit exactement ce que vous voulez, mais il remplace le contenu du registre sans nom, vous empêchant de coller deux fois le même texte. Pour ce faire, je tirerais vers un registre nommé, ce qui rend les deux commandes: "ayi" et et vi "" ap si vous utilisez le registre a.
Octaviour
Merci d'avoir élaboré. Il aide à énoncer les choses avec des mouvements vim, il est plus facile de se souvenir ensuite. Ce n'est toujours pas aussi facile que je l'espérais, mais cela a du sens d'une manière vim. L'utilisation de la commande dot pour la répéter et la remplacer rapidement une deuxième fois ne semble cependant pas fonctionner. J'espérais que ce serait un raccourci. :)
jurgenb
11

Vous pouvez utiliser le registre numéroté. Commencez par "foo-bar" yi", qui remplira le "0registre, voir :h "0. Faites ensuite ci"<c-r>0pour remplacer par le contenu du registre 0.

Voir :h i_CTRL-Rpour une description de la dernière partie.

Karl Yngve Lervåg
la source
2
Pourquoi ne pas simplement le retirer dans le registre sans nom ( yi") et le coller du registre 0où il est stocké après avoir supprimé le texte à modifier ( ci"<c-r>0)? En terme de vimgolf vous gagnez 2 frappes et vous ne jouez pas avec vos registres.
statox
dès que j'appuie sur 'a', je me retrouve en mode édition, cela ne copie pas dans un registre
jurgenb
@ n3wjack C'est probablement parce que vous n'avez pas appuyé CTRL+ravant a, c'est ce que cela <c-r>signifie.
statox
1
@ KarlYngveLervåg En ciwfait, met le texte supprimé dans le registre sans nom mais les registres sont décalés, c'est pourquoi vous devez utiliser à la <c-r>0place de <c-r>". Tu vois :h quote_number.
statox
1
Je pense, plus précisément, que le point ici ne concerne pas le registre sans nom, mais plutôt le registre numéroté. Le "0registre n'est rempli que par la commande yank et ne sera pas perturbé par exemple c.
Karl Yngve Lervåg
9

Voici une autre solution. Ce n'est pas le meilleur en terme de Vimgolf, mais il utilise le registre des trous noirs:

Une fois que vous êtes sur la foo barchaîne, vous pouvez le tirer normalement en utilisant yi".

Puis à l'intérieur des crochets pour changer: "_di"P

Lequel est:

"_       We will use the black hole register
di"      Delete the inner brackets and put the deleted text in the black hole register
P        Put the previously yanked text

L'avantage du registre de trou noir est qu'il ne gâchera pas vos autres registres. Voir :h quote_pour plus de détails.

(Notez que cette réponse n'est là que pour parler du registre d'interruption. J'utilise personnellement la sélection visuelle comme suggéré par @grodzik.)

statox
la source
Je pense que vous avez besoin d'un majuscule Ppour celui-là. Lorsque vous di"votre curseur sera laissé sur les dernières citations et pcollera après, où comme Pcollera avant la position actuelle.
jecxjo
@jecxjo C'est vrai, j'ai édité ma réponse, merci!
statox
8

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

Ce plugin offre une commande deux-en-un grqui remplace le texte couvert par un objet {motion} / text, des lignes entières ou la sélection actuelle 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 vous ne l'aimez pas, sa page contient des liens vers des alternatives.

Ingo Karkat
la source
Génial! Cela devrait être de la vanille.
Philipp Moers