Come aggiungere del testo alla fine di ogni riga in Vim?


116

In Vim, ho il seguente testo:

key => value1
key => value2
key => value1111
key => value12
key => value1122222

Vorrei aggiungere "," alla fine di ogni riga. Il testo precedente diventerà il seguente:

key => value1,
key => value2,
key => value1111,
key => value12,
key => value1122222,

Qualcuno sa come fare questo? È possibile utilizzare la modalità blocco visivo per ottenere ciò?


Domanda simile qui .
glts

Risposte:


163

Questo lo farà su ogni riga del file:

:%s/$/,/

Se vuoi creare un sottoinsieme di righe invece dell'intero file, puoi specificarle al posto di %.

Un modo è eseguire una selezione visiva e quindi digitare :. Verrà compilato :'<,'>per te, quindi digiti il ​​resto (nota che devi solo aggiungere s/$/,/)

:'<,'>s/$/,/

4
L'ultima riga ha un extra ', dovrebbe essere :'<,'>s/$/,/.
cjg

perché non c'è bisogno di un g? ( :'<,'>s/$/,/g)
Thorbjørn EK Christensen

@ ThorbjørnE.K.Christensen perché /$/comunque corrisponde solo una volta.
Bubaya

156

In effetti, esiste un modo per farlo utilizzando la modalità Blocco visivo. Premendo semplicemente $Ain modalità Blocco visivo si aggiunge alla fine di tutte le righe nella selezione. Il testo aggiunto apparirà su tutte le righe non appena si preme Esc.

Quindi questa è una possibile soluzione:

vip<C-V>$A,<Esc>

Cioè, in modalità Normale, Visual seleziona un paragrafo vip, passa alla modalità Blocco visivo CTRLV, aggiungi $Auna virgola a tutte le righe ,, quindi premi Escper confermare.

La documentazione è a :h v_b_A. V'è anche un esempio di come funziona nella sezione degli esempi: :h v_b_A_example.


1
No, questo è Vim standard: seleziona alcune linee in modalità Blocco visivo (con C-V) quindi sposta il cursore alla fine della riga $e aggiungi a tutte A. Ti piacerà :h v_b_A, il che è davvero completo.
glts

1
Oh, capisco cosa sta succedendo! Di solito uso Ctrl-C invece di <Esc> per uscire dalla modalità di inserimento, e apparentemente con Ctrl-C questo non funziona! Che strano.
weronika

3
È possibile salvare una sequenza di tasti utilizzando <C-V>ipal posto di vip<C-V>.
Aaron Thoma

1
@accolade, non entra in modalità blocco visivo in questo modo e non funzionerà. <CV> deve succedere di nuovo se lo fai in questo modo.
imagerThat

@imagineer Questo, strano - per me funziona - deve essere dovuto a qualche opzione non predefinita. (No 'virtualedit', l'ho provato.) Confermo che non funziona in un vim pulito. Grazie per la nota!
Aaron Thoma


33

La modalità ex è la più semplice:

:%s/$/,

: - enter command mode
% - for every line
s/ - substitute
$ - the end of the line
/ - and change it to
, - a comma

10

Il comando sostituto può essere applicato a una selezione visiva. Fare un blocco visiva sopra le righe che si desidera modificare e digitare :e notare che la linea di comando viene inizializzato in questo modo: :'<,'>. Ciò significa che il comando sostituto opererà sulla selezione visiva, in questo modo:

:'<,'>s/$/,/

E questa è una sostituzione che dovrebbe funzionare per il tuo esempio, supponendo che tu voglia davvero la virgola alla fine di ogni riga come hai menzionato. Se sono presenti spazi finali, potrebbe essere necessario modificare il comando di conseguenza:

:'<,'>s/\s*$/,/

Ciò sostituirà qualsiasi quantità di spazio bianco che precede la fine della riga con una virgola, rimuovendo efficacemente gli spazi vuoti finali.

Gli stessi comandi possono operare su una serie di linee, ad esempio per i prossimi 5 linee: :,+5s/$/,/o per l'intero buffer: :%s/$/,/.


3

Se vuoi aggiungere "," alla fine delle righe che iniziano con "chiave", usa:

:%s/key.*$/&,

Oppure :g/key/s/$/,. Vedi :help :global.
romainl

2

Ho <M-DOWN>mappato (alt freccia giù) in <DOWN>.modo da poter ripetere l'ultimo comando su una serie di righe molto rapidamente. con questa mappatura posso:

A,<ESC>

Quindi tieni premuto alt mentre premi ripetutamente verso il basso per aggiungere la virgola alla fine di ogni riga.
Questo funziona bene per me perché consente un ottimo controllo su ciò che le linee fanno e non ottengono il cambiamento.
(Ho anche le altre frecce mappate in modo simile per consentire una facile ripetizione .)

Ecco la riga di mappatura da incollare nel tuo vimrc:

map <M-DOWN> <DOWN>.

1
:%s/$/,/g

$ corrisponde alla fine della riga


2
Ciò si aggiungerà anche $alla linea, non solo ,.
ZyX

2
/gviene utilizzato per eseguire la sostituzione su ogni occorrenza in una riga. Poiché ce n'è solo uno $in una riga, puoi tranquillamente rilasciarlo.
romainl

Sì, il mio errore su $. e / g proviene da habbit, e sì, è facoltativo.
kalhartt

1

La seguente macro può essere utilizzata anche per svolgere il tuo compito.

qqA,^[0jq4@q
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.