Wie tausche ich zwei Zeilen in vim?

91

Ich habe das:

pick 887b66f add 222 Dziewiecsil to flowers new title
pick dc331cb new name of beginning commit

Und ich möchte das bekommen:

pick dc331cb new name of beginning commit
pick 887b66f add 222 Dziewiecsil to flowers new title

Gibt es eine Möglichkeit, dies mithilfe von Tastaturkürzeln schnell zu tun?

Bartłomiej Semańczyk
quelle
Sie können einen anderen Editor verwenden, wenn Sie mit vim nicht vertraut sind. Sie können den Editor für Git nur mit entweder git config --global core.editor <whatever>oder für viele Dinge gleichzeitig (einschließlich Git) konfigurieren , indem Sie ihn export EDITOR=<whatever>in Ihren .bashrc.
Sven Marnach

Antworten:

155

Geben Sie ddpim Befehlsmodus ein, um die aktuelle Zeile durch die nächste zu ersetzen.

  • dd - Zeile löschen (in anderen Editoren eigentlich als cut bezeichnet) und im Register speichern
  • p - Zeile aus dem Register einfügen
Sven Marnach
quelle
3
Bewegen Sie den Cursor in die erste Zeile und geben Sie ein ddp. Wenn Sie sich noch nicht im Befehlsmodus befinden, drücken Sie Esc, um in den Befehlsmodus zu gelangen.
Sven Marnach
32
ddlöscht die aktuelle Zeile nach dem Kopieren in ein "Register". pkopiert ("setzt") den Inhalt des Registers nach der aktuellen Zeile in Ihren Puffer . Ebenso können Sie zwei Zeichen mit xpoder zwei Wörter mit austauschen dwwP.
Keith Thompson
@KeithThompson leider nicht so einfach, zwei Wörter zu tauschen.
CS
@CS Beziehen Sie sich auf die Tatsache, dass dwwPdies nicht auf die gleiche Weise funktioniert, wenn sich die beiden Wörter am Ende einer Zeile befinden? (Und das Tauschen des letzten Wortes in einer Zeile mit dem ersten Wort in der folgenden Zeile ist noch schwieriger.)
Keith Thompson
1
@KeithThompson Ja, obwohl ich mich nach meinem Kommentar irgendwie schlecht gefühlt habe, weil das ein wörtlicher Randfall ist;)
CS
50

ddlöscht die aktuelle Zeile, dann können Sie die entfernte Zeile mit einfügen p. Es gibt aber auch einen anderen Weg m. Mit können mSie Linien bewegen, dh

:m 1 verschiebt die aktuelle Zeile nach Zeile 1

:m 0 verschiebt die aktuelle Zeile nach oben

:m $ verschiebt die aktuelle Zeile nach unten

Platzieren Sie in Ihrem Beispiel den Cursor in der ersten Zeile und geben Sie ein :m $

Weitere Informationen: http://vim.wikia.com/wiki/Moving_lines_up_or_down

Herr Eigenbart
quelle
1
Vielen Dank für die Erklärung für nicht vim "Eingeborene" :-)
Bruno Bieri
1
Dies ist die Antwort, nach der ich auch gesucht habe, um mein Wissen über vim zu erweitern.
Phemelo Khetho
Vielen Dank! Dies ist die Antwort, nach der ich gesucht habe. Dies kann noch einfacher werden, wenn im visuellen Modus mehrere Zeilen gleichzeitig gewischt werden.
Kareem Jeiroudi
7

Trotz der Tatsache , dass diese Frage ist ziemlich alt und als beantwortet markiert, würde Ich mag die Antwort zu erweitern , indem er sagte , dass Sie normalen Modus Befehle verwenden können, die von bereitgestellt wurden Sven Marnach mit nnoremapetwa so:

:nnoremap <C-Up> <Up>ddp<Up>
:nnoremap <C-Down> ddp

Auf diese Weise können Sie Zeilen mit Ctrl+ Upund Ctrl+ Downin Ihrer Datei verschieben. Dies überschreibt jedoch das @"Register, in dem Ihre zuletzt kopierte Zeichenfolge / Wort / Buchstabe / etc. Gespeichert wird. Durch Hinzufügen von "(reg) before ddund pBefehlen können wir dies beheben:

:nnoremap <C-Up> <Up>"add"ap<Up>
:nnoremap <C-Down> "add"ap

Hier fügen wir "avor dem Löschen Befehle hinzu und fügen sie ein, um unsere Zeile im @aRegister zu speichern , damit Ihr Standardkopierregister nicht überschrieben wird. Es kann jedoch sein, dass es den Inhalt des @aRegisters überschreibt (wer weiß, aber Sie können es für etwas Wichtiges in Ihrem Anwendungsfall verwenden, aber dieser Schritt ist etwas paranoid, Sie können es überspringen, wenn Sie möchten). Lassen Sie uns das auch beheben:

:nnoremap <silent><C-Up> :let save_a=@a<Cr><Up>"add"ap<Up>:let @a=save_a<Cr>
:nnoremap <silent><C-Down> :let save_a=@a<Cr>"add"ap:let @a=save_a<Cr>

( <silent>Wird benötigt, um zu verhindern, dass unsere Befehle in der Nachrichtenzeile unten wiedergegeben werden.)

Jetzt haben wir zwei Zuordnungen, mit denen wir Zeilen innerhalb der Datei mit Tastaturkürzeln verschieben können. Sie können Schaltflächen neu definieren, ich benutze Alt+ j/ k, was wäre <A-j>und <A-k>für diese Befehle. Allerdings unterstützen nicht alle Terminalemulatoren die Alt-Tastenzuordnungen AFAIK.

Andrey Orst
quelle
2

Beispiel:

  1. one
> 2. two

mit :m-2, Schalter (aktuelle Zeile - 2)

> 2. two
  1. one

mit :m+1Schalter (aktuelle Leitung + 1)

  1. one
> 2. two

Sie können dies zuordnen, wenn Sie möchten.

Entwickler
quelle
Dies ist die bessere Antwort als die Standardantwort
Alex Bin Zhao