Vim: inserisci gli stessi caratteri su più righe


306

A volte voglio modificare un certo blocco visivo di testo su più righe.

Ad esempio, vorrei prendere un testo simile al seguente:

name
comment
phone
email

E farlo sembrare così

vendor_name
vendor_comment
vendor_phone
vendor_email

Attualmente il modo in cui lo farei ora è ...

  1. Selezionare tutte e 4 le righe di un blocco premendo Ve quindi jquattro volte.
  2. Rientro con >.
  3. Torna indietro di una lettera con h.
  4. Vai a bloccare la modalità visiva con Ctrlv.
  5. Seleziona giù quattro righe premendo jquattro volte. A questo punto hai selezionato un blocco visivo 4x1 di spazi bianchi (quattro righe e una colonna).
  6. Press C. Si noti che questo è praticamente rientrato a sinistra di una colonna.
  7. Digita a " vendor_"senza virgolette. Nota lo spazio extra che abbiamo dovuto rimettere.
  8. Press Esc. Questa è una delle pochissime volte che uso Escper uscire dalla modalità di inserimento. Ctrlcmodifica solo la prima riga.
  9. Ripeti il ​​passaggio 1.
  10. Rientro con l'altro <.

Non ho bisogno di rientrare se c'è almeno una colonna di spazi bianchi prima delle parole. Non avrei bisogno dello spazio bianco se non avessi dovuto cancellare il blocco visivo con c.

Ma se devo cancellare, allora c'è un modo per fare ciò che ho eseguito sopra senza creare lo spazio bianco necessario con rientro?

Inoltre, perché la modifica di più righe contemporaneamente funziona solo uscendo dalla modalità di inserimento con Escover Ctrlc?


Ecco un esempio più complicato:

name    = models.CharField( max_length = 135 )
comment = models.TextField( blank = True )
phone   = models.CharField( max_length = 135, blank = True )
email   = models.EmailField( blank = True )

per

name    = models.whatever.CharField( max_length = 135 )
comment = models.whatever.TextField( blank = True )
phone   = models.whatever.CharField( max_length = 135, blank = True )
email   = models.whatever.EmailField( blank = True )

In questo esempio eseguirò il blocco visivo verticale sopra il ., e quindi lo reinserirei durante la modalità di inserimento, ovvero il tipo .whatever.. Spero ora che tu possa vedere lo svantaggio di questo metodo. Sono limitato a selezionare solo una colonna di testo tutti uguali in posizione verticale .


9
Modo migliore: ":% s / ^ / vendor_ /"
Paul Tomblin

1
Grazie per la risposta. Funziona se voglio solo aggiungere una parola ad ogni riga. Ma il metodo che uso può essere fatto in qualsiasi posizione. Vorrei aggiungere un altro mio esempio con un esempio più complicato.
hobbes3

3
Quindi evidenzia le righe che vuoi cambiare con shift-V e digita una ricerca appropriata e sostituisci il comando - nel secondo esempio,:s/models\./\0whatever./
Paul Tomblin

Molti modi per ottenere quanto sopra. Per rispondere in modo completo a tutte le parti della domanda, quindi alla parte 1) o regex o la modalità visiva, modifica esc funziona bene come offerto nelle risposte (preferisco la selezione visiva in GVIM). Per la parte 2), la macro è forse più semplice come offerta da Brian Neal. La migliore risorsa che conosco per tutti questi tipi di "how to tos" è Practical Vim di Drew Neil. Ottima lettura rapida e riferimento leggero ogni volta che si dimentica una formula. Spero che questa raccomandazione aiuti qualcuno, ne varrà la pena per molti utenti di VIM.
arcseldon,

@Paul: E se stai contando le sequenze di tasti , potresti sostituirlo \0con &.
icktoofay

Risposte:


912
  1. Spostare il cursore su nin name.
  2. Entra in modalità blocco visivo ( Ctrlv).
  3. Premere jtre volte (o 3j).
  4. Premere I(maiuscola i).
  5. Digita vendor_. Nota: aggiornerà lo schermo solo nella prima riga - fino a quando non Escviene premuto (6.), a quel punto verranno aggiornate tutte le righe.
  6. Press Esc.

