Come ripeto una modifica su più righe in Vim?


122

Sono consapevole che in Vim posso spesso ripetere un comando semplicemente aggiungendo un numero davanti ad esso. Ad esempio, è possibile eliminare 5 righe:

5dd

È anche spesso possibile specificare un intervallo di righe a cui applicare un comando, ad esempio

:10,20s:hello:goodbye:gc

Come posso eseguire una "modifica verticale"? Vorrei, ad esempio, inserire un simbolo particolare, ad esempio una virgola, all'inizio (saltando gli spazi vuoti, ovvero cosa otterresti se digiti una virgola dopo Shift-I in modalità comando) di ogni riga in un dato gamma. Come si può ottenere questo risultato (senza ricorrere a periodi di inattività-periodi-periodi inferiori)?

Risposte:


107

:10,20s/^/,/

Oppure usa una macro, registra con:

q a i , ESC j h q

Usa con:

@ a

Spiegazione: q aavvia la registrazione di una macro da registrare a, qtermina la registrazione. Ci sono registri aa zdisposizione per questo.


Grazie. E se volessi l'equivalente di uno shift-i? Cioè, saltando lo spazio bianco iniziale?
saffsd

2
Spiegazione: ^\(\s*\)acquisisce lo spazio bianco iniziale e lo salva in un registro, con il quale è quindi possibile leggere \1.
Svante

136

Ctrl- ventra in modalità visuale a blocchi. Puoi quindi muoverti ( hjkl-wise, come di consueto) e se vuoi inserire qualcosa su più righe, usa Shift- i.

Quindi per il testo:

abc123abc
def456def
ghi789ghi

se premi Ctrl- vcon il cursore sull'1, premi jdue volte per scendere di due colonne, quindi Shift- i,ESC, il tuo testo sarà simile a questo:

abc,123abc
def,456def
ghi,789ghi

(l'inserimento multi-linea ha un piccolo ritardo e non verrà renderizzato fino a DOPO aver premuto ESC).


3
Bello. Ctrl-V significa maiuscolo, a proposito, potresti dire Ctrl-Shift-v
Svante

8
in realtà, è CTRL-v o CTRL-V. Vim non fa distinzione tra maiuscole e minuscole per i codici CTRL (vedere: help CTRL- {char}).
rampion

2
dopo aver cercato un po 'del motivo per cui questo metodo non funzionava è perché utilizza una I maiuscola (shift-i) invece di i (inoltre, era solo ctrl-v, poiché ctrl-shift-v mi ha spostato alla fine)
Willyfrog

4
Sono curioso. Perché non usano semplicemente isenza il tasto Maiusc?
off99555

1
i senza shift è inserito nella posizione corrente. shift + i viene inserito all'inizio della riga
Kevin P il


44

Se stai già utilizzando "." per ripetere molto il tuo ultimo comando, ho trovato che questa sia la soluzione più conveniente fino ad ora. Ti permette di ripetere l'ultimo comando su ogni riga di un blocco visivo usando

" allow the . to execute once for each line of a visual selection
vnoremap . :normal .<CR>

1
Questo è utile ma anche limitato in quanto la .linea funziona in modalità visiva. Penso che la modalità visiva in questo caso a volte possa essere conveniente per selezionare un intervallo di linee. Ma i comandi e le macro sono più flessibili e potenti in questo caso.
Bohr

23

Credo che il modo più semplice per farlo sia

1) registra una macro per una riga, chiamala 'a'; in questo caso si digita

qa I, ESC jq

2) seleziona il blocco di linee a cui vuoi applicare la macro

3) usa la funzione 'norm' per eseguire la macro 'a' su questo blocco di righe, cioè

:'<,'>norm@a

17

Penso che il più semplice sia registrare una macro e quindi ripetere la macro tutte le volte che vuoi. Ad esempio, per aggiungere una virgola all'inizio di ogni riga, digita:

q a I , ESC j q

per ripeterlo 5 volte, inserisci

5 @ a


2

Con la modifica già salvata nell'operatore ., procedi come segue:

  1. Selezionare il testo a cui si desidera applicare l'operatore utilizzando la modalità visiva
  2. Quindi esegui il comando :norm .

1

A parte le macro, come già risposto, per il caso specifico di inserire una virgola in un intervallo di righe (diciamo dalla riga 10 alla riga 20), potresti fare qualcosa del tipo:

:10,20s/\(.*\)/,\1

Cioè, puoi creare una corrispondenza di gruppo numerata con \ (e \) e usare \ 1 nella stringa di sostituzione per dire "sostituisci con il contenuto della corrispondenza".

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.