2010-11-19 10 views
20

Spesso mi sembra di avere una lista di articoli, e ho bisogno di aggiungere numeri di fronte a loro. Per esempio:Macro per creare elenchi numerati in vim?

Item one 
Item two 
Item three 

che dovrebbe essere:

1. Item one 
2. Item two 
3. Item three 

In vim, posso premere I in modalità di modifica, inserire "1", la fuga ha colpito. Quindi vado alla riga successiva, premere . e quindi ^A per incrementare il numero. Questo sembra enormemente inefficiente ... come farei una macro in modo che possa andare alla riga successiva e inserire un numero all'inizio che è uno più grande della linea precedente?

risposta

18

È possibile registrare facilmente una macro per farlo.

Primo inserimento 1. all'inizio della prima riga (ci sono un paio di spazi dopo lo 1. ma non è possibile vederli).

Andare all'inizio della seconda riga e passare alla modalità di registrazione con qa.

Premere il seguente sequenza di tasti:

i       # insert mode 
<ctrl-Y><ctrl-Y><ctrl-Y> # copy the first few characters from the line above 
<ESC>      # back to normal mode 
|       # go back to the start of the line 
<ctrl-A>     # increment the number 
j       # down to the next line 
q       # stop recording 

Ora è possibile riprodurre la registrazione con @a (la prima volta, per i tempi successivi, si può fare @@ per ripetere l'ultima-eseguito macro) e sarà aggiungi un nuovo numero incrementato all'inizio di ogni riga.

+7

Usa '3 @ a' per eseguire la macro 3 volte –

+8

Mi piacerebbe andare per' k^yWjP^ j' invece. Il testo potrebbe non essere all'inizio della riga e più importante la tua macro non funzionerà dopo la decima linea. –

+0

Spot on, @Luc - esattamente come l'ho avuto io stesso tranne che ho virato su^alla fine in modo che posizionasse il cursore all'inizio della linea una volta terminato. Nessuna differenza funzionale dovuta al^all'inizio, mi sentivo un po 'più ordinata. –

10

Selezionare le linee in modalità visiva con: V, quindi digitare:

:'<,'>s/^\s*\zs/\=(line('.') - line("'<")+1).'. ' 

che è facile da mettere in un comando:

command! -nargs=0 -range=% Number <line1>,<line2>s/^\s*\zs/\=(line('.') - <line1>+1).'. ' 
+0

Mi piace la ripetibilità di questo. Per le singole linee è fantastico. Sfortunatamente, per * i miei scopi *, quando inserisco la numerazione tendo a fare in reStructuredText, e quindi ho bisogno essenzialmente di funzionalità '}' - ma a causa del modo in cui sta facendo il conteggio delle righe, semplicemente sostituendo '^' con '\ n \ n' non lo taglierei Peccato, altrimenti sarebbe entrato nel mio '.vimrc'. Buon codice, comunque, non ero a conoscenza di '\ =()' - e non riesco a trovarlo nell'aiuto di vim! –

+0

Puoi utilizzare qualsiasi funzione che desideri, ad esempio una funzione che tiene conto di se stessa. In tal caso, potresti dover giocare con un comando che incapsula il "loop", ad es. http://stackoverflow.com/questions/1809571/how-do-i-substitute-from-a-list-of-strings-in-vim/1809780#1809780. Altrimenti, vedi ': h sub-replace - \ =' –

+0

bel trucco line() - non l'avevo ancora trovato! – egbutter

2

È possibile utilizzare la funzione 'record'. È un modo semplice per registrare macro in Vim.

See: aiuto record di

Nel normale 'q' modalità per avviare la registrazione ciò che si digita in 'a' registrare Digitare il comando necessario inserire un numero all'inizio della linea, copiarlo alla riga successiva e usa CTRL-A per aumentarne il valore. 'q' per terminare la registrazione quindi '@a' per riprodurre la macro memorizzata nel registro 'a' ('@@' ripete l'ultima macro).

E puoi fare cose come '20 @a 'per farlo venti volte di seguito.

È molto utile ripetere la modifica del testo.

A seconda dei casi, è più facile o più difficile da utilizzare rispetto a una regexp.

6

Ci sono anche alcuni plugin per fare questo tipo di lavoro se si deve farlo in occasione:

http://vim.sourceforge.net/scripts/script.php?script_id=670

+0

Non posso essere più d'accordo, un plugin dedicato per quell'attività è molto meglio di una macro fatta in casa, e questo perché creare serie è un compito che avrai più di una volta. – Benoit

2

Forse non è una soluzione macro, ma almeno è facile.

aggiungere numeri a tutte le linee

E 'possibile utilizzare :%!nl -ba o :%!cat -n comandi che aggiungeranno numeri di riga per tutte le linee.

Su Windows, è necessario aver installato Cygwin/MSYS/SUA.

aggiungere numeri alla linee selezionate

per aggiungere i numeri solo per le linee selezionate, si prega di selezionare in modalità visiva (v e cursori), poi al termine - eseguire il comando: :%!nl (ignorare righe vuote) o :%!cat -n (righe vuote incluse).

formattazione

Per rimuovere gli spazi aggiuntivi, li seleziona nel blocco visiva (Ctrl +v) e rimuoverle (x).

Per aggiungere alcuni caratteri (., :, )) dopo i numeri, li seleziona nel blocco visiva (Ctrl + v), quindi aggiungere il carattere (A, digitare il carattere, poi finire con Esc).

+0

Per aggiungere alcuni caratteri ('.') puoi usare': '<,'> normale a. Sulle linee selezionate. Poiché la selezione è stata eseguita in precedenza, ripeterla con 'gv'. – wryrych

0

Inserire un numero all'inizio del blocco di testo es.

1. Item One

immettere il comando vim modalità normale come segue:

qb^yW+P^<Ctrl-A>q 

Ciò significa:

qb  # start recording macro 'b' 
^  # move to start of text on the line 
yW  # 'yank' or copy a word including the ending whitespace. 
+  # move one line down to the start of the next line 
P  # place text ahead of the cursor 
^  # move to start of text 
<Ctrl-A> # increment text 
q  # Finish recording macro 

Che questo ti permette di fare è la riproduzione della macro in tutta l'ultima linea di elenco numerato tutte le volte che è necessario.

Problemi correlati