Come posso usare numeri consecutivi in ​​un comando sostitutivo in stile Ex?


8

Ad esempio, supponiamo di voler inserire un numero prima di ogni riga che inizia con la parola "Do". Il comando sarebbe simile a qualcosa :%s/^(Do )/1. \1/, ma cosa posso fare in modo da applicare i numeri consecutivamente anziché lo stesso numero ogni volta?

Nota che sono ben consapevole dei numerosi modi per farlo usando macro e Ctrl-A, ma per l'uso in comandi Ex-mode più complicati vorrei conoscere esattamente la risposta alla domanda del titolo.

Per un altro esempio in cui un approccio macro non sarebbe così semplice, diciamo che voglio aggiungere un numero a tutte le istanze della parola "Sezione" e averle numerate consecutivamente ma riavviando il conteggio dopo ogni riga che inizia "Capitolo". Un comando Ex-mode che può quasi fare questo, salvo per incrementare effettivamente il numero da aggiungere, è:

:g/^Chapter/;/^Chapter/-s/Section\zs/ 1/g

Si può vedere che un metodo semplice per incrementare i numeri nel comando sostitutivo Ex-mode potrebbe essere molto utile.

Risposte:


8

Questo comando fa quello che vuoi:

:let i = 1|g/^Do/s/^/\=i/|let i = i + 1

Spiegazione…

  • let i = 1inizializza contatore i,
  • g/^Do/s/^/\=i/antepone ia ciascuna riga che inizia con Do,
  • let i = i + 1incrementi i.

Il trucco è che l'incremento avviene prima della successiva sostituzione.

--- modificare ---

Se usassimo una singola sostituzione, il contatore verrebbe incrementato solo una volta, dopo aver fatto tutto.

Poiché stiamo eseguendo più sostituzioni - una per ogni riga corrispondente - anziché una singola, il contatore viene incrementato correttamente prima della sostituzione successiva.


Come puoi mettere un punto dopo il numero? \=i. è un'espressione non valida.
David Conrad,

2
@DavidConrad, .diventa un operatore concatenato \=nell'espressione. Quindi s//\=i . '. '/aggiungerò '. ' Check out :help expression-syntax.
Wildcard

l'incremento avviene dopo la sostituzione
Christian Brabandt,

@ChristianBrabandt, oops ho accidentalmente una parola.
romainl
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.