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?


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/$/,/

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.


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


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

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/$/,/.


3

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

:%s/key.*$/&,

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>.

1
:%s/$/,/g

$ corresponde ao fim da linha


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.