Disons que nous avons un texte, et j'entre en mode visuel et sélectionne du texte. Comment rechercher rapidement le texte en surbrillance et le remplacer par autre chose?
109
Essayez d'exécuter ce qui suit ou insérez-le dans votre .vimrc
vnoremap <C-r> "hy:%s/<C-r>h//gc<left><left><left>
En appuyant sur ctrl+ ren mode visuel, vous serez invité à entrer le texte à remplacer par. Appuyez sur enterpuis confirmez chaque modification avec laquelle vous êtes d'accord you avec laquelle vous refusez n.
Cette commande remplacera votre registre h
afin que vous puissiez en choisir un autre (en remplaçant h
la commande ci-dessus par une autre lettre minuscule) que vous n'utilisez pas.
c
ingc
, le remplacement est effectué en une seule fois dans tout le tampon. Si vous avez fait une erreur et que vous souhaitez la rétablir, tapez simplementu
en mode commande. J'aime mieux cette approche que de confirmer chacun des remplacements (cela se produit avec lec
modificateur).vmap * y:let @/ = @"<CR>
sélectionné est mis en surbrillance.<left><left><left>
?c
degc
, vous devrez également supprimer l'un des<left>
's de la fin de la ligne.Cette cartographie rapide et simple recherche le texte mis en évidence visuellement (sans écraser le registre h) et sans utiliser le registre + dépendant du terminal:
Si vous n'aimez pas le ctrl-f, changez-le selon vos préférences
Une fois le texte en surbrillance, vous pouvez toujours faire une
s
ubstitution en tapant simplement:... car une recherche vide sur la
s
commande utilise la dernière chaîne recherchée.la source
control+f
sélectionne toujours le caractère suivant ainsi que ce que j'ai sélectionné visuellement. Des idées?%s//<your-replacement-string>
ne semble pas fonctionner pour mettre en évidence quelque chose comme/tmp/file
. il devient juste<your-replacement-string>/tmp/file
Celui-ci fonctionne également (au moins pour les sélections sur une seule ligne / les sélections qui ne contiennent aucun caractère spécial)
y
:s/<C-r>0/
0
est le registre yank.Comme d'autres personnes l'ont mentionné, il existe des moyens plus rapides de le faire, mais si vous venez de commencer à apprendre Vim (comme moi), c'est l'un des moyens «génériques».
// edit: Je viens de réaliser que l'approche 'register' échouera s'il y a des caractères comme des tabulations ou des retours à la ligne ou des
/
caractères dans la sélection (je devrais traiter manuellement ces caractères d'une manière ou d'une autre pour que la:s
commande fonctionne):la source
La réponse acceptée fonctionne très bien, sauf si vous avez des caractères spéciaux dans votre sélection visuelle. J'ai piraté ensemble deux scripts (ceux de Jeremy Cantrell et de Peter Odding ) pour créer une commande qui vous permettra de sélectionner visuellement une chaîne que vous voulez trouver même si elle contient des caractères regex spéciaux.
J'ai inclus ceci dans mon vimrc si cela est plus utile à quiconque.
la source
vmap <C-r> <Esc>:%s/<c-r>=GetVisual()<cr>//g<left><left>
(qui remplace simplement tout dans le fichier)À partir de Vim 7.4, vous pouvez utiliser le
gn
mouvement qui sélectionne les régions de texte qui correspondent au modèle de recherche actuel.Après avoir utilisé
cgn
pour modifier le texte dans la correspondance actuellement sélectionnée (oudgn
pour supprimer), en mode normal, vous pouvez utiliser.
pour répéter la commande et effectuer la correspondance suivante.Il y a un épisode de Vimcast montrant cette fonctionnalité.
la source
Mykola Golubyev, Merci pour la pointe! La suite utilise le registre "+" qui (selon votre terminal) contient déjà le texte en surbrillance, évitant ainsi l'utilisation du registre "h".
la source
Depuis http://vim.wikia.com/wiki/Search_and_replace_in_a_visual_selection :
Lorsque le texte est sélectionné visuellement, appuyez sur: pour entrer une commande. La ligne de commande entrera automatiquement dans la plage:
Vous pouvez entrer une commande telle que s / rouge / vert / g pour remplacer chaque rouge par du vert dans toutes les lignes de la dernière sélection visuelle. La commande apparaîtra comme:
Pour répéter une commande Ex sur un bloc précédemment sélectionné, utilisez: historique. Autrement dit, appuyez sur: puis, puis modifiez une commande précédente.
la source
J'ai ceci dans mon vimrc:
Cela saisira la sélection visuelle et lancera une commande de substitution avec elle.
EDIT: Je dois souligner que cela ne fonctionne pas avec les sélections visuelles multilignes. Bien que GetVisual () n'ait pas de problème à le renvoyer, je ne sais pas comment le mettre correctement dans la ligne de commande. Si quelqu'un a des conseils sur la façon dont je pourrais faire cela, veuillez commenter.
la source
Je ne pense pas que vous puissiez faire ça hors de la boîte. Mais beaucoup de gens aiment cette fonctionnalité, donc il y a des tonnes de macros et autres (je l'ai ajoutée moi-même). En voici un que vous pouvez ajouter, par exemple; appuyez simplement sur
*
pour rechercher la correspondance suivante sur le texte sélectionné visuellement.la source
D'autres réponses sont bonnes mais elles n'échappent pas aux caractères spéciaux. La réponse de @brian kennedy montre une méthode pour s'échapper mais cela nécessite beaucoup de code. Dans le cas d'une URL par exemple, l'échappement est obligatoire ou la recherche s'arrêtera sur «:».
Comme écrit dans vim.fandom.com/wiki/Search_for_visually_selected_text , vous pouvez faire un oneliner pour rechercher et échapper certains caractères. Vous pouvez échapper aux personnages que vous voulez, j'ai choisi de m'échapper
/\:
:Avec cette carte, je dois appuyer sur
//
en mode visuel pour rechercher le texte actuellement sélectionné sur l'ensemble du tampon.la source
Ma version courte préférée de ceci est
vnoremap s / y: s / "/
Ensuite, vous pouvez mettre en évidence une sélection et appuyez simplement sur s / pour lancer une commande de substitution.
la source
"
comme un littéral.<c-r>"
bien travailléJe n'ai pas le représentant à commenter, alors j'ajoute encore une autre réponse ...
vnoremap <C-r> "0y<Esc>:%s/<C-r>0//g<left><left>
@dmd et @dotancohen: cela a fonctionné pour moi sans épuiser
"h
(utilise explicitement 0, qui est de toute façon la dernière position de tirage) et fonctionne avec putty ssh -> mint (lmde); ne sais pas pour cent. Utilise également les commentaires @Niloct et @Nathan Friend pour supprimer la confirmation.la source
Exemple 1. Citez la sélection avec des étoiles, gardez le curseur au début de la sélection.
Exemple 2. Pipe le texte sélectionné avec base64:
Explication LHS:
Explication RHS:
la source
J'espérais qu'il y avait un moyen intégré dans Vim pour remplacer un mot, sans avoir à retaper le mot en premier lieu. Il y en a, bien que cela ne fonctionnera que pour le texte jusqu'à un caractère de limite de mot.
Une fois que vous avez survolé le mot, appuyez sur
*
ou#
pour mettre le mot en surbrillance et passez à l'emplacement suivant / précédent (si vous ne voulez pas changer d'emplacement dans le fichier, appuyez sur la touche opposée pour revenir à l'emplacement vous étiez juste à).Ensuite, tapez simplement:
%s//<your-replacement-string>
Comme mentionné dans la réponse d'une autre personne, si
%s
reçoit une entrée vide entre les barres obliques, alors il utilise le mot recherché précédemment. En appuyant sur*
ou#
, vous recherchez le mot sous le curseur, ce qui en fait le mot le plus récemment recherché.En fin de compte, ce n'est que six ou sept frappes + longueur du mot de remplacement pour effectuer cela et cela ne nécessite aucune macro ou modification de votre
.vimrc
.la source