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.