Come posso spostare facilmente una linea?


48

Qual è il comando (o il collegamento) per spostare una riga su o giù in vim? Il mio flusso di lavoro attuale è di strappare (copiare) la linea e quindi di eliminare quella linea e di mettere (incollare) quella linea.


8
Dal momento che l'eliminazione in realtà tagli, è possibile saltare la Yank: ddkP, lo spostamento verso il basso è più facile: ddp.
— Muru,

Risposte:


52

Innanzitutto, non è necessario eseguire lo strappo e l' eliminazione; quest'ultimo inserirà anche i contenuti eliminati nel registro (predefinito o specificato). Pertanto, ddp/ ddkPsono comandi comuni per spostare una riga di una in basso / in alto.

In alternativa, è possibile utilizzare il :movecomando, ovvero :move +1/ :move -2; questo non ostruisce il registro e puoi anche spostare interi intervalli. È possibile definire facilmente i mapping dei tasti per accorciarlo.

Se non ti dispiace plug-in (e il comfort aggiuntivo che spesso ne deriva), sia il plug-in senza compromessi di Tim Pope che il mio plug-in LineJuggler forniscono ]e/ [emappature per spostare le linee (e molti altri; Tim è per una varietà di usi, il mio si è concentrato sulla gestione Linee)).


36

Il più semplice è: :m+o :m-2che è l'abbreviazione di :movecome suggerito da Ingo.

O usando la modalità visiva ( V) tagliando la linea ( d/ x) quindi incollandola ( p- sotto il cursore, Psopra il cursore) dopo aver spostato il cursore nel punto giusto prima di incollarlo (quindi in sintesi è Vxp/ Vdp).

Quando si spostano più righe in modalità visiva, è necessario utilizzare :m '>+1(per spostare una riga verso il basso) o :m '<-2(per spostare una riga verso l'alto).


Ecco una mappatura utile di esempio ( 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>

che è simile a Sublime Text ( Win / OSX ).

Ecco alcuni suggerimenti su 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

In modalità normale o in modalità inserimento, premere Alt-j per spostare la riga corrente verso il basso o premere Alt-k per spostare la riga corrente verso l'alto.

Dopo aver selezionato visivamente un blocco di linee (ad esempio, premendo V quindi spostando il cursore verso il basso), premere Alt-j per spostare l'intero blocco verso il basso o premere Alt-k per spostare il blocco verso l'alto.

Guarda anche:


2
+1 per il link Vim wikia. Ho imparato alcune cose lì.
— Gonçalo Ribeiro,

Non so perché, ma funzionano molto bene in Gvim, ma non funzionano come previsto in terminal vim. (Sembra che sia il problema di tmux)
— CodyChan il

12

Se desidero scambiare una riga con la riga sopra, di solito faccio quanto segue

ddkP

Spiegazione

  • dd eliminerà la riga e la aggiungerà al registro predefinito.
  • k si sposta su una riga (j si sposta su una riga)
  • P incollerà sopra la riga corrente

3
Per spostare la riga corrente in basso, usaddp
— Qinjie il

4

FWIW, ecco quello che ho usato per anni. Sposta la riga corrente su e giù in modalità normale o la selezione in modalità visiva, regolando automaticamente la rientranza.

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.