Como puxar uma linha específica sem mover o cursor no vim?

39

Por exemplo

texto alternativo

Como posso puxar e colar a Linha 4 apenas na Linha 12 sem precisar mover o cursor para a Linha 4?

texto alternativo

lazer
fonte
Eu respondi sua pergunta com base no fato de que "me puxa!" está na linha 4. Na sua 2ª captura de tela, ela aparece na linha 5.
Louis Salin
Obrigado @ Louis pela resposta. Eu atualizei a captura de tela.
Lazer

Respostas:

51

Se o cursor já estiver na linha 12, um simples

: 4 anos
P

faz isso por mim.

frabjous
fonte
11
Agradável! Existe um equivalente para x? Quando eu tento :4xeu entendo E140: Use ! to write partial buffer. Obrigado!
dotancohen
Eu tenho que dizer que isso é incrível: D
nXqd 08/08/12
@dotancohen:4d
n.st
Existe uma boa maneira de fazer isso com o número de linha relativo?
TrungDQ
Com números relativos, use + e -. Então -4 é quatro linhas acima do cursor e +4 é quatro linhas abaixo dele.
Rickythefox
10

Que tal isso: o cursor está na linha 11, você está no modo "vi".

:4co.<return>

Aparentemente, você também pode fazer isso com um padrão:

:/^Yank/co.<return>

Você pode usar "mo" (mover) em vez de "co" (copiar) para simplesmente mover a linha, em vez de puxar e colocar.

Bruce Ediger
fonte
11
Ainda mais curto ( t como um comando de cópia é um remanescente do ed)::4t.
tarleb
9

Tente o seguinte:

:4,4y  
P
Louis Salin
fonte
8

Experimentar:

:4co11

Você pode usar um argumento 0para colar na linha 1. Isso também funcionará com intervalos:

:m,n co k

copiará linhas matravés nde linha k+1. Além disso, não importa onde você esteja no buffer. O movecomando, mfunciona da mesma forma.

gvkv
fonte
2

Isso deve servir:

:4,12y
p
k
Umang
fonte
11
Não, isso puxa os números de linha de 4 a 12. #
2626 Lazer
Eu quis copiar e colar a linha 4, a linha 12.
Lazer
Editado. É isto o que você queria?
Umang
2

Outros já mencionaram o método mais direto de fazer isso, o que é :4y, mas quero acrescentar duas notas sobre isso que podem ser úteis:

Primeiro, se você digitar :help range, aprenderá tudo sobre o uso de intervalos para aplicar aos comandos do estilo Ex. MUITO útil em muitos casos, e muito mais versátil do que usar números de linha. Por exemplo, se você deseja puxar a primeira linha que começa com "puxar" após o início do documento (mesmo que esteja na primeira linha), use :0/^yank/y. A parte mais poderosa dos intervalos é a capacidade de combiná-los, por exemplo, :./^Chapter/+50?Pete?dsignifica "Encontre a próxima linha para começar com a palavra Capítulo (pesquisando a partir da linha atual), depois pule 50 linhas e pesquise a palavra Pete, e exclua a primeira linha em que a encontra ". Exceto que, na verdade, ele não move o cursor, apenas faz o que você diz.

(Eu usei esse tipo de especificação de intervalo para automatizar a criação de documentação complicada, envolvendo a pesquisa do nome da função sob o cursor e, em seguida, pesquisando a próxima linha que dizia "Descrição" e puxando-a para um registro específico ... etc.)

A outra dica é que você deve saber sobre pular. Digite :help jump-motionspara aprender sobre isso completamente, mas o modo como ele se relaciona aqui é que você pode pular para a linha 4, puxá-lo e depois RETORNAR com 4Gyy''(ou usar barras de apoio em vez de apóstrofes para pular de volta à sua posição inicial exata, em vez de apenas a mesma LINHA você começou às.)

Curinga
fonte
2

Mais curto:

:1t. copia a primeira linha abaixo da atual.

Com intervalos: :1,4t.copia as linhas de 1 a 4 (inclusive) abaixo da corrente.

Também é possível com números de linha relativos:

:-1t. copia a linha anterior abaixo da atual.

No seu exemplo :4t-1, copie a quarta linha abaixo da linha desejada.

Nota: :té um sinônimo para o :co[py]comando.

Erwin Rooijakkers
fonte