Maneira mais rápida de mover um bloco de texto

25

Eis como costumo copiar um bloco de texto ou código:

  1. Selecione o bloco com o modo Visual ( V) e exclua-o com d; ou, se for apenas uma linha, use dd.
  2. Vá para onde eu quero que o texto esteja, sou estúpido demais para lembrar a diferença entre pe P, por isso, entendi isso 50% do tempo. (se estiver errado: desfaça uma tentativa novamente).
  3. Às vezes, o recuo precisa ser ajustado, então eu vou para o modo Visual Vnovamente e seleciono novamente o mesmo bloco, e uso >ou <para corrigir isso.

Existe uma maneira mais fácil? Em alguns editores, vi que você pode "pegar" um bloco de texto, por assim dizer, e movê-lo; Aqui está um exemplo do Emacs (mas também vi isso em outros editores):

Emacs

Ou talvez haja outra maneira (ainda melhor)?

Martin Tournoij
fonte
Sobre o problema de indentação, você pode resolvê-lo colando com ]pou [pmelhor que com pou P. Dessa forma, o bloco que você cola será autoindentado.
Gonçalo Ribeiro
Você pode assistir ao screencast de Drew Neil Bubbling Text, que recomenda o uso do vim intacto .
Hotschke

Respostas:

13

Existe um plugin para isso: dragvisuals.vim .

Como não vincula nenhuma chave por padrão, você deverá fazer isso sozinho. Eu gosto de mapeá-los para Control+ Arrow key:

xmap <expr> <C-Left> DVB_Drag('left')
xmap <expr> <C-Right> DVB_Drag('right')
xmap <expr> <C-Down> DVB_Drag('down')
xmap <expr> <C-Up> DVB_Drag('up')

Ele também vem com uma chave de bônus para duplicar a seleção atual:

xmap <expr> D DVB_Duplicate()

Vantagens deste plugin sobre as outras respostas:

  • Não faz nenhum texto desaparecer se você tentar avançar mais do que a primeira linha.
  • Ele expandirá o arquivo se você mover abaixo da última linha.
  • Mover para a esquerda / direita funciona um pouco melhor.

Outro truque útil para complementar isso, são esses atalhos de teclado:

xnoremap > >gv
xnoremap < <gv

Isso selecionará novamente a última seleção visual após o uso >no modo Visual, para que você possa ajustar o alinhamento mais facilmente (você também pode usar as teclas de seta, mas isso será movido por um caractere, e não um shiftwidth).

Jay Thompson
fonte
11
Há um outro plugin para isso que o autor do meu plugin sugeriu descreve como "uma muito melhor reformulação de minha própria dragvisuals.vim": github.com/zirrostig/vim-schlepp
Jay Thompson
8

Para a etapa 3, você pode usar gv=( =significa recuar e gvsignifica "selecionar novamente a última seleção visual").

Para o comportamento do Emacs, seria muito simples adicionar alguns mapeamentos no seu .vimrc:

vnoremap <down> dpV`]
vnoremap <up> dkPV`]

Você pode usar as teclas de seta para cima e para baixo para mover-se em uma seleção de linha visual. (Obviamente, você também pode mapear para teclas diferentes se detestar flechas.)

(Você pode fazer isso com seleções visuais normais e movê-las para a esquerda e direita também: vnoremap <left> dhPgvhohoe vnoremap <right> dpgvlolo.)

Maçaneta
fonte
gvvai para a última seleção visual, que nesse caso seria o parágrafo que foi excluído. o que estou perdendo?
Robert Smith
4

Você pode remapear algumas teclas para mover as linhas. Por exemplo, setas para cima e para baixo, se você estiver acostumado a se movimentar hjkl.

Por exemplo, em .vimrc

nnoremap <down> :m .+1<CR>==
nnoremap <up> :m .-2<CR>==
vnoremap <down> :m '>+1<CR>gv=gv
vnoremap <up> :m '<-2<CR>gv=gv

:m, comando normal para mover uma linha

+1ou -2para indicar uma linha para cima ou para baixo (-1 mantém a linha no mesmo lugar)

gvpara selecionar novamente o mesmo texto no VISUALmodo

Essa solução não interfere nos registros, portanto, qualquer texto copiado ainda estará disponível, além de reformatar o código para definir o recuo adequado etc.

Khelben
fonte
Isso é legal, mas não para mim, já que não gosto de usar =(muitas vezes muda muito a formatação não relacionada a mim).
Martin Tournoij 8/15
3

Existem poucos plugins para isso, mas eu prefiro o vim intacto de Tim Pope ( github ) (o Ingo Karkat LineJuggler é semelhante).

Você visualmente seleciona seu bloco de texto e, em seguida, faz ]e(e para troca) para mover o bloco para baixo ( [ena outra direção). Use .para repetir a ação (Você tem o repeat.vim instalado, não é). Se você for longe demais, basta desfazer a via u.

Agora, pessoalmente, penso pe Psão comandos tão comuns que seria melhor aprendê-los antes de criar maus hábitos. Então você pode usar ]ppara colar no mesmo recuo. Se você estiver usando o intacto, você pode >pcolar um nível de indentação mais profundo ou =pcolar e reformatar.

Se você tiver problemas para se lembrar pe, em Pseguida, poderá ajudá-lo a pensar neles em termos dos comandos oe, Oque é um tipo de simetria.

Como outros observaram, você pode usar gvpara selecionar novamente uma seleção visual. No entanto, se você apenas colocar / colar o texto, terá perdido sua seleção visual. Não se preocupe, pois todas as alterações (e puxões!) Serão definidas '[e em ']torno da área alterada. Portanto, você pode recuar via >'](leia-se: deslocar para a direita até o final da última alteração) e use o .para repetir a recuo até ter o texto no lugar certo.

Para obter mais ajuda, consulte:

:h p
:h P
:h ]p
:h o
:h O
:h .
:h u
:h >
:h ']
:h gv
Peter Rincker
fonte
2

Se você souber o número da linha para a qual deseja mover o bloco de texto, poderá usar um intervalo ou uma seleção visual com o :movecomando para mover o bloco para lá.

Por exemplo, se eu tiver o seguinte arquivo:

1 aaa
2 bbb
3 ccc
4 ddd

e eu quero mover a linha de a para depois da linha de c, coloco o cursor na linha de a e entro :m3e a linha é então deslocada.

Isso também funciona com +/- compensações. No exemplo acima, o mesmo resultado pode ser alcançado com o :m+2movimento da linha 2 linhas para baixo.

Para blocos de texto, a única diferença é adicionar um intervalo ou seleção. Para mover as linhas aaa e bbb para o final do arquivo, use um comando como :1,2m$($ = última linha) ou selecione visualmente as linhas e :m$.

Pooping
fonte
11
Para obter mais dicas sobre :moveconsulte também vim.wikia.com/wiki/Moving_lines_up_or_down ou a Dica 29 Duplicar ou Mover Linhas Usando os Comandos ': t' e ': m' no Livro Prático Vim de D. Neil.
Hotschke 12/04