Wie kann ich eine Linie einfach verschieben?

47

Was ist der Befehl (oder die Verknüpfung), um eine Zeile in vim nach oben oder unten zu verschieben? Mein aktueller Arbeitsablauf besteht darin, die Zeile zu ziehen (zu kopieren) und dann diese Zeile zu löschen und dann diese Zeile einzufügen (einzufügen).

Vader
quelle
8
Da tatsächlich Schnitte zu löschen, können Sie den Ruck überspringen ddkP, nach unten zu bewegen ist einfacher: ddp.
muru

Antworten:

52

Erstens müssen Sie nicht ziehen und löschen; Letzteres wird auch die gelöschten Inhalte in das (standardmäßige oder angegebene) Register stellen. Daher sind ddp/ ddkPübliche Befehle, um eine Zeile nach unten / oben zu verschieben.

Alternativ können Sie den :moveBefehl verwenden, dh :move +1/ :move -2; Dadurch wird das Register nicht überlastet, und Sie können auch ganze Bereiche verschieben. Sie können einfach Tastenzuordnungen definieren, um dies zu verkürzen.

Wenn Sie nichts dagegen haben, Plugins (und den zusätzlichen Komfort, der oft damit verbunden ist), bieten sowohl das unbeeinträchtigte Plugin von Tim Pope als auch mein LineJuggler-Plugin]e / [eZuordnungen zum Verschieben von Linien (und einige weitere) Linien)).

Ingo Karkat
quelle
36

Das einfachste ist: :m+oder :m-2was ist die Abkürzung für, :movewie Ingo vorgeschlagen hat.

Oder verwenden Sie den visuellen Modus ( V), indem Sie die Linie ( d/ x) ausschneiden und dann einfügen ( p- unter dem Cursor, Püber dem Cursor), nachdem Sie den Cursor vor dem Einfügen an die richtige Stelle bewegt haben (zusammengefasst ist dies Vxp/ Vdp).

Wenn Sie im visuellen Modus mehrere Zeilen verschieben, müssen Sie :m '>+1(um eine Zeile nach unten zu verschieben) oder :m '<-2(um eine Zeile nach oben zu verschieben) verwenden.


Hier ist ein Beispiel für eine nützliche Zuordnung ( 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>

Dies ähnelt Sublime Text ( Win / OSX ).

Hier einige Vorschläge von 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

Drücken Sie im normalen Modus oder im Einfügemodus Alt-j, um die aktuelle Zeile nach unten zu verschieben, oder Alt-k, um die aktuelle Zeile nach oben zu verschieben.

Nachdem Sie einen Zeilenblock visuell ausgewählt haben (z. B. durch Drücken von V und anschließendes Abwärtsbewegen des Cursors), drücken Sie Alt-j, um den gesamten Block nach unten zu verschieben, oder Alt-k, um den Block nach oben zu verschieben.

Siehe auch:

Kenorb
quelle
2
+1 für den Vim-Wikia-Link. Dort ein paar Dinge gelernt.
Gonçalo Ribeiro
Sie wissen nicht , warum, aber sie arbeiten sehr gut in Gvim, aber nicht arbeiten , wie in Terminal vim erwartet (es scheint das Problem der tmux ist).
CodyChan
11

Wenn ich eine Zeile mit der obigen Zeile tauschen möchte, gehe ich normalerweise folgendermaßen vor

ddkP

Erläuterung

  • dd löscht die Zeile und fügt sie dem Standardregister hinzu.
  • k bewegt sich eine Linie nach oben (j bewegt sich eine Linie nach unten)
  • P wird über der aktuellen Zeile eingefügt
venkatvb
quelle
3
Verwenden Sieddp
Qinjie
4

FWIW, hier ist, was ich seit Jahren verwendet habe. Es verschiebt die aktuelle Zeile im normalen Modus nach oben und unten oder die Auswahl im visuellen Modus, während der Einzug automatisch angepasst wird.

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
romainl
quelle