¿Cómo cambio dos líneas en vim?

94

Tengo esto:

pick 887b66f add 222 Dziewiecsil to flowers new title
pick dc331cb new name of beginning commit

Y quiero conseguir esto:

pick dc331cb new name of beginning commit
pick 887b66f add 222 Dziewiecsil to flowers new title

¿Hay alguna forma de hacer esto de una manera rápida usando atajos de teclado?

Bartłomiej Semańczyk
fuente
Podría considerar usar un editor diferente si no está familiarizado con vim. Puede configurar el editor para git solo usando cualquiera git config --global core.editor <whatever>, o para muchas cosas a la vez (incluido git) al incluir export EDITOR=<whatever>en su archivo .bashrc.
Sven Marnach

Respuestas:

160

Para intercambiar la línea actual con la siguiente, escriba ddpen el modo de comando.

  • dd - eliminar la línea (en realidad llamada cortar en otros editores) y guardarla en el registro
  • p - pegar línea desde el registro
Sven Marnach
fuente
3
Mueva el cursor en la primera línea, luego escriba ddp. Si aún no está en el modo de comando, presione Escpara entrar en el modo de comando.
Sven Marnach
32
ddelimina la línea actual después de copiarla en un "registro". pcopia ("pone") el contenido del registro en su búfer después de la línea actual. Del mismo modo, puede intercambiar dos caracteres con xpo dos palabras con dwwP.
Keith Thompson
@KeithThompson, por desgracia, no es tan fácil intercambiar dos palabras.
CS
@CS ¿Te refieres al hecho de que dwwPno funciona de la misma manera si las dos palabras están al final de una línea? (Y cambiar la última palabra en una línea con la primera palabra en la siguiente línea es aún más complicado).
Keith Thompson
1
@KeithThompson sí, aunque me sentí un poco mal después de hacer mi comentario porque es un caso extremo literal;)
CS
52

ddelimina la línea actual, luego puede pegar la línea eliminada usando p. Hay otra forma de usar m. Con mpuedes mover líneas, es decir

:m 1 moverá la línea actual después de la línea 1

:m 0 moverá la línea actual hacia arriba

:m $ moverá la línea actual hacia abajo

En su ejemplo, coloque el cursor en la primera línea y escriba :m $

Más información: http://vim.wikia.com/wiki/Moving_lines_up_or_down

Sr. Eigenbart
fuente
1
Gracias por la explicación para los "nativos" no vim :-)
Bruno Bieri
1
Esta es la respuesta que también estaba buscando para ampliar mis conocimientos sobre vim.
Phemelo Khetho
¡Gracias! Esta es la respuesta que estaba buscando. Esto puede resultar aún más útil cuando se deslizan varias líneas al mismo tiempo utilizando el modo visual.
Kareem Jeiroudi
8

A pesar de que la pregunta es bastante antigua y está marcada como respondida, me gustaría extender la respuesta diciendo que puede usar los comandos del modo normal, que fueron proporcionados por Sven Marnach con nnoremaplo siguiente:

:nnoremap <C-Up> <Up>ddp<Up>
:nnoremap <C-Down> ddp

Esto le permitirá mover líneas con Ctrl+ Upy Ctrl+ Downdentro de su archivo. Sin embargo, esto sobrescribirá el @"registro, que almacena la última cadena / palabra / letra / etc. copiada. Entonces, agregando "(reg) antes ddy pcomandos, podemos solucionar esto:

:nnoremap <C-Up> <Up>"add"ap<Up>
:nnoremap <C-Down> "add"ap

Aquí agregamos "acomandos antes de eliminar y pegar para almacenar nuestra línea en el @aregistro, por lo que su registro de copia predeterminado no se sobrescribirá. Sin embargo, puede sobrescribir el contenido del @aregistro (quién sabe, pero puede usarlo para algo importante en su caso de uso, pero este paso es un poco paranoico, puede omitirlo si lo desea), solucionemos eso también:

:nnoremap <silent><C-Up> :let save_a=@a<Cr><Up>"add"ap<Up>:let @a=save_a<Cr>
:nnoremap <silent><C-Down> :let save_a=@a<Cr>"add"ap:let @a=save_a<Cr>

( <silent>necesario para evitar hacer eco de nuestros comandos en la línea de mensajes en la parte inferior).

Ahora tenemos dos mapeos que nos permiten mover líneas dentro del archivo con atajos de teclado. Puede redefinir los botones, yo uso Alt+ j/ k, que sería <A-j>y <A-k>para esos comandos. Sin embargo, no todos los emuladores de terminal admiten asignaciones de teclas Alt AFAIK.

Andrey Orst
fuente
3

Ejemplo:

  1. one
> 2. two

con :m-2, interruptor (línea actual - 2)

> 2. two
  1. one

con :m+1interruptor (línea actual + 1)

  1. one
> 2. two

Puede mapear esto si lo desea.

cjadesarrollador
fuente
1
Esta es la mejor respuesta que la respuesta predeterminada
Alex Bin Zhao
0

Las asignaciones propuestas en la página de la wikia de Vim son en realidad la mejor manera de asignar combinaciones de teclas que emulan la forma en que Sublime y otros editores implementan esta función.

Esto incluye una acción de sangría después del movimiento, que también es genial (son los ==signos de doble igual , en caso de que no lo desee).

También es compatible con los modos visual y de inserción , para que pueda mover líneas mientras edita o con fulblocks.

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

Los asigné personalmente a mi Mac <D-J>y <D-K>en mi Mac, en lugar de los <A-mapas a la Altclave. De esa manera utilizo Cmd+ Shift+ j/ k, que se siente más natural en la punta de mis dedos.

ojosilva
fuente