433 Stimmen

Ganze Zeile in Vim nach oben und unten verschieben

In Notepad++ kann ich Folgendes verwenden Ctrl + Shift + Up / Down um die aktuelle Zeile nach oben oder unten zu verschieben. Gibt es einen ähnlichen Befehl wie diesen in Vim? Ich habe endlose Anleitungen durchgesehen, aber nichts gefunden.

Wenn das nicht der Fall ist, wie kann ich die Aktion an diese Tastenkombination binden?

Edit: Mykolas Antwort funktioniert für alle Zeilen, außer für die am Anfang und Ende des Puffers. Wenn man die erste Zeile nach oben oder die unterste Zeile nach unten verschiebt, wird die Zeile gelöscht, und wenn man die unterste Zeile nach oben verschiebt, springt sie zunächst um zwei Leerzeichen, wie ein Bauer! Kann jemand Verbesserungsvorschläge machen?

5voto

ako Punkte 1833

Wenn Sie den Befehl :help move in vim Hier ist das Ergebnis:

:[range]m[ove] {address} *:m* *:mo* *:move* *E134* Move the lines given by [range] to below the line given by {address}.

z.B: Aktuelle Zeile eine Zeile nach unten verschieben => :m+1 .

z.B: Zeile mit Nummer 100 unter die Zeile mit Nummer 80 verschieben => :100 m 80 .

z.B: Zeile mit Nummer 100 unter die Zeile mit Nummer 200 verschieben => :100 m 200 .

z.B: Zeilen mit Nummer innerhalb [100, 120] unter die Zeile mit Nummer 200 verschieben => :100,120 m 200 .

4voto

Für mich, ddkkp tat es (anstelle von ddkP mit einem groß geschriebenen P, was auch funktionieren würde).

3voto

john-jones Punkte 7111

Ich füge das Folgende am Ende meiner .vimrc-Datei ein:

noremap H ddkkp
noremap N ddp

Mit 'H' und 'N' wird die aktuelle Zeile nach oben bzw. unten verschoben.

2voto

Nick Sugar Punkte 349

Hier ist eine Lösung, die auf meinem Rechner funktioniert : MacBook Pro mit VIM 8.1

Diese Befehle löschen nicht die Zeilen am Anfang oder Ende des Puffers.

Die Verwendung der tatsächlichen Symbole, die Alt-J und Alt-K ausgeben, ist eine Abhilfe für ihre Tastencodes, die in meiner Umgebung nicht richtig zugeordnet werden.

Wirf dies in den alten .vimrc und sehen Sie, ob es für Sie funktioniert.

" Maps Alt-J and Alt-K to macros for moving lines up and down
" Works for modes: Normal, Insert and Visual
nnoremap  :m .+1<CR>==
nnoremap  :m .-2<CR>==
inoremap  <Esc>:m .+1<CR>==gi
inoremap  <Esc>:m .-2<CR>==gi
vnoremap  :m '>+1<CR>gv=gv
vnoremap  :m '<-2<CR>gv=gv

1voto

Hier ist eine vereinfachte Version für MacVim, die die Beispiele aus dem Wikia-Artikel verwendet (siehe Link von Waffe Kommentar).

" Move selection up/down (add =gv to reindent after move)
:vmap <D-S-Up> :m-2<CR>gv
:vmap <D-S-Down> :m'>+<CR>gv

Ich verwende nur die Variante der Blockauswahl, denn es genügt die Umschalttaste-V, um die aktuelle Zeile auszuwählen, und optional der Cursor nach oben/unten, um einige weitere Zeilen auszuwählen.

Entsprechend den obigen Tastenkombinationen wird durch Drücken von Cmd-Shift-Up/Down die Blockauswahl nach oben/unten verschoben. "D" ist die Befehlstaste in MacVim, für Windows versuchen Sie "C" (Control) oder "A" (Alt) (z.B. <C-A-f> wäre Control Alt f).

Der Wikia-Artikel fügt "=gv" zu diesen hinzu, was zur Folge hat, dass die Einrückung des Blocks nach dem Verschieben auf der Grundlage des umgebenden Textes angepasst wird. Das ist verwirrend, also habe ich es entfernt und stattdessen Tastenkombinationen zum schnellen Einrücken der Auswahl hinzugefügt.

" Indent selection left/right (Cmd Shift Left/Right is used for Tab switching)
:vmap <D-A-Left> <gv
:vmap <D-A-Right> >gv

Das Gleiche kann mit << und >> gemacht werden, aber die Auswahl würde verloren gehen. Mit den obigen Tastenkombinationen kann der Block mehrfach eingerückt und trotzdem verschoben werden, da die Auswahl erhalten bleibt.

Mein MacVim ist so konfiguriert, dass er die Tabs mit Cmd-Shift-Left/Right umschaltet, also habe ich Cmd-Alt-Left/Right verwendet.

Hier ist die Tabulator-Umschaltung für MacVim (in .gvimrc mit dem Rest oben):

:macm Window.Select\ Previous\ Tab key=<D-S-Left>
:macm Window.Select\ Next\ Tab key=<D-S-Right>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X