¿Cómo puedo mover fácilmente una línea?

48

¿Cuál es el comando (o acceso directo) para mover una línea hacia arriba o hacia abajo en vim? Mi flujo de trabajo actual es tirar (copiar) la línea y luego eliminar esa línea y luego poner (pegar) esa línea.

Vader
fuente
8
Dado que la eliminación de los recortes de hecho, puede omitir el tirón: ddkP, abajo en movimiento es más fácil: ddp.
Muru

Respuestas:

52

Primero, no necesita tirar y eliminar; este último también colocará los contenidos eliminados en el registro (predeterminado o especificado). Por lo tanto, ddp/ ddkPson comandos comunes para mover una línea hacia abajo / arriba.

Alternativamente, puede usar el :movecomando, es decir :move +1/ :move -2; esto no golpea el registro, y también puede mover rangos completos. Puede definir fácilmente las asignaciones de teclas para acortar esto.

Si no le importan los complementos (y la comodidad adicional que a menudo viene con ellos), tanto el complemento intacto de Tim Pope como mi complemento LineJuggler proporcionan ]e/ [emapeos para mover líneas (y varios más; Tim para una variedad de usos, el mío se centró en el manejo líneas)).

Ingo Karkat
fuente
36

La más fácil es: :m+o :m-2que es la abreviatura de :movecomo sugirió Ingo.

O utilice el modo visual ( V) cortando la línea ( d/ x) y luego péguela ( p- debajo del cursor, Pencima del cursor) después de mover el cursor al lugar correcto antes de pegar (en resumen, es Vxp/ Vdp).

Al mover varias líneas en modo visual, debe usar :m '>+1(para mover una línea hacia abajo) o :m '<-2(para mover una línea hacia arriba).


Aquí hay una muestra de mapeo ú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 es similar a Sublime Text ( Win / OSX ).

Aquí hay algunos sugeridos en 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

En modo normal o en modo de inserción, presione Alt-j para mover la línea actual hacia abajo, o presione Alt-k para mover la línea actual hacia arriba.

Después de seleccionar visualmente un bloque de líneas (por ejemplo, presionando V y luego moviendo el cursor hacia abajo), presione Alt-j para mover todo el bloque hacia abajo, o presione Alt-k para mover el bloque hacia arriba.

Ver también:

kenorb
fuente
2
+1 para el enlace Vim wikia. Aprendí algunas cosas allí.
Gonçalo Ribeiro
No sé por qué, pero funcionan muy bien en Gvim, pero no funcionan como se esperaba en la terminal vim. (Parece que es el problema de tmux)
CodyChan
12

Si quiero intercambiar una línea con la línea de arriba, generalmente hago lo siguiente

ddkP

Explicación

  • dd eliminará la línea y la agregará al registro predeterminado.
  • k se moverá hacia arriba una línea (j se movería hacia abajo una línea)
  • P pegará sobre la línea actual
venkatvb
fuente
3
Para mover la línea actual hacia abajo, useddp
Qinjie
4

FWIW, esto es lo que he usado durante años. Mueve la línea actual hacia arriba y hacia abajo en modo normal o la selección en modo visual, mientras ajusta la sangría automáticamente.

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
fuente