154 votes

Vim: recherche globale et remplacement, à partir de la position du curseur

Quand je cherche avec

 /\vSEARCHTERM
 

Vim commence la recherche de la position du curseur vers le bas, et elle se retournera vers le haut. Cependant, quand chercher & remplacer en utilisant

 :%s/\vBEFORE/AFTER/gc
 

Vim commence en haut du fichier.

Existe-t-il un moyen de faire en sorte que Vim recherche et remplace à partir de la position du curseur ET s’enroulant vers le haut une fois qu’il atteint la fin?

233voto

Peter Rincker Points 14594

Vous êtes déjà à l'aide d'une fourchette, %, ce qui est court à la main pour 1,$ signifie que la totalité du fichier. Pour passer de la ligne courante à la fin vous utilisez .,$. Le délai moyen de la ligne en cours et $ "signifie que la dernière ligne. Donc, la commande serait:

:.,$s/\vBEFORE/AFTER/gc

Mais l' . ou de la ligne en cours peut supposer, par conséquent, peut être retiré:

:,$s/\vBEFORE/AFTER/gc

Pour plus d'aider à voir

:h range

64voto

ib. Points 14520

Il n'est pas difficile d'atteindre le comportement à l'aide de deux étapes de substitution:

:,$s/BEFORE/AFTER/gc|1,''-&&

Tout d'abord, une substitution de commande est exécuté pour chaque ligne à partir de la actuel jusqu'à la fin du fichier. Alors, qu' :substitute commande est répète avec le même motif de recherche, de remplacement de chaîne et de drapeaux, à l'aide de l' :& commande. Ce dernier, cependant, effectue la substitution sur la gamme de lignes de la première ligne du fichier de la ligne où la précédente marque de contexte a été mis en, moins un. Depuis la première :substitute commande stocke la position du curseur avant le départ réel les remplacements, la ligne adressée par '' est la ligne qui a été le actuel avant que la substitution de commande a été exécutée.

Notez que la deuxième commande (après l' | symbole) ne nécessite pas de changer lorsque le motif ou les drapeaux de la première sont modifiés.

61voto

mb14 Points 7166

% est un raccourci pour 1,$ (commencer à commencer). . est la position du curseur afin que vous puissiez faire

 :.,$s/\vBEFORE/AFTER/gc
 

Pour remplacer depuis le début du document jusqu'au curseur

 :1,.s/\vBEFORE/AFTER/gc
 

etc

Je vous suggère fortement de lire le manuel sur la plage :help range car pratiquement toutes les commandes fonctionnent avec une plage.

6voto

q335r49 Points 137

J'ai ENFIN trouver une solution au fait que l'abandon de la recherche se replace au début du fichier sans l'écriture d'un énorme fonction...

Vous ne croiriez pas combien de temps il m'a fallu pour arriver à ce. Il suffit d'ajouter une invite de s'envelopper: si l'utilisateur appuie q encore une fois, ne pas envelopper. Donc, fondamentalement, quittez la recherche en appuyant sur qq au lieu de q! (Et si vous ne voulez enchaîner, il suffit de taper y.)

:,$s/BEFORE/AFTER/gce|echo 'Continue at beginning of file? (y/q)'|if getchar()!=113|1,''-&&|en

En fait, j'ai mappé à un raccourci clavier. Ainsi, par exemple, si vous souhaitez rechercher et remplacer chaque mot sous le curseur, à partir de la position actuelle, avec q*:

exe 'nno q* :,$s/\<<c-r>=expand("<cword>")<cr>\>//gce\|echo "Continue at beginning of file? (y/q)"\|if getchar()==121\|1,''''-&&\|en'.repeat('<left>',77)

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