Como duplicar uma linha inteira no Vim no Eclipse?

1624

Como duplico uma linha inteira no Vim de maneira semelhante a Ctrl+ Dno IntelliJ IDEA / Resharper ou Ctrl+ Alt+ / no Eclipse ?

sumek
fonte
49
As pessoas não executam mais o vimtutor? Provavelmente, isso ocorre dentro dos primeiros cinco minutos de aprendizado do uso do Vim.
Dash-tom-bang
131
Deseja duplicar esta linha? Yes Plocação. :)
Stavr00
3
FWIW Fiz o vimtutor cerca de uma dúzia de vezes nos últimos 2 meses e esse conceito não é coberto. Diz como executar “dd” e “v - navegar - y” seguido de “p”. Ele não informa como copiar uma única linha sem excluí-la, como é solicitado aqui.
danielson317

Respostas:

2769

yyou Ypara copiar a linha (mnemônico: y ANK )
ou
ddpara d élete a linha (VIM cópias que você excluídos em uma prancheta-like "registrar", como um corte de operação)

então

ppara p aste o copiado ou excluído texto após a linha atual
ou
Pa p aste o texto copiado ou excluído antes da linha atual

Mark Biek
fonte
129
Um ponto excelente. Por alguma razão, porém, acho bater y duas vezes é mais rápido para mim do que SHIFT-y
Mark Biek
25
@camflan Eu acho que o Y deve ser "copiar a partir do cursor até o fim"
Dzung Nguyen
42
e 2yy podem ser usados para copiar as linhas 2 (e para qualquer outro n)
Amir Ali Akbari
5
@nXqd: Sim, uma grande porcentagem de usuários mapeia Ypara y$. (Consistente com De C; (mas não compatível com Vi (ninguém se importa.))) Isso é proposto em :help Y.
Aaron Thoma
11
Para copiar duas linhas, é ainda mais rápido ir yjou yk, especialmente porque você não duplica um personagem. Além disso, yké uma versão para trás que 2yynão pode ser executada, e você pode colocar o número de linhas para retroceder y9jou y2k, etc. A única diferença é que sua contagem deve ser n-1de um total de nlinhas, mas sua cabeça pode aprender que de qualquer forma.
Zelk
406

Modo normal: veja outras respostas.

O caminho Ex :

  • :t. duplicará a linha,
  • :t 7 irá copiá-lo após a linha 7,
  • :,+t0copiará a linha atual e a próxima no início do arquivo ( ,+é sinônimo do intervalo .,.+1),
  • :1,t$copiará as linhas do início até a posição do cursor até o fim ( 1,é sinônimo do intervalo 1,.).

Se você precisar mover em vez de copiar, use em :mvez de :t.

Isso pode ser realmente poderoso se você combiná-lo com :gou :v:

  • :v/foo/m$ moverá todas as linhas que não correspondem ao padrão "foo" até o final do arquivo.
  • :+,$g/^\s*class\s\+\i\+/t.copiará todas as linhas subseqüentes do formulário class xxxlogo após o cursor.

Referência: :help range, :help :t, :help :g, :help :me:help :v

Benoit
fonte
1
Quando você pressiona :no modo visual, ele é transformado para '<,'>pré-selecionar o intervalo de linhas que a seleção visual abrange. Portanto, no modo visual, :t0copia as linhas no início.
Benoit
1
Para o registro: quando você digita dois pontos (:), entra no modo de linha de comando, onde pode inserir comandos Ex. vimdoc.sourceforge.net/htmldoc/cmdline.html Os comandos Ex podem ser realmente poderosos e concisos. As soluções yyp são comandos "modo normal". Se você deseja copiar / mover / excluir uma linha ou intervalo distante de linhas, um comando Ex pode ser muito mais rápido.
Niels Bom
7
Voto negativo não devido a um problema com a resposta em si (embora não funcione para a minha situação, não faço ideia do número da linha que desejo duplicar), mas porque REALMENTE não deve ser a resposta mais aceita / aceita pergunta comumente pesquisada.
Mjaggard
9
@ mjaggard: as respostas aceitas estão sempre no topo, independentemente de sua pontuação. Sim, eu adicionei essa resposta como um complemento, e parece que se adequou bem ao OP.
Benoit
7
:t.é a resposta exata para a pergunta.
Burak Erdem
294

YPou Ypou yyp.

Linulin
fonte
Ynormalmente é remapeado para y$(puxar (copiar) até o final da linha (da posição atual do cursor, não do início da linha)). Com esta linha em .vimrc::nnoremap Y y$
Aaron Thoma
1
Não se esqueça o pobre velhoyyP
icc97
253

copie e cole no vim

Não fica mais simples do que isso! Do modo normal:

yy

depois vá para a linha na qual deseja colar e

p
Adão
fonte
34
O que você usou para fazer o gif?
Zoltán
4
@ Zoltán você pode usar o LiceCap, que é pequeno
onmyway133
53

yy

puxará a linha atual sem excluí-la

dd

excluirá a linha atual

p

será putuma linha agarrada por um dos métodos anteriores

pjz
fonte
3
Este veio primeiro, mas é duplicado é aceito: stackoverflow.com/a/73357/1438029
Geoffrey Hale
44

Faça isso:

Primeiro, yycopie a linha atual e depois pcole.

