¿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.


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)).


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:


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

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
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.