mini-screencast che dimostra il metodo

È Inecessario utilizzare una maiuscola anziché una minuscola i, poiché la minuscola iviene interpretata come l'inizio di un oggetto di testo , che è piuttosto utile da solo, ad esempio per selezionare all'interno di un blocco di tag ( it):

mini-screencast che mostra l'utilità dell'oggetto di testo 'it'


12
Non sono riuscito a farlo funzionare in Windows (poiché CTRL + V è mappato per incollare gli appunti). Ma Vim ha anche mappato questo a Ctrl + Q per la versione di Windows.
Arnestig,

2
@Ven: Vim non è realmente impegnato in quel periodo, sta solo aspettando che tu prema un altro tasto e alla fine scada. Due esperimenti per te: prima, prova a premere Esc e poi a premere immediatamente un altro tasto, come jo ^L. Dovresti vedere che Vim non era occupato dopo tutto; stava solo aspettando. In secondo luogo, prova a passare 'timeout'a un valore inferiore, come 80(piuttosto che al valore predefinito 1000) e osserva che scade più rapidamente.
icktoofay

1
@icktoofay Sembra che la variabile che intendi impostare timeoutlennon lo sia timeout.
jez

4
@ANjaNA: se il punto in cui si desidera inserire è tutto nella stessa colonna (ad es. Se i numeri hanno tutti la stessa lunghezza), è possibile utilizzare la stessa tecnica tranne premere Aanziché I, che verrà inserito dopo il blocco selezionato anziché prima. Se le tue linee hanno lunghezze diverse, tuttavia, ciò non funzionerà; Mi piace usare una sostituzione corrispondente alla fine di ogni riga, ad esempio selezionando alcune righe e usando :s/$/inserted/.
icktoofay,

3
Ho dovuto premere la freccia verso il basso dopo aver premuto esc per farlo funzionare
GeoSword il

69

Un altro approccio consiste nell'utilizzare il comando .( dot) in combinazione con I.

  1. Sposta il cursore nel punto in cui desideri iniziare
  2. stampa I
  3. Digita il prefisso desiderato (ad es. vendor_)
  4. Press esc.
  5. Premere jper scendere di una riga
  6. Digitare .per ripetere l'ultima modifica, inserendo di nuovo automaticamente il prefisso
  7. Alternare rapidamente tra je.

Trovo questa tecnica è spesso più veloce rispetto alla modalità di blocco visivo per un piccolo numero di aggiunte e ha il vantaggio che, se non è necessario inserire il testo su ogni singola riga in un intervallo si può facilmente saltare premendo in più js' .

Si noti che per un gran numero di aggiunte contigue, l'approccio a blocchi o la macro saranno probabilmente superiori.


Bello vedere un altro approccio.
Ibn Saeed

Preferisco questo solo per poche righe. Molto più facile da eseguire IMO.
Dan Bechard,

Dopo aver digitato il prefisso desiderato, non è necessario premere il tasto Esc?
iamnotsam,

41
  1. Seleziona le linee che vuoi modificare usando CtrlV.
  2. Stampa:

    • I: Inserisci prima di ciò che è selezionato.
    • A: Aggiungi dopo ciò che è selezionato.
    • c: Sostituisci ciò che è selezionato.
  3. Digita il nuovo testo.

  4. Premere Escper applicare le modifiche a tutte le linee selezionate.

4
Eccellente! Vorrei solo evidenziare il passaggio finale Escper i vocaboli VIM come me: mi ci è voluto un po 'di tempo per capire che i cambiamenti si propagano "più tardi"!
Bugs Bunny,

1
Bello, non conoscevo anche le opzioni "A" e "C".
hobbes3,

Perché non funziona v? Posso farcela Ctrl+V --> A, ma fare vper selezionare il testo non funziona - Asi aggiunge solo a quella riga. Non sono entrambi selezionati? Inoltre, molto strano - Aaggiunge solo alla fine della linea SE estendo il blocco visivo alla fine della linea; in caso contrario, viene aggiunto ovunque termina il blocco visivo per ogni riga. È come se non riconoscesse una differenza tra ae A.
Alex G,