Eric Z Beard
fonte
20
Não digite o espaço.
Niels Bom
1
Sim, se o cursor estiver no final da linha e você digitar o espaço como mostrado, duplicará a linha que você puxou duas linhas abaixo da linha que você puxou.
44

Se você quiser outra maneira:

"ayy: Isso armazenará a linha no buffer a.

"ap: Isso colocará o conteúdo do buffer ano cursor.

Há muitas variações nisso.

"a5yy: Isso armazenará as 5 linhas no buffer a.

Consulte " Arquivos de ajuda do Vim para mais diversão.

Kwondri
fonte
Obrigado, eu usei isso como um bind: map <Leader> d "ayy" ap
frbl
39

yyp - lembre-se com "yippee!"

Várias linhas com um número entre:

y7yp

theschmitzer
fonte
17
7yy é equivalente a y7y e provavelmente é mais fácil lembrar como fazê-lo.
graywh
10
y7yp (ou 7yyp) raramente é útil; o cursor permanece na primeira linha copiada para que p cole as linhas copiadas entre a primeira e a segunda linha da fonte. Para duplicar um bloco de linhas, use 7yyP
Nefrubyr
@Nefrubyr or :.,.+7 copy .+7: P
DarkWiiPlayer
23

yyp - colar depois

yyP - cole antes

yemu
fonte
6
Como a linha está sendo duplicada, o resultado final do conteúdo é o mesmo.
Acumenus 6/11
4
@ABB No entanto, há uma diferença em miniatura aqui - em que linha seu cursor pousará.
Mikk
12

Gosto de: Shift+ v(para selecionar a linha inteira imediatamente e permitir que você selecione outras linhas, se desejar), y, p

Xavier Guihot
fonte
11

Você também pode tentar <Cx> <Cl>, que repetirá a última linha do modo de inserção e exibirá uma janela de conclusão com todas as linhas. Funciona quase como <Cp>


fonte
Isto é muito útil, mas para evitar ter de imprensa muitas chaves que tenho mapeado-lo apenas para CTRL-L, este é o meu mapa: inoremap ^ L ^ X ^ L
Jorge Gajon
11

Outra opção seria ir com:

nmap <C-d> mzyyp`z

oferece a vantagem de preservar a posição do cursor.

Torre
fonte
10

Para alguém que não conhece o vi, algumas respostas acima podem enganá-lo com frases como "colar ... depois / antes da linha atual ".
Na verdade, é "colar ... depois / antes do cursor ".

yyou Ypara copiar a linha
ou
ddexcluir a linha

então

pcolar o texto copiado ou excluído após o cursor
ou
Pcolar o texto copiado ou excluído antes do cursor


Para obter mais ligações de teclas, você pode visitar este site: vi Lista Completa de Ligações de Chaves

Michael
fonte
3

1 dica: quando você usa "p" para colocar a linha, coloca-a após a linha em que o cursor está, portanto, se você deseja adicionar a linha após a linha que está puxando, não mova o cursor para baixo de uma linha antes de colocar a nova linha.

cori
fonte
4
ou capital de uso P - colocar antes
Ghoti
3

O padrão é yyp, mas eu uso essa religação há mais ou menos um ano e adoro:

" set Y to duplicate lines, works in visual mode as well. nnoremap Y yyp vnoremap Y y`>pgv

Chris Penner
fonte
3

Eu sei que estou atrasado para a festa, mas tanto faz; Eu tenho isso no meu .vimrc:

nnoremap <C-d> :copy .<CR>
vnoremap <C-d> :copy '><CR>

a :copy comando apenas copia a linha ou o intervalo selecionado (sempre linhas inteiras) abaixo do número da linha fornecido como argumento.

No modo normal, o que isso faz é copy . copiar esta linha para logo abaixo desta linha .

E no modo visual, ele se transforma em '<,'> copy '> cópia do início da seleção para o final da seleção até a linha abaixo do final da seleção .

DarkWiiPlayer
fonte
1
↑↑ melhor resposta aqui!
2

Para quem está começando a aprender o vi, aqui está uma boa introdução ao vi, listando lado a lado os comandos do vi para o movimento típico do cursor do Windows GUI Editor e as teclas de atalho. Ele lista todos os comandos básicos, incluindo yy(linha de cópia) e p(colar depois) ou P(colar antes).

vi (Vim) para usuários do Windows

ap-osd
fonte
1

Se você deseja duplicar uma linha e colá-la imediatamente abaixo do atual, como no Sublime Ctrl+ Shift+ D, você pode adicioná-lo ao seu .vimrcarquivo.

nmap <S-C-d> <Esc>Yp

Ou, para o modo Inserir:

imap <S-C-d> <Esc>Ypa

jedi
fonte
No entanto, isso deixa o modo de inserção e, ao adicionar inovamente ao final para reinserir, ele quebra undo, portanto, a solução para duplicar linhas no modo de inserção não é tão trivial quanto parece.
DarkWiiPlayer
Isso funciona perfeitamente bem para mim: imap <S-C-d> <Esc>Ypi modo de inserção e nmap <S-C-d> <Esc>Ypno modo normal
jedi
0

Eu gosto de usar este mapeamento:

:nnoremap yp Yp

porque torna consistente o uso juntamente com o YPcomando nativo .

yolenoyer
fonte