Schnellere Methode zum Verschieben eines Textblocks

25

So kopiere ich normalerweise einen Text- oder Codeblock:

  1. Wählen Sie den Block mit Visual mode ( V) und löschen Sie ihn mit d; oder wenn es nur eine einzelne Zeile ist, verwenden Sie einfach dd.
  2. Gehe dorthin , wo ich den Text haben möchte, ich bin zu dumm, um mich an den Unterschied zwischen pund zu erinnern P, also bekomme ich das ungefähr 50% der Zeit hin. (Wenn ich es falsch verstehe: mache einen Versuch noch einmal rückgängig).
  3. Manchmal muss der Einzug angepasst werden, also gehe ich erneut in den visuellen Modus Vund wähle denselben Block erneut aus und verwende >oder <, um dies zu beheben.

Gibt es einen einfacheren Weg? In einigen Editoren habe ich gesehen, dass Sie einen Textblock sozusagen "aufgreifen" und verschieben können. Hier ist ein Beispiel von Emacs (aber ich habe es auch in anderen Editoren gesehen):

Emacs

Oder gibt es vielleicht einen anderen (noch besseren) Weg?

Martin Tournoij
quelle
Über das Einrückungsproblem können Sie es lösen, indem Sie mit ]poder [panstatt poder einfügen P. Auf diese Weise wird der Block, den Sie einfügen, automatisch eingerückt.
Gonçalo Ribeiro
Vielleicht möchten Sie sich den Screencast von Drew Neil Bubbling Text ansehen, der die Verwendung von Vim-Unimpaired empfiehlt .
Hotschke

Antworten:

13

Dafür gibt es ein Plugin: dragvisuals.vim .

Standardmäßig werden keine Schlüssel gebunden, das müssen Sie also selbst tun. Ich ordne sie gerne Control+ zu 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')

Es kommt auch mit einem Bonusschlüssel zum Duplizieren der aktuellen Auswahl:

xmap <expr> D DVB_Duplicate()

Vorteile dieses Plugins gegenüber den anderen Antworten:

  • Verschwindet kein Text, wenn Sie versuchen, weiter nach oben als in der ersten Zeile zu springen.
  • Die Datei wird erweitert, wenn Sie sich unter der letzten Zeile befinden.
  • Bewegen nach links / rechts funktioniert etwas besser.

Ein weiterer nützlicher Trick, um dies zu ergänzen, sind die folgenden Tastenkombinationen:

xnoremap > >gv
xnoremap < <gv

Dadurch wird die letzte visuelle Auswahl nach der Verwendung >im visuellen Modus erneut ausgewählt, sodass Sie die Ausrichtung einfacher anpassen können (Sie können auch die Pfeiltasten verwenden, dies verschiebt sie jedoch um ein Zeichen und nicht um ein Zeichen shiftwidth).

Jay Thompson
quelle
1
Es gibt ein weiteres Plugin dafür, das der Autor meines vorgeschlagenen Plugins als "eine wesentlich verbesserte Überarbeitung meiner eigenen dragvisuals.vim" beschreibt: github.com/zirrostig/vim-schlepp
Jay Thompson
8

Für Schritt 3 können Sie gv=stattdessen verwenden ( =bedeutet Einzug und gvbedeutet "Letzte visuelle Auswahl erneut auswählen").

Für das Emacs-Verhalten wäre es ziemlich einfach, einige Zuordnungen in Ihrer .vimrc-Datei hinzuzufügen:

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

Sie können dann die Aufwärts- und Abwärtspfeiltasten verwenden, um sich in einer visuellen Linienauswahl zu bewegen. (Natürlich können Sie auch verschiedene Tasten zuordnen, wenn Sie Pfeile hassen.)

(Sie können dies mit einer normalen visuellen Auswahl tun und sie auch nach links und rechts verschieben: vnoremap <left> dhPgvhohound vnoremap <right> dpgvlolo.)

Türknauf
quelle
gvGeht zur letzten visuellen Auswahl, die in diesem Fall der Absatz wäre, der gelöscht wurde. Was vermisse ich?
Robert Smith
4

Sie können einige Tasten neu zuordnen, um Linien zu verschieben. Zum Beispiel Pfeile nach oben und unten, wenn Sie es gewohnt sind, sich durch zu bewegen hjkl.

ZB auf .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, normaler Befehl zum Verschieben einer Linie

+1oder -2um eine Linie nach oben oder unten zu kennzeichnen (-1 hält die Linie an der gleichen Stelle)

gvum denselben Text im VISUALModus erneut auszuwählen

Diese Lösung greift nicht in die Register ein, sodass kopierter Text weiterhin verfügbar ist. Außerdem wird der Code neu formatiert, um den richtigen Einzug festzulegen.

Khelben
quelle
Das ist schön, aber nicht für mich, da ich es nicht mag =(es ändert sich oft zu sehr die Formatierung ohne Bezug für mich).
Martin Tournoij
3

Es gibt nur wenige Plugins dafür, aber ich bevorzuge Tim Popes unbeeinträchtigten ( Github ) (Ingo Karkat LineJuggler ist ähnlich).

Sie wählen Ihren Textblock visuell aus und verschieben ihn dann ]e(zum Austauschen) nach unten ( [ein die andere Richtung). Verwenden Sie ., um die Aktion zu wiederholen (Sie haben repeat.vim installiert, nicht wahr? ). Wenn Sie zu weit gehen, machen Sie einfach über rückgängig u.

Nun persönlich denke ich, pund es Psind so allgemeine Befehle, dass es am besten ist, sie zu lernen, bevor schlechte Gewohnheiten geschaffen werden. Dann könnten Sie verwenden ]p, um am gleichen Einzug einzufügen. Wenn Sie >pungestört arbeiten, können Sie einen Einrückungsgrad tiefer einfügen oder ihn =peinfügen und neu formatieren.