1
Ho dovuto usare cinvece di C, ma ha funzionato perfettamente. Grazie
Tarol

29

Vorrei utilizzare una macro per registrare le mie azioni e quindi ripeterla.

  1. Posiziona il cursore sulla prima lettera del nome .
  2. Premi qqper avviare la registrazione nel buffer q.
  3. Premi iper accedere alla modalità di inserimento, digita vector_ , quindi premi Escper uscire dalla modalità di inserimento.
  4. Ora premi 0per tornare all'inizio della riga.
  5. Ora premi jper andare giù.
  6. Ora premi di qnuovo per interrompere la registrazione.

Ora hai una bella macro.

Digitare 3@qper eseguire la macro tre volte per eseguire il resto delle righe.


"Q" è speciale (per "macro veloce"?)?
Peter Mortensen,

Come si può rendere persistente la macro (lavorando su più sessioni)?
Peter Mortensen,

@PeterMortensen Vim ha una funzione chiamata sessioni che resiste ai buffer (e molte altre cose) che puoi esaminare.
Brian Neal,

27
:%s/^/vendor_/

Oppure mi sfugge qualcosa?


Ti manca il fatto che probabilmente è un sottotesto in un file con molte altre righe in cui il vender_prefisso è indesiderato.
Dan Bechard,

9
@dan Se è necessario solo un sottotesto, è possibile limitare la ricerca a un set di numeri di riga, ad es1,4s/^/vendor_/
Brad Koch,

1
@BradKoch Interessante. Non ero a conoscenza dei vincoli del numero di riga, grazie per quello.
Dan Bechard,

8
è interessante, ma ciò che è più pratico è bloccare visivamente la selezione con Ve il tipo :. Farà da prefisso all'espressione ed con :'<,'>cui far applicare l' :'<,'>s/^/vendor_/
editor

12

Aggiornato gennaio 2016

Sebbene la risposta accettata sia un'ottima soluzione, in realtà si tratta di un numero leggermente inferiore di tasti e si ridimensiona meglio, in linea di principio sulla risposta accettata.

  1. Spostare il cursore su nin name.
  2. Entra in modalità blocco visivo ( ctrlv).
  3. stampa 3j
  4. Press I.
  5. Digita vendor_.
  6. Press esc.

illustrazione visiva

Nota: questo ha un numero di tasti inferiore rispetto alla risposta accettata fornita (confronta il passaggio 3). Contiamo solo il numero di azioni j da eseguire.

Se hai i numeri di riga abilitati (come illustrato sopra) e conosci il numero di riga in cui desideri spostarti, il passaggio 3 può essere modificato in # Gdove # è il numero di riga desiderato.

Nel nostro esempio sopra, questo sarebbe 4G. Tuttavia, quando si ha a che fare con pochi numeri di riga, un conteggio esplicito funziona bene.


7

Volevo commentare molte righe in un file di configurazione su un server che aveva solo vi (no nano), quindi anche il metodo visivo era ingombrante Ecco come l'ho fatto.

  1. Apri il file vi file
  2. Visualizza i numeri di riga :set number!o:set number
  3. Quindi utilizzare i numeri di riga per sostituire l'inizio della riga con "#", come?

:35,77s/^/#/

Nota: i numeri sono inclusivi, le righe da 35 a 77, entrambe incluse saranno modificate.

Per rimuovere il commento / annullarlo, basta usare :35,77s/^#//

Se vuoi aggiungere una parola di testo come commento dopo ogni riga di codice, puoi anche usare:

:35,77s/$/#test/ (per lingue come Python)

:35,77s/;$/;\/\/test/ (per lingue come Java)

crediti / riferimenti:

  1. /unix/84929/uncommenting-multiple-lines-of-code-specified-by-line-numbers-using-vi-or-vim

  2. /unix/120615/how-to-comment-multiple-lines-at-once


