Imaginez que j'ai le texte suivant:
some random stuff
* asdf
* foo
* bar
some other random stuff
Je veux remplacer les puces astérisques par des nombres, comme ceci:
some random stuff
1. asdf
2. foo
3. bar
some other random stuff
Comment cela peut-il se faire dans vim?
substitute
filetype-markdown
range
markup
counting
Brennan Vincent
la source
la source
1.
? Le:%s/^* /1. /
ferait donc. Cela semble beaucoup moins de travail.Réponses:
Vous pouvez essayer la commande suivante:
D'abord, il initialise la variable
c
(let c=0
), puis il exécute la commande globaleg
qui recherche le modèle^*
(un début de ligne, suivi d'un astérisque et d'un espace).Chaque fois qu'une ligne contenant ce motif est trouvée, la commande globale exécute la commande:
let c+=1 | s//\=c.'. '
Elle incrémente la variable
c
(let c+=1
), puis (|
) elle substitue (s
) le motif recherché précédent (//
) avec l'évaluation d'une expression (\=
):le contenu de la variable
c
concaténée (.
) avec la chaîne'. '
Si vous ne souhaitez pas modifier toutes les lignes de votre tampon, mais uniquement un paragraphe spécifique, vous pouvez passer une plage à la commande globale. Par exemple, pour modifier uniquement les lignes dont le nombre est compris entre 5 et 10:
Si vous avez un fichier contenant plusieurs listes similaires que vous souhaitez convertir, par exemple quelque chose comme ceci:
Vous pouvez le faire avec la commande suivante:
C'est juste une variante de la commande précédente, qui réinitialise la variable
c
lorsque vous passez à une autre liste. Pour détecter si vous êtes dans une autre liste, la variabled
est utilisée pour stocker le numéro de la dernière ligne où une substitution a été effectuée.La commande globale compare le numéro de ligne actuel (
line('.')
) avecd+1
. S'ils sont identiques, cela signifie que nous sommes dans la même liste qu'avant, doncc
est incrémenté (c+1
), sinon cela signifie que nous sommes dans une liste différente, doncc
est réinitialisé (1
).À l'intérieur d'une fonction, la commande
let [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')]
pourrait être réécrite comme ceci:Ou comme ça:
Pour enregistrer certaines séquences de touches, vous pouvez également définir la commande personnalisée
:NumberedLists
, qui accepte une plage dont la valeur par défaut est1,$
(-range=%
):Quand
:NumberedLists
sera exécuté<line1>
et<line2>
sera automatiquement remplacé par la plage que vous avez utilisée.Donc, pour convertir toutes les listes dans le tampon, vous devez taper:
:NumberedLists
Seules les listes entre la ligne 10 et 20:
:10,20NumberedLists
Seule la sélection visuelle:
:'<,'>NumberedLists
Pour plus d'informations, voir:
la source
Cela ne fonctionne qu'avec une version récente de Vim (qui a
:h v_g_CTRL-A
):*
) et les remplacer par0
(curseur est sur la première*
):Ctrl-v
j
j
r
0
.gv
g
Ctrl-a
... et c'est tout :)
(Si vous voulez avoir un point après chaque numéro, changer 1ère étape à:
Ctrl-v
j
j
s
0
.
Esc
)la source
Sélectionnez visuellement les lignes et exécutez cette commande de substitution:
Voir
:help sub-replace-expression
,:help line()
et:help '<
.Pour éviter d'avoir à sélectionner les lignes, des recherches en arrière et en avant avec décalages peuvent être utilisées pour spécifier la plage de substitution comme ceci:
Voir
:help cmdline-ranges
la source
Autrement:
la source
Vous pouvez également définir des opérateurs personnalisés
Vous pouvez les mapper aux séquences de touches
'*
et'#
. Les marques*
et#
n'existent pas, vous ne remplacerez donc aucune fonctionnalité par défaut. La raison de choisir'
comme préfixe est d'obtenir une sorte de mnémonique. Vous ajoutez un signe / une marque devant certaines lignes. Et généralement pour aller à une marque, vous utilisez le préfixe'
.Il fonctionne également en mode visuel.
Les commandes Ex sont bonnes pour les scripts, mais pour une utilisation interactive, un opérateur normal est probablement meilleur, car vous pouvez le combiner avec n'importe quel mouvement ou objet texte.
Par exemple, vous pouvez basculer une liste préfixée avec des astérisques ou des signes moins à l'intérieur du paragraphe en cours en appuyant sur
'*ip
. Ici,'*
est un opérateur etip
est l'objet texte sur lequel il fonctionne.Et faites la même chose pour une liste préfixée avec des nombres sur les 10 lignes suivantes en appuyant sur
'#10j
. Ici,'#
est un autre opérateur et10j
est un mouvement couvrant les lignes sur lesquelles l'opérateur travaille.L'autre avantage de l'utilisation d'un opérateur personnalisé est que vous pouvez répéter votre dernière édition avec la commande dot.
la source