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?

796voto

JaredPar Punkte 699699

Wenn ich eine Zeile mit der Zeile darüber austauschen möchte, gehe ich normalerweise wie folgt vor

ddkP

Erläuterung

  • dd löscht die Zeile und fügt sie dem Standardregister hinzu.
  • k bewegt sich eine Zeile nach oben (j würde sich eine Zeile nach unten bewegen)
  • P fügt oberhalb der aktuellen Zeile ein

373voto

Serg Punkte 2663

Angenommen, der Cursor befindet sich auf der Zeile, die Sie verschieben möchten.

Auf- und Abwärtsbewegung: :m für Umzug

:m +1 - geht 1 Zeile nach unten

:m -2 - 1 Zeile nach oben gehen

(Hinweis: Sie können +1 durch eine beliebige Zahl ersetzen, je nachdem, um wie viele Zeilen Sie sie nach oben oder unten verschieben möchten, d. h. +2 würde sie um 2 Zeilen nach unten verschieben, -3 würde sie um 2 Zeilen nach oben verschieben)

Um zu einer bestimmten Zeile zu gelangen

:set number - Anzeige von Zahlenzeilen (leichter zu erkennen, wohin man sie verschiebt)

:m 3 - Verschieben Sie die Zeile nach der 3. Zeile (ersetzen Sie die 3 durch eine beliebige Zeile)

Verschieben mehrerer Zeilen:

V (d.h. Shift - V ) und bewegen Sie den Cursor nach oben und unten, um mehrere Zeilen in VIM auszuwählen

einmal ausgewählt, drücken Sie : und führen Sie die oben genannten Befehle aus, m +1 usw.

102voto

jacobsimeon Punkte 1874

Eine Zeile nach oben verschieben: ddkP

Eine Zeile nach unten verschieben: ddp

97voto

Mykola Golubyev Punkte 54937

Fügen Sie das Folgende in Ihre .vimrc ein, um die Aufgabe zu erledigen

noremap <c-s-up> :call feedkeys( line('.')==1 ? '' : 'ddkP' )<CR>
noremap <c-s-down> ddp

Das Verschwinden der Zeile sieht nach einem Vim-Fehler aus. Ich habe einen Hack eingebaut, um ihn zu vermeiden. Wahrscheinlich gibt es eine genauere Lösung.

Update

Es gibt eine Menge unerklärlicher Schwierigkeiten, wenn man nur Vim-Kombinationen verwendet. Dazu gehören fehlende Zeilen und zusätzliche Zeilensprünge.

Hier ist also die Skriptlösung, die entweder in .vimrc oder ~/.vim/plugin/swap_lines.vim platziert werden kann

function! s:swap_lines(n1, n2)
    let line1 = getline(a:n1)
    let line2 = getline(a:n2)
    call setline(a:n1, line2)
    call setline(a:n2, line1)
endfunction

function! s:swap_up()
    let n = line('.')
    if n == 1
        return
    endif

    call s:swap_lines(n, n - 1)
    exec n - 1
endfunction

function! s:swap_down()
    let n = line('.')
    if n == line('$')
        return
    endif

    call s:swap_lines(n, n + 1)
    exec n + 1
endfunction

noremap <silent> <c-s-up> :call <SID>swap_up()<CR>
noremap <silent> <c-s-down> :call <SID>swap_down()<CR>

24voto

Gajendra Jena Punkte 440

Fügen Sie folgendes in die Datei ~/.vimrc ein (stellen Sie sicher, dass Sie keine Zuordnung für n,m haben)

nmap n :m +1<CR>
nmap m :m -2<CR>

jetzt drücken n Taste wird eine Zeile nach unten verschoben und m wird eine Zeile nach oben verschoben.

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