Appliquer la commande en mode normal aux correspondances d'expression régulière

10

J'utilise l'expression régulière suivante pour faire correspondre une chaîne de documentation sous une définition de fonction Clojure:

\vdefn.*\n\s*\zs"([^"]|\n)*"

Existe-t-il un moyen d'exécuter la commande en mode normal gq(lignes de formatage) sur toutes les correspondances de ce modèle dans un fichier donné?


la source

Réponses:

10

Puissance de g:

:g/\vdefn.*\n\s*\zs"([^"]|\n)*"/normal gngq

La partie entre les /s est assez explicite, car c'est le regex de votre question d'origine.

normal gngqà la fin est quelque peu intéressant. gnsélectionnera la prochaine correspondance de l'expression régulière et gqformatera bien sûr cette sélection (comme vous l'avez mentionné dans votre question).

:gest la partie vraiment géniale. C'est, à mon avis, l'une des fonctionnalités les plus utiles de Vim. La gcommande ex prend une expression régulière et une commande Ex, et elle exécute la commande sur chaque ligne à laquelle correspond l'expression régulière. Si vous ne l'avez pas :gdéjà appris , je vous recommande fortement de le faire, car cela augmentera considérablement votre productivité. Quelques ressources sont propres à Vim :help :gou Power of g sur le wiki de Vim.

Poignée de porte
la source
La gnpièce sélectionne à partir de la ligne où Vest déclenchée la prochaine occurrence (pas celle sur la même ligne) du motif. La documentation de Vim indique que si le mode visuel est actif, la sélection est étendue de la ligne actuelle au motif suivant. Cela provoque un comportement indésirable.
@merb Oups, je ne m'en étais pas rendu compte. Édité.
Poignée de porte
La sélection est toujours de la ligne du match au match suivant . Parcourir manuellement les commandes du mode normal montre que cela //s<cr>me laisse au début du match sur la ligne actuelle, mais //e<cr>me laisse à la fin du match suivant, pas le match actuel.
1
Le problème semble être avec //s<cr>V. Quand je cours, :normal Vje passe en mode ligne visuelle, comme prévu. Quand je lance :normal //s<cr>mon curseur atterrit sur le premier "du match, comme prévu. Quand je cours, :normal //s<cr>Vje n'ai pas de sélection visuelle.
1
Résolu. La commande doit être normal gngq. Suggérer une modification.