Modo più rapido per spostare un blocco di testo


25

Ecco come di solito copio un blocco di testo o codice:

  1. Seleziona il blocco con la modalità Visual ( V) ed eliminalo con d; o se è solo una riga, basta usare dd.
  2. Vai dove voglio che sia il testo, sono troppo stupido per ricordare la differenza tra pe P, quindi ottengo questo diritto circa il 50% delle volte. (se sbaglio: annulla di nuovo riprovare).
  3. A volte, il rientro deve essere modificato, quindi vado di Vnuovo in modalità Visual e riseleziono lo stesso blocco e utilizzo >o <per risolvere il problema.

C'è un modo più semplice? In alcuni editor ho visto che puoi "raccogliere" un blocco di testo, per così dire, e spostarlo; ecco un esempio di Emacs (ma l'ho visto anche in altri editor):

Emacs

O forse c'è un altro (anche meglio) modo?


Per quanto riguarda il problema del rientro, puoi risolverlo incollando con ]po [panziché con po P. In questo modo il blocco incollato verrà autoindentato.
Gonçalo Ribeiro,

Potresti voler guardare lo screencast di Drew Neil Bubbling Text che raccomanda di usare vim senza compromessi .
Hotschke,

Risposte:


13

C'è un plugin per quello: dragvisuals.vim .

Per impostazione predefinita, non associa alcuna chiave, quindi dovrai farlo da solo. Mi piace mapparli su Control+ Arrow key:

xmap <expr> <C-Left> DVB_Drag('left')
xmap <expr> <C-Right> DVB_Drag('right')
xmap <expr> <C-Down> DVB_Drag('down')
xmap <expr> <C-Up> DVB_Drag('up')

Inoltre viene fornito con una chiave bonus per duplicare la selezione corrente:

xmap <expr> D DVB_Duplicate()

Vantaggi di questo plugin rispetto alle altre risposte:

  • Non scompare alcun testo se si tenta di spostarsi più in alto della prima riga.
  • Espanderà il file se ci si sposta al di sotto dell'ultima riga.
  • Spostarsi a sinistra / destra funziona un po 'meglio.

Un altro trucco utile per completare questo, sono questi legami:

xnoremap > >gv
xnoremap < <gv

Questo selezionerà nuovamente l'ultima selezione visiva dopo averla usata >in modalità Visiva, in modo da poter regolare più facilmente l'allineamento (puoi anche usare i tasti freccia, ma questo lo sposterà di un carattere e non di uno shiftwidth).


1
C'è un altro plugin per questo che l'autore del mio suggerito plugin descrive come "una rielaborazione molto migliorata del mio dragvisuals.vim": github.com/zirrostig/vim-schlepp
Jay Thompson,

8

Per il passaggio 3, è possibile utilizzare gv=invece ( =significa rientro e gvsignifica "riseleziona l'ultima selezione visiva").

Per il comportamento di Emacs, sarebbe abbastanza semplice aggiungere alcune mappature nel tuo .vimrc:

vnoremap <down> dpV`]
vnoremap <up> dkPV`]

È quindi possibile utilizzare i tasti freccia su e giù per spostarsi all'interno di una selezione della linea visiva. (Ovviamente, se si odiano le frecce, è possibile mappare anche su tasti diversi.)

(Potresti farlo con le normali selezioni visive e spostandole anche a destra e sinistra: vnoremap <left> dhPgvhohoe vnoremap <right> dpgvlolo.)


gvpassa all'ultima selezione visiva, che in questo caso sarebbe il paragrafo che è stato eliminato. Cosa mi sto perdendo?
Robert Smith,

4

Puoi rimappare alcuni tasti per spostare le linee. Ad esempio, le frecce su e giù se sei abituato a spostarti hjkl.

Ad es. Su .vimrc

nnoremap <down> :m .+1<CR>==
nnoremap <up> :m .-2<CR>==
vnoremap <down> :m '>+1<CR>gv=gv
vnoremap <up> :m '<-2<CR>gv=gv

:m, comando normale per spostare una linea

+1o -2per indicare una linea su o giù (-1 mantiene la linea nello stesso posto)

gvper selezionare nuovamente lo stesso testo in VISUALmodalità

Questa soluzione non interferisce con i registri, quindi qualsiasi testo copiato sarà ancora disponibile, così come riformattare il codice per impostare il rientro corretto, ecc.


Questo è carino, ma non per me, dal momento che non mi piace usare =(spesso cambia troppo la formattazione non correlata per me).
Martin Tournoij,


3

Ci sono alcuni plugin per questo, ma io preferisco di Tim Pope vim-indenne ( github ) (Ingo Karkat LineJuggler è simile).

Seleziona visivamente il tuo blocco di testo, quindi fai ]e(e per lo scambio) per spostare il blocco verso il basso ( [eper l'altra direzione). Utilizzare .per ripetere l'azione (hai repeat.vim installato, non è vero). Se vai troppo lontano, annulla semplicemente via u.

Ora personalmente penso pe Psono comandi così comuni che sarebbe meglio impararli prima di creare cattive abitudini. Quindi è possibile utilizzare ]pper incollare allo stesso rientro. Se stai usando intatto, puoi fare >pper incollare un livello di incidenza più in profondità o =pper incollare e riformattare.

Se hai difficoltà a ricordare pe Pquindi potrebbe aiutarti a pensarli in termini di comandi oe Oche è una specie di simmetria.

Come altri hanno notato, è possibile utilizzare gvper riselezionare una selezione visiva. Tuttavia, se hai appena inserito / incollato il testo, perderai la selezione visiva. Non agitarti perché ogni cambiamento (e strattone!) Verrà impostato '[e ']intorno all'area modificata. Quindi puoi rientrare tramite >'](leggi: sposta a destra fino alla fine dell'ultima modifica) e usa il tasto .per ripetere il rientro fino a quando non hai il testo nel punto giusto.

Per ulteriori informazioni, consultare:

:h p
:h P
:h ]p
:h o
:h O
:h .
:h u
:h >
:h ']
:h gv

2

Se si conosce il numero di riga in cui si desidera spostare il blocco di testo, è possibile utilizzare un intervallo o una selezione visiva con il :movecomando per spostare il blocco lì.

Ad esempio, se ho il seguente file:

1 aaa
2 bbb
3 ccc
4 ddd

e voglio spostare la linea di a dopo la linea di c, posiziono il cursore sulla linea di a e invio :m3, quindi la linea viene spostata.

Questo funziona anche con offset +/-. Nell'esempio sopra, lo stesso risultato potrebbe essere ottenuto con :m+2lo spostamento della linea 2 verso il basso.

Per i blocchi di testo, l'unica differenza è l'aggiunta di un intervallo o di una selezione. Per spostare le righe aaa e bbb alla fine del file, utilizzare un comando come :1,2m$($ = last line) o selezionare visivamente le righe e :m$.


1
Per ulteriori suggerimenti, :movevedere anche vim.wikia.com/wiki/Moving_lines_up_or_down o i suggerimenti 29 Duplica o sposta linee usando i comandi ': t' e ': m' nel libro Practical Vim di D. Neil.
Hotschke,

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.