Como adicionar texto ao final de cada linha no Vim?

116

No Vim, tenho o seguinte texto:

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

Eu gostaria de adicionar "," no final de cada linha. O texto anterior se tornará o seguinte:

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

Alguém sabe como fazer isso? É possível usar o modo de bloqueio visual para fazer isso?

Grace Shao
fonte
Pergunta semelhante aqui .
Glts

Respostas:

163

Isso fará com que todas as linhas do arquivo:

:%s/$/,/

Se você quiser fazer um subconjunto de linhas em vez de todo o arquivo, pode especificá-los no lugar de %.

Uma maneira é fazer uma seleção visual e digitar o :. Ele irá preencher :'<,'>para você, então você digita o resto (observe que você só precisa adicionar s/$/,/)

:'<,'>s/$/,/
Alan Curry
fonte
4
A última linha tem um extra ', deveria ser :'<,'>s/$/,/.
cjg
por que não há necessidade de um g? ( :'<,'>s/$/,/g)
Thorbjørn EK Christensen
@ ThorbjørnE.K.Christensen porque /$/corresponde apenas uma vez de qualquer maneira.
Bubaya
156

Na verdade, existe uma maneira de fazer isso usando o modo de bloqueio visual. Basta pressionar $Ano modo de bloqueio visual para anexar ao final de todas as linhas na seleção. O texto anexado aparecerá em todas as linhas assim que você pressionar Esc.

Portanto, esta é uma solução possível:

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

Ou seja, no modo Normal, selecione um parágrafo vip, mude para o modo de bloqueio Visual CTRLV, acrescente $Auma vírgula a todas as linhas ,e pressione Escpara confirmar.

A documentação está em :h v_b_A. Há até mesmo uma ilustração de como funciona na seção de exemplos: :h v_b_A_example.

glts
fonte
1
Não, este é o Vim padrão: Selecione algumas linhas no modo de bloco visual (com C-V) e mova o cursor para o final da linha $e acrescente a todas elas A. Você vai adorar :h v_b_A, o que é realmente completo.
glts
1
Oh, eu vejo o que está acontecendo! Normalmente uso Ctrl-C em vez de <Esc> para sair do modo de inserção e, aparentemente, com Ctrl-C isso não funciona! Que estranho.
weronika
3
Você pode salvar um pressionamento de tecla usando <C-V>ipno lugar de vip<C-V>.
Aaron Thoma
1
@accolade, não entra no modo de bloqueio visual dessa forma e não funciona. <CV> precisa acontecer depois de novo se você fizer isso dessa forma.
imagineerThat
@imagineerIsso, estranho - funciona para mim - deve ser devido a alguma opção não padrão. (Não 'virtualedit'- eu testei isso.) Confirmo que não funciona em um vim limpo. Obrigado pela nota!
Aaron Thoma
44

Outra solução, usando outro ótimo recurso:

:'<,'>norm A,

Veja :help :normal.

romainl
fonte
1
@Swiss, você vai gostar desse comentário , então.
romainl
1
@Swiss, você também pode gostar da exposição do udioca no :normal. Achei informativo!
Conner
1
Não sabia sobre este subreddit. Obrigado.
romainl
33

o modo ex é o mais fácil:

:%s/$/,

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

O comando substituto pode ser aplicado a uma seleção visual. Faça um bloco visual sobre as linhas que você deseja alterar e digite :e observe que a linha de comando é inicializado como este: :'<,'>. Isso significa que o comando substitute operará na seleção visual, assim:

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

E esta é uma substituição que deve funcionar para o seu exemplo, supondo que você realmente queira a vírgula no final de cada linha como mencionou. Se houver espaços à direita, pode ser necessário ajustar o comando de acordo:

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

Isso substituirá qualquer quantidade de espaço em branco anterior ao final da linha por uma vírgula, removendo efetivamente os espaços em branco à direita.

Os mesmos comandos pode operar numa gama de linhas, por exemplo, para as seguintes 5 linhas: :,+5s/$/,/, ou para todo o tampão: :%s/$/,/.

pb2q
fonte
3

Se você quiser adicionar ',' no final das linhas começando com 'chave', use:

:%s/key.*$/&,
kiddorails
fonte
Ou :g/key/s/$/,. Veja :help :global.
romainl
2

Eu tenho <M-DOWN>(alt seta para baixo) mapeados para <DOWN>.para que eu possa repetir o último comando em uma série de linhas muito rapidamente. com este mapeamento posso:

A,<ESC>

E então segure alt enquanto pressiona repetidamente para adicionar a vírgula ao final de cada linha.
Isso funciona bem para mim porque permite um controle muito bom sobre o que as linhas recebem e não recebem a alteração.
(Eu também tenho as outras setas mapeadas de forma semelhante para permitir uma fácil repetição .)

Aqui está a linha de mapeamento para colar em seu vimrc:

map <M-DOWN> <DOWN>.
Sam Brinck
fonte
1
:%s/$/,/g

$ corresponde ao fim da linha

Kalhartt
fonte
2
Isso aumentará $a linha também, não apenas ,.
ZyX
2
/gé usado para realizar a substituição em todas as ocorrências em uma linha. Porque há apenas um $em uma linha, você pode descartá-lo com segurança.
Romainl
Sim, meu erro no $. e o / g é de habbit, e sim, é opcional.
Kalhartt
1

A macro a seguir também pode ser usada para realizar sua tarefa.

qqA,^[0jq4@q
dvk317960
fonte