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).


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)).


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:


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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.