Como participar de todas as segundas linhas do Vim?

28

Eu gostaria de juntar muitas (~ 1000) linhas, mas apenas todas as ímpares na próxima. À mão eu poderia fazer

Jj

500 vezes e pronto. No entanto, como posso executar essas duas instruções 500 vezes em um único comando? Digitando

500Jj

juntará as próximas 500 linhas e depois descerá uma linha.

Exemplo:

Eu tenho:

a
b
c
d
e
f
g
h

Eu quero:

a b
c d
e f
g h

Edit: Eu tentei mapear:

:map X Jj
500X

mas aparentemente eu deveria ler os documentos de mapeamento novamente. Não funciona

Boldewyn
fonte

Respostas:

30

eu faria isso:

  1. comece a gravar uma macro 'q': qqJjq

  2. repita a macro 'q' 500 vezes: 500@q

(na verdade, não é uma macro chamada 'q', é um registro nomeado chamado 'q'. em vez de preencher interativamente esse registro como em 1., você também pode fazer :let @q = "Jj"e depois fazer 2.)

akira
fonte
Legal, obrigado por lembrar as macros para mim!
Boldewyn
:% J normais era muito rápido e fácil (ver solução 2º topo abaixo) ... em comparação com esta solução macro executá-lo em mais de 50.000 linhas
ihightower
@ihightower é por isso que votei nessa resposta também. Há 6 anos :)
akira
@akira Sua macro acabou de salvar meu dia, pois eu precisava apenas dessa solução de macro hoje para uma finalidade diferente.
Ihightower 22/02
24

Para fazer isso em todas as linhas do arquivo:

:%normal J

ou, mais curto:

:%norm J

Para fazer isso em apenas uma parte do arquivo, selecione as linhas com Vou obtenha um intervalo de outra maneira:

:'<,'>global/^/normal J

ou, mais curto:

:'<,'>g/^/norm J
Kevin Panko
fonte
Kevin, ele está olhando para executar dois comandos em cada arquivo, não apenas um.
JNK
1
o uso das :grespostas que o OP precisa.
Luc Hermitte 28/07
2
Isso realmente se juntará a cada segunda linha. Tente!
precisa
Obrigado pelo globaltruque. No meu caso, no entanto, gravar a macro foi mais fácil e rápido.
Boldewyn
2
Apenas um palpite - ele executa o comando em cada linha em ordem e, depois de executar a primeira linha, a segunda linha se foi (tendo sido unida à primeira linha), sendo forçada a passar para a terceira linha.
precisa
9

Que tal isso:

:g/$/j  

ou

:g/$/j!  

e agrupe a cada três linhas

:g/$/j3 
Miro
fonte
1
Esta é uma solução MUITO legal, Miro. É ainda melhor que você possa usar isso no padrão vi também, embora estranhamente, quando você usa o número à direita no SVR4.0 vi (como no Solaris) em vez de j3 criando 3 colunas e produz 4. (então você precisa usar j2 lá para o agrupamento de linhas a cada 3)
JohnGH
0

Também podemos brincar com:

'<,'>g//s/.*\zs\n\ze.*/ /
Luc Hermitte
fonte
-1

Não sou usuário do Vim, mas, ao verificar os documentos on-line, parece que

500(Jj) 

pode funcionar, pois analisa as coisas entre parênteses como uma unidade.

JNK
fonte
Hm, obrigado pela tentativa, mas na minha versão o Vim simplesmente ignora os parênteses. Você poderia me dizer o link em que encontrou esta sintaxe?
Boldewyn
1
vimdoc.sourceforge.net/htmldoc/syntax.html - Desculpe, não ajudou!
JNK
Na verdade, verifique este link: vim.org/scripts/script.php?script_id=2136, veja se isso é o que você procura .
JNK