Manera más rápida de mover un bloque de texto


25

Así es como suelo copiar un bloque de texto o código:

  1. Seleccione el bloque con el modo Visual ( V) y elimínelo con d; o si es solo una línea, solo utilícela dd.
  2. Vaya a donde quiero que esté el texto, soy demasiado estúpido para recordar la diferencia entre py P, así que lo hago bien aproximadamente el 50% del tiempo. (si me equivoco: vuelva a intentarlo).
  3. A veces, la sangría necesita un ajuste, por lo que voy al modo Visual Vnuevamente y vuelvo a seleccionar el mismo bloque, y uso >o <para solucionarlo.

hay una manera mas facil? En algunos editores he visto que puedes "recoger" un bloque de texto, por así decirlo, y moverlo; Aquí hay un ejemplo de Emacs (pero también lo he visto en otros editores):

Emacs

¿O tal vez hay otra manera (incluso mejor)?


Sobre el problema de sangría, puede resolverlo pegando con ]po en [plugar de po P. De esta manera, el bloque que pegue será autoindentado.
Gonçalo Ribeiro

Es posible que desee ver el screencast de Drew Neil Bubbling Text que recomienda usar vim-intacto .
Hotschke

Respuestas:


13

Hay un complemento para eso: dragvisuals.vim .

No vincula ninguna tecla de forma predeterminada, por lo que deberá hacerlo usted mismo. Me gusta asignarlos a 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')

También viene con una clave de bonificación para duplicar la selección actual:

xmap <expr> D DVB_Duplicate()

Ventajas de este complemento sobre las otras respuestas:

  • No hace desaparecer ningún texto si intentas avanzar más allá de la primera línea.
  • Expandirá el archivo si te mueves debajo de la última línea.
  • Moverse hacia la izquierda / derecha funciona un poco mejor.

Otro truco útil para complementar esto, son estas combinaciones de teclas:

xnoremap > >gv
xnoremap < <gv

Esto volverá a seleccionar la última selección visual después de usarla >en el modo Visual, para que pueda ajustar la alineación más fácilmente (también puede usar las teclas de flecha, pero esto lo moverá un carácter y no uno shiftwidth).


1
Hay otro complemento para esto que el autor de mi complemento sugerido describe como "una reelaboración mucho mejor de mi propio dragvisuals.vim": github.com/zirrostig/vim-schlepp
Jay Thompson

8

Para el paso 3, puede usar gv=en su lugar ( =significa sangría y gvsignifica "volver a seleccionar la última selección visual").

Para el comportamiento de Emacs, sería bastante simple agregar algunas asignaciones en su .vimrc:

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

Luego puede usar las teclas de flecha arriba y abajo para moverse por una selección de línea visual. (Por supuesto, también podría asignar diferentes teclas si odia las flechas).

(Puede hacer esto con selecciones visuales normales y moviéndolas de izquierda a derecha también: vnoremap <left> dhPgvhohoy vnoremap <right> dpgvlolo.)


gvva a la última selección visual, que en este caso sería el párrafo que se eliminó. ¿Qué me estoy perdiendo?
Robert Smith

4

Puede reasignar algunas teclas para mover líneas. Por ejemplo, flechas arriba y abajo si está acostumbrado a moverse hjkl.

Por ejemplo, en .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 una línea

+1o -2para indicar una línea hacia arriba o hacia abajo (-1 mantiene la línea en el mismo lugar)

gvpara seleccionar nuevamente el mismo texto en VISUALmodo

Esta solución no interfiere con los registros, por lo que cualquier texto copiado seguirá estando disponible, así como formateará el código para establecer la sangría adecuada, etc.


Esto es bueno, pero no para mí, ya que no me gusta usar =(a menudo cambia demasiado el formato no relacionado para mí).
Martin Tournoij


3

Hay pocos complementos para esto, pero prefiero el vim-intacto ( github ) de Tim Pope (Ingo Karkat LineJuggler es similar).

Usted selecciona visualmente su bloque de texto y luego lo hace ]e(e para intercambio) para mover el bloque hacia abajo ( [een la otra dirección). Úselo .para repetir la acción (usted tiene repeat.vim instalado, ¿no es así?). Si va demasiado lejos, simplemente deshaga la ruta u.

Ahora personalmente pienso py Pson comandos tan comunes que sería mejor aprenderlos antes de crear malos hábitos. Entonces podría usar ]ppara pegar en la misma sangría. Si está utilizando sin daños, puede hacer >ppara pegar un nivel de sangría más profundo o =ppara pegar y reformatear.

Si tiene problemas para recordar py Ppodría ayudarlo a pensar en términos de los comandos oy O, que es una especie de simetría.

Como otros han notado, puede usar gvpara volver a seleccionar una selección visual. Sin embargo, si acaba de poner / pegar texto, habrá perdido su selección visual. No se preocupe porque cada cambio (¡y yanks!) Se establecerá '[y ']alrededor del área cambiada. Entonces puede sangrar vía >'](leer: desplazarse a la derecha hasta el final del último cambio) y usar .para repetir la sangría hasta que tenga el texto en el lugar correcto.

Para más ayuda ver:

:h p
:h P
:h ]p
:h o
:h O
:h .
:h u
:h >
:h ']
:h gv

2

Si conoce el número de línea al que desea mover el bloque de texto, puede usar un rango o una selección visual con el :movecomando para mover el bloque hacia allí.

Por ejemplo, si tengo el siguiente archivo:

1 aaa
2 bbb
3 ccc
4 ddd

y quiero mover la línea de a después de la línea de c, coloco el cursor en la línea de a e ingreso :m3, y la línea se desplaza.

Esto también funciona con +/- compensaciones. En el ejemplo anterior, se podría lograr el mismo resultado :m+2para mover la línea 2 líneas hacia abajo.

Para bloques de texto, la única diferencia es agregar un rango o selección. Para mover las líneas aaa y bbb al final del archivo, use un comando como :1,2m$($ = última línea) o seleccione visualmente las líneas y :m$.


1
Para obtener más consejos acerca de :movever también vim.wikia.com/wiki/Moving_lines_up_or_down o el Consejo 29 Duplicar o mover líneas usando los comandos ': t' y ': m' en el libro Vim práctico de D. Neil.
Hotschke

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.