在notepad++中,我可以使用Ctrl + Shift + Up / Down来上下移动当前行。在Vim中有类似的命令吗?我翻遍了无数的指南,但一无所获。

如果没有,我如何将动作绑定到该键组合?

编辑:Mykola的答案适用于所有行,除了缓冲区的开头和结尾。向上移动第一行或向下移动一行会删除该行,当向上移动一行时,它最初会跳跃两个空格,就像棋子一样!谁能提供一些改进吗?


当前回答

我在.vimrc文件的末尾放了以下内容:

noremap H ddkkp
noremap N ddp

现在H和N分别上下移动电流线。

其他回答

如果我想与上面的一行交换一行,我通常会这样做

ddkP

解释

Dd将删除该行并将其添加到默认寄存器中。 K向上移动一行(j向下移动一行) P会粘贴到当前行的上方

: m。+1或m。如果只移动一条线,则是-2。下面是移动多行的脚本。在可视模式下,Alt-up/Alt-down将包含可视选择的行向上/向下移动一行。在插入模式或普通模式下,如果没有给定计数前缀,Alt-up/Alt-down将移动当前行。如果有一个计数前缀,Alt-up/Alt-down将从当前行开始向上/向下移动一行。

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

将以下文件放到.vimrc中来完成这项工作

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

行消失看起来像一个Vim错误。我装了个黑客来避免。也许有更精确的解决方法。

更新

仅仅使用Vim组合就有很多无法解释的困难。这些是行缺失和额外的行跳转。

这里是脚本解决方案,可以放在.vimrc或~/.vim/plugin/swap_lines.vim中

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>

可以使用命令:

:g/^/move 0

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

假设光标在您想要移动的行上。

上下移动: :m表示移动

:m +1 -向下移动一行

:m -2 -向上移动1行

(注意,你可以用任何数字替换+1,这取决于你想要向上或向下移动多少行,即+2将向下移动2行,-3将向上移动2行)

移动到特定的线上

:set number -显示数字线(更容易看到你移动到哪里)

:m 3 -在第三行之后移动行(将3替换为任何你想要的行)

移动多行:

V(即Shift-V),并上下移动courser在VIM中选择多条行

一旦选中,点击:并运行上面的命令,m +1等