Wenn Sie Probleme beim Erinnern haben pund Pdann könnte es Ihnen helfen , sie in Bezug auf die denken , ound OBefehle , die eine Art Symmetrie ist.

Wie andere angemerkt haben, können Sie gvmit eine visuelle Auswahl erneut auswählen. Wenn Sie jedoch nur Text einfügen / einfügen, haben Sie Ihre visuelle Auswahl verloren. Ärgern Sie sich nicht , weil jede Änderung (und yanks!) Gesetzt '[und ']um den geänderten Bereich. So können Sie über >'](Lesen: .Nach rechts verschieben bis zum Ende der letzten Änderung) einrücken und mit den Pfeiltasten den Einzug wiederholen, bis Sie den Text an der richtigen Stelle haben.

Weitere Hilfe finden Sie unter:

:h p
:h P
:h ]p
:h o
:h O
:h .
:h u
:h >
:h ']
:h gv
Peter Rincker
quelle
2

Wenn Sie die Zeilennummer kennen, in die Sie den Textblock verschieben möchten, können Sie mit dem :moveBefehl einen Bereich oder eine visuelle Auswahl verwenden , um den Block dorthin zu verschieben.

Zum Beispiel, wenn ich die folgende Datei habe:

1 aaa
2 bbb
3 ccc
4 ddd

und ich möchte die Linie von a's nach der Linie von c's verschieben, ich setze den Cursor auf die Linie von a's und gebe ein :m3, und die Linie wird dann verschoben.

Dies funktioniert auch mit +/- Offsets. Im obigen Beispiel könnte das gleiche Ergebnis erzielt werden, wenn :m+2die Zeile 2 nach unten verschoben wird.

Bei Textblöcken besteht der einzige Unterschied darin, einen Bereich oder eine Auswahl hinzuzufügen. Um die Zeilen aaa und bbb an das Ende der Datei zu verschieben, verwenden Sie einen Befehl wie :1,2m$($ = letzte Zeile) oder wählen Sie die Zeilen und visuell aus :m$.

Kacken
quelle
1
Weitere Tipps finden :moveSie unter vim.wikia.com/wiki/Moving_lines_up_or_down oder im Tipp 29 Duplizieren oder Verschieben von Zeilen mit den Befehlen ': t' und ': m' im Buch Practical Vim von D. Neil.
Hotschke