Questa è stata la soluzione perfetta per me dato che spesso utilizzo solo vim-tiny.
JSON C11,

7

Potresti anche avere un caso d'uso in cui desideri eliminare un blocco di testo e sostituirlo.

Come questo

Hello World

Hello World

Per

Hello Cool

Hello Cool

Puoi semplicemente selezionare il blocco visivo "Mondo" in entrambe le righe.

Digita cper cambiare - ora sarai in modalità inserimento.

Inserisci le cose che vuoi e premi Esc.

Entrambi si riflettono verticalmente. Funziona proprio come 'I', tranne per il fatto che sostituisce il blocco con il nuovo testo invece di inserirlo.


6

Supponiamo di avere questo file:

something

name
comment
phone
email

something else
and more ...

Vuoi aggiungere "vendor_" davanti a "name", "comment", "phone" e "email", indipendentemente da dove compaiono nel file .

:%s/\<\(name\|comment\|phone\|email\)\>/vendor_\1/gc

La cbandiera ti chiederà conferma. Puoi lasciarlo cadere se non vuoi il prompt.


5

Un'alternativa che può essere più flessibile:

Esempio: inserire il testo XYZ all'inizio della riga

:%norm IXYZ

Cosa sta succedendo qui?

  • % == Eseguire su ogni riga
  • norm == Eseguire i seguenti tasti in modalità normale
  • I == Inserisci all'inizio della riga
  • XYZ == Il testo che vuoi inserire

Quindi colpisci Entere viene eseguito.

Specifico per la tua richiesta:

:%norm Ivendor_

Puoi anche scegliere un intervallo particolare:

:2,4norm Ivendor_

Oppure esegui su un intervallo visivo selezionato:

:'<,'>norm Ivendor_

1
è possibile inviare sequenze di tasti come <Esc> mentre si è in modalità insert (norma Iabc <ESC>) per fare cose più interessanti?
Batbrat,

1
@batbrat L'ho appena capito! Puoi ctrl-v ctrl-[premere per inserire una "escape Esc", che ti riporta alla "modalità normale" ai fini del tuo normale comando. Ho appena provato questo '<,'>norm Iaa^[ysiw", dov'è ^[Esc.
Aubrey Lavigne,

4
Use Ctrl+V to enter visual block mode
Move Up/Down to select the columns of text in the lines you want to comment.
Then hit Shift+i and type the text you want to insert.
Then hit Esc, wait 1 second and the inserted text will appear on every line

questo metodo funziona per tutte le versioni di vim o richiede plug-in vim? il motivo per cui chiedo è b / c a volte funziona su alcune macchine, ma a volte no. non riesco a capire la differenza. VIM che viene fornito con Git su Windows - non riesco a farlo funzionare. su alcune macchine Linux Ubuntu e Centos, non riesco a farlo funzionare. ho avuto successo in alcuni rari casi, ma non sono riuscito a riprodurre il successo. è un mistero. nulla sembra accadere dopo che ho colpito ESC.
davidj411,

stranamente, ora funziona per me. nulla è cambiato, tranne forse le stelle :) mentre cercavo una soluzione al mio problema, ho trovato qualcosa in questa pagina anche se menziona qualcosa da cercare in vim.wikia.com/wiki/Inserting_text_in_multiple_lines In Vim, controlla di aver la funzione di operatori blockwise (I, A e altro) immettendo il comando: version. L'output dovrebbe includere + visualextra.
davidj411,

Volevo aggiungere un commento in generale, non alla tua risposta. Molte di queste risposte dicono la stessa cosa ma usano parole diverse. Il mio aveva qualcosa di diverso da offrire e includeva un link.
davidj411,

2
  1. Ctrl + v per passare alla modalità blocco visivo
  2. Seleziona le linee usando la freccia su e giù
  3. Inserisci 3ilettere minuscole (premi tre volte in minuscolo I )
  4. I(premi maiuscole I. Ciò ti porterà in modalità inserimento.)
  5. Scrivi il testo che desideri aggiungere
  6. Esc
  7. Premi la freccia giù
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.