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?

1voto

Baranina Punkte 35

Vim plugin unimpaired.vim [e und ]e

1voto

Gleb Sabirzyanov Punkte 755

Für den Fall, dass Sie dies für mehrere Zeilen tun wollen, die einer bestimmten Suche entsprechen:

  • Auf: :g/Your query/ normal ddp o :g/Your query/ m -1
  • Daunen :g/Your query/ normal ddp o :g/Your query/ m +1

1voto

kai Punkte 1213

Können den Befehl verwenden:

:g/^/move 0

Hinweis: https://vi.stackexchange.com/questions/2105/how-to-reverse-the-order-of-lines

0voto

Ji Han Punkte 611

:m.+1 oder :m.-2 würde reichen, wenn Sie eine einzelne Zeile verschieben. Hier ist mein Skript zum Verschieben mehrerer Zeilen. Im visuellen Modus werden mit Alt-up/Alt-down die Zeilen, die die visuelle Auswahl enthalten, um eine Zeile nach oben/unten verschoben. Im Einfügemodus oder im normalen Modus verschiebt Alt-hoch/alt-runter die aktuelle Zeile, wenn kein Zählpräfix angegeben ist. Wenn ein Zählpräfix angegeben ist, verschiebt Alt-oben/Alt-unten so viele Zeilen ab der aktuellen Zeile um eine Zeile nach oben/unten.

function! MoveLines(offset) range
    let l:col = virtcol('.')
    let l:offset = str2nr(a:offset)
    exe 'silent! :' . a:firstline . ',' . a:lastline . 'm'
        \ . (l:offset > 0 ? a:lastline + l:offset : a:firstline + l:offset)
    exe 'normal ' . l:col . '|'
endf

imap <silent> <M-up> <C-O>:call MoveLines('-2')<CR>
imap <silent> <M-down> <C-O>:call MoveLines('+1')<CR>
nmap <silent> <M-up> :call MoveLines('-2')<CR>
nmap <silent> <M-down> :call MoveLines('+1')<CR>
vmap <silent> <M-up> :call MoveLines('-2')<CR>gv
vmap <silent> <M-down> :call MoveLines('+1')<CR>gv

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