Como posso mover facilmente uma linha?

47

Qual é o comando (ou atalho) para mover uma linha para cima ou para baixo no vim? Meu fluxo de trabalho atual é arrancar (copiar) a linha e excluí-la e depois colocar (colar) essa linha.

Vader
fonte
8
Desde apagar realmente os cortes, você pode pular o puxão: ddkP, para baixo em movimento é mais fácil: ddp.
muru 21/03/2015

Respostas:

52

Primeiro, você não precisa puxar e excluir; o último também colocará o conteúdo excluído no registro (padrão ou especificado). Portanto, ddp/ ddkPsão comandos comuns para mover uma linha um para baixo / para cima.

Como alternativa, você pode usar o :movecomando, ie :move +1/ :move -2; isso não atrapalha o registro e você também pode mover intervalos inteiros. Você pode definir facilmente os mapeamentos de teclas para encurtar isso.

Se você não se importa com plugins (e com o conforto adicional que costuma vir com eles), o plug - in intacto de Tim Pope e meu plug-in LineJuggler fornecem ]e/ [emapeamentos para mover linhas (e vários outros; Tim para uma variedade de usos, o meu focado no manuseio linha (s)).

Ingo Karkat
fonte
36

O mais fácil é: :m+ou :m-2qual é a abreviação de :movecomo Ingo sugeriu.

Ou usando o modo visual ( V) cortando a linha ( d/ x) e colando-a ( p- abaixo do cursor, Pacima do cursor) depois de mover o cursor para o lugar certo antes de colar (para resumir, é Vxp/ Vdp).

Ao mover várias linhas no modo visual, você deve usar :m '>+1(para mover uma linha para baixo) ou :m '<-2(para mover uma linha para cima).


Aqui está um exemplo de mapeamento útil ( Shift+ ↑/ Shift+↓):

nnoremap <S-Up> :m-2<CR>
nnoremap <S-Down> :m+<CR>
inoremap <S-Up> <Esc>:m-2<CR>
inoremap <S-Down> <Esc>:m+<CR>

que é semelhante ao texto sublime ( Win / OSX ).

Aqui estão algumas sugestões no vim wikia :

nnoremap <A-j> :m .+1<CR>==
nnoremap <A-k> :m .-2<CR>==
inoremap <A-j> <Esc>:m .+1<CR>==gi
inoremap <A-k> <Esc>:m .-2<CR>==gi
vnoremap <A-j> :m '>+1<CR>gv=gv
vnoremap <A-k> :m '<-2<CR>gv=gv

No modo normal ou no modo de inserção, pressione Alt-j para mover a linha atual para baixo ou pressione Alt-k para mover a linha atual.

Após selecionar visualmente um bloco de linhas (por exemplo, pressionando V e movendo o cursor para baixo), pressione Alt-j para mover todo o bloco para baixo ou pressione Alt-k para mover o bloco para cima.

Veja também:

kenorb
fonte
2
+1 para o link Vim wikia. Aprendi algumas coisas lá.
Gonçalo Ribeiro
Não sei por que, mas eles funcionam muito bem no Gvim, mas não funcionam como o esperado no terminal vim (parece que é o problema do tmux)
CodyChan
11

Se eu quiser trocar uma linha pela linha acima, eu normalmente faço o seguinte

ddkP

Explicação

  • O dd excluirá a linha e a adicionará ao registro padrão.
  • k subirá uma linha (j desceria uma linha)
  • P irá colar acima da linha atual
venkatvb
fonte
3
Para mover a linha atual para baixo, useddp
Qinjie
4

FWIW, aqui está o que eu uso há anos. Move a linha atual para cima e para baixo no modo normal ou a seleção no modo visual, enquanto ajusta o recuo automaticamente.

nnoremap ,<Up>   :<C-u>silent! move-2<CR>==
nnoremap ,<Down> :<C-u>silent! move+<CR>==
xnoremap ,<Up>   :<C-u>silent! '<,'>move-2<CR>gv=gv
xnoremap ,<Down> :<C-u>silent! '<,'>move'>+<CR>gv=gv
romainl
fonte