Existe uma maneira de inserir ' ' na mesma coluna, já que todas as linhas não têm o mesmo comprimento, portanto a linha 1 pode ter ' ' na 15ª coluna, mas a linha 2 tem '*' na 25ª coluna.
Aman Jain
11
existe apenas 1 EOL por linha; portanto, o gsinalizador é desnecessário.
DoubleDown
Eu queria adicionar / ao início de cada linha: 1, $ s / ^ / \ / g funcionou para mim.
farooqsadiq
@dirkgently Como posso passar uma variável de string como argumento para este comando (você sabe, em vez do *)?
Matheus Rotta
353
Ainda mais curto que o comando: search:
:%norm A*
Isto é o que significa:
%=for every line
norm = type the following commands
A*= append '*' to the endof current line
Cara, não existe um vi ou vim thread do qual eu não aprendo algo. Hoje eu aprendo sobre norma. E como eles dizem no Cheers, "Norm!"
smcameron
4
Para anexar, basta usar 0i *, 0 o leva ao início da linha, i no modo de inserção e * no *. D:
Rob
7
Como VimGolfer, não posso deixar de acrescentar que o uso, em I*vez de 0i*, poupará um pressionamento de tecla.
Jedidiah ferir
24
Outra dica: isso também funciona para intervalos. Basta destacar as linhas no modo visual e de imprensa :, este irá pré-preencher o comando com :'<,'>o qual você pode então fazer para:'<,'>norm A*
Ahhh ... O segundo também pode ser usado com uma seleção de linhas. Agradável!
Tim Fletcher
Poderia explicar o primeiro exemplo?
Cody Poll
@CodyPoll gé um globalcomando que faz algo com todas as linhas correspondentes. $corresponde a todas as linhas. Pode ser também ^ou .*. A norma executa comandos que você normalmente usa no modo de comando. Então, A*significa acrescentar *ao final da linha.
defhlt
41
Eu acho que usar o modo de bloqueio visual é um método melhor e mais versátil para lidar com esse tipo de coisa. Aqui está um exemplo:
Thisis the First line.Thisis the second.The third.
Para inserir "Olá, mundo". (espaço + área de transferência) no final de cada uma destas linhas:
Em um caractere na primeira linha, pressione Ctrl-V (ou Ctrl-Q se Ctrl-V estiver colado).
Pressione jj para estender o bloco visual por três linhas.
Pressione $ para estender o bloco visual até o final de cada linha. Pressione A e espaço e digite Hello world. + depois Esc.
O resultado é:
Thisis the First line.Hello world.Thisis the second.Hello world.The third.Hello world.
Em vez de pressionar, jjpode-se pressionar Gpara ir para a última linha. Isso é útil em arquivos grandes, onde pressionar jaté chegar à última linha não é prático.
Nash 29/11
Concorda que bloco visual é mais limpo aqui, mais extensível também
Peter Dolan
Observe que isso não parece estar funcionando em todas as linhas no início, mas depois que você pressiona Esc, ele passa e adiciona a todos.
Noumenon
O Visual Block causa problemas e erros ao usar o vim como uma extensão para outras coisas, como o VS Code. Nesses casos, a pesquisa e substituição do usuário original está solicitando é a opção confiável.
Brettins 11/11/19
certifique-se de usar a letra maiúscula A, "a" minúsculo não funciona.
Jeff Hoye 24/01
14
Se você deseja adicionar o Hello world no final de cada linha:
:%s/$/HelloWorld/
Se você quiser fazer isso para um número específico de linhas, digamos, de 20 a 30, use:
:20,30s/$/HelloWorld/
Se você quiser fazer isso no início de cada linha, use:
Isso encontrará todas as âncoras de extremidade da linha e a substituirá *. Eu digo "substituto", mas, na verdade, é mais um acréscimo, já que a âncora é uma coisa especial e não um personagem comum. Para mais informações, consulte Poder de g - Exemplos .
O que significa s // no regex? Eu conheço um comando semelhante,: g / / / p, (grep). Tenho certeza de que seu comando é próximo ao meu, pelo menos na estrutura.
Léo Léopold Hertz
1
O s é um substituto - substitui a âncora de fim de linha pelo asterisco (bem, na verdade não a substitui, pois é um ponto de ancoragem).
21420
3
:% s / \ n / * \ r / g
Seu primeiro está correto em qualquer outro lugar, mas o Vim precisa ter um tratamento de nova linha diferente por algum motivo.
:s///
,\n
corresponde a um caractere nulo. A seção:help sub-replace-special
é relevante.Respostas:
:%s/$/\*/g
Deveria trabalhar. Assim
:%s/$/*/g
como MrWiggles aponta corretamente.fonte
g
sinalizador é desnecessário.Ainda mais curto que o comando: search:
Isto é o que significa:
fonte
I*
vez de0i*
, poupará um pressionamento de tecla.:
, este irá pré-preencher o comando com:'<,'>
o qual você pode então fazer para:'<,'>norm A*
I
em vez disso -:%norm I*
Além disso:
Além disso:
fonte
g
é umglobal
comando que faz algo com todas as linhas correspondentes.$
corresponde a todas as linhas. Pode ser também^
ou.*
. A norma executa comandos que você normalmente usa no modo de comando. Então,A*
significa acrescentar*
ao final da linha.Eu acho que usar o modo de bloqueio visual é um método melhor e mais versátil para lidar com esse tipo de coisa. Aqui está um exemplo:
Para inserir "Olá, mundo". (espaço + área de transferência) no final de cada uma destas linhas:
O resultado é:
(exemplo de Vim.Wikia.com )
fonte
jj
pode-se pressionarG
para ir para a última linha. Isso é útil em arquivos grandes, onde pressionarj
até chegar à última linha não é prático.Se você deseja adicionar o Hello world no final de cada linha:
Se você quiser fazer isso para um número específico de linhas, digamos, de 20 a 30, use:
Se você quiser fazer isso no início de cada linha, use:
fonte
Você realmente não precisa
g
do final. Então se torna:Ou se você quiser apenas
*
o final de, diga as linhas 14-18:ou
fonte
... e para acrescentar (adicionar o início de) cada linha com *,
fonte
Uma opção é:
Isso encontrará todas as âncoras de extremidade da linha e a substituirá
*
. Eu digo "substituto", mas, na verdade, é mais um acréscimo, já que a âncora é uma coisa especial e não um personagem comum. Para mais informações, consulte Poder de g - Exemplos .fonte
Seu primeiro está correto em qualquer outro lugar, mas o Vim precisa ter um tratamento de nova linha diferente por algum motivo.
fonte
isso fará o truque e garantirá que os espaços iniciais sejam ignorados.
fonte