Vim: mondial de la recherche & remplacer, à partir de la position du curseur
Quand je fais une recherche avec
/\vSEARCHTERM
Vim démarre la recherche de la position du curseur vers le bas, et il s'enroule autour de la partie supérieure. Toutefois, lorsque la recherche & remplacer à l'aide de
:%s/\vBEFORE/AFTER/gc
Vim commence au début du fichier.
Est-il un moyen de faire Vim recherche & remplacer à partir de la position du curseur ET l'enrouler autour de la tête, une fois qu'il atteint la fin?
- Ce n'
\v
faire? \vpattern
- 'très de la magie" pattern: les caractères non-alphanumériques sont interprétés comme spécial regex symboles (pas de s'échapper nécessaire)- quel est le point de commencer à partir de la position actuelle et l'enrouler autour du fichier au lieu de l'utilisation de
%
? je ne vois pas raisonnable d'utiliser pour que vous allez par le biais de l'ensemble du dossier de toute façon. - Le but était de lancer la recherche à partir du curseur, et de passer à travers chaque étape-par-étape. Mais je n'ai pas utilisé Vim dans années maintenant.
Vous devez vous connecter pour publier un commentaire.
Il n'est pas difficile d'atteindre le comportement à l'aide de deux étapes de substitution:
Tout d'abord, une substitution de commande est exécuté pour chaque ligne à partir de la
actuel jusqu'à la fin du fichier. Alors, que
:substitute
commande estrépète avec le même motif de recherche, de remplacement de chaîne et de drapeaux,
à l'aide de la
:&
de commande. Ce dernier, cependant, effectue la substitutionsur 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éelles remplacements, la ligne adressée par
''
est la ligne qui a été leactuel avant que la substitution de commande a été exécutée.
Note que la deuxième commande (après la
|
symbole) ne nécessite pas dechanger lorsque le motif ou les drapeaux de la première sont modifiés.
Vous êtes déjà à l'aide d'une fourchette,
%
, qui est à court de main pour1,$
sens de 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 la dernière ligne. Donc, la commande serait:Mais la
.
ou de la ligne en cours peut supposer, par conséquent, peut être retiré:Pour plus d'aider à voir
10:s/pattern/replace/gc
%
est un raccourci pour1,$
( Vim aider =>
:help :%
égal à 1,$ (l'ensemble du fichier).).
est la position du curseur de sorte que vous pouvez faireDe remplacer à partir du début du document jusqu'au curseur
etc
Je vous suggère fortement de lire le manuel à propos de la gamme
:help range
comme à peu près toutes les commandes fonctionnent avec une fourchette.g&
est interprétée comme une commande Ex ici, c'est donc le même que:g//
qui ne répète pas la dernière substitution, plutôt imprime toutes les lignes correspondant à la dernière modèle de recherche à la place. Peut-être, ici, vous signifiait une commande mode Normalg&
. La commande elle-même et les commentaires à désinformer le lecteur.%
est un raccourci pour1,$
(début à fin).' (c'est à dire, s/début/fin)? Aussi, vous voudrez peut-être ajouter une virgule à la fin de votre "de remplacer À partir du début du document jusqu'à la" curseur de ligne, parce que même si elle commence par une majuscule, c'est toujours le genre de l'ambigu, car au début je pensais que c'était en se référant à la ligne du dessus, de sorte qu'il peut aider à préciser que c'est pour la ligne ci-dessous un petit peu mieux.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 sur
q
encore une fois, ne pas envelopper. Donc, fondamentalement, quittez la recherche en appuyant surqq
au lieu deq
! (Et si vous ne voulez enchaîner, il suffit de tapery
.)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*
:q
,l
, ou Esc) et ne veulent pas continuer à partir du haut, vous pouvez déjà appuyez surq
ou Esc de nouveau pour quitter le deuxième commande tout de suite. Qui est, la proposition d'ajout de l'invite semble reproduire efficacement la fonctionnalité déjà présente.yyyq
, continuer le montage, pas de désorienter les sauts. Maisyyyqq
est presque aussi bon, si vous pensez à un double tap à peu près un seul robinet en termes de facilité d'utilisation.q
la deuxième fois). Ce dernier laisse le curseur sur le dernier événement qui a été remplacé (juste avant le premierq
a été pressée).norm!``
commande::,$s/BEFORE/AFTER/gc|1,''-&&|norm!``
.Voici quelque chose de très rude qui répond aux préoccupations sur l'ajustement de la recherche autour avec l'approche en deux étapes (
:,$s/BEFORE/AFTER/gc|1,''-&&
) ou avec un intermédiaire "Continuer au début du fichier?" approche:Cette fonction utilise un couple de hacks pour vérifier si l'on doit enrouler autour de la partie supérieure:
Je suis en retard à la fête, mais je comptais trop souvent sur une telle fin de stackoverflow answerrs de ne pas le faire. J'ai rassemblé des conseils sur reddit et stackoverflow, et la meilleure option est d'utiliser le
\%>...c
modèle dans la recherche, qui ne correspond qu'après votre curseur.Cela dit, il a également crée le modèle pour la prochaine étape de remplacement, et il est difficile de type. Pour contrer ces effets, une fonction personnalisée doit filtrer la recherche de modèle par la suite, donc le réinitialiser. Voir ci-dessous.
J'ai fait valoir moi-même avec une cartographie qui remplace la prochaine occurrence et passe à la suivante après, et pas plus (c'était mon but de toute façon). Je suis sûr que, sur cette base, une substitution globale peut être travaillé. Gardez à l'esprit lorsque l'on travaille sur une solution visant à quelque chose comme
:%s/.../.../g
que le modèle ci-dessous, filtre correspond à tous lignes de gauche à la position du curseur -- mais est nettoyé après la seule substitution complète, de sorte qu'il perd cet effet directement après, sauts pour le prochain match et est donc en mesure de courir à travers tous les matches un par un.fun! g:CleanColFromPattern(prevPattern)
return substitute(a:prevPattern, '\V\^\\%>\[0-9]\+c', '', '')
endf
nmap <F3>n m`:s/\%><C-r>=col(".")-1<CR>c<C-.r>=g:CleanColFromPattern(getreg("/"))<CR>/~/&<CR>:call setreg("/", g:CleanColFromPattern(getreg("/")))<CR>``n