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

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

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


当前回答

只需将此代码添加到.vimrc(或.gvimrc)

nnoremap <A-j> :m+<CR>==
nnoremap <A-k> :m-2<CR>==
inoremap <A-j> <Esc>:m+<CR>==gi
inoremap <A-k> <Esc>:m-2<CR>==gi
vnoremap <A-j> :m'>+<CR>gv=gv
vnoremap <A-k> :m-2<CR>gv=gv

其他回答

在命令模式下,将光标定位在要向下移动的行上,然后

ddp

解释: Dd将当前行删除到常规缓冲区 p将它放回游标位置之后,如果是整行,则放回下一行。

在许多文档中,关于命令p和p有一些混淆。 实际上p粘贴AFTER游标,p粘贴AT游标。

将以下文件放到.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/您的查询/正常ddp或:g/您的查询/ m -1 向下:g/您的查询/正常ddp或:g/您的查询/ m +1

你的光标可以在任何一行上。行号被打开以方便地识别行位置。 第一种情况:假设我在第7行,想把第3行移到第9行,把它移到下一页。

:3m 9完成移动。

第二种情况:我仍然在第7行,但现在我想移动第9行到第3行,把它带到页面上。

:9m 2完成移动。注意,目的地使用2而不是3。

注意:光标会移动到移动目标位置。如果我需要返回第7行,只需使用:7

第三种情况:移动一系列的行。比如,从9到12,第九行到第三行

:9,12米2完成移动。 图片:一个终端游戏围栏与Vim打开移动实验

一个简单的解决方案是在你的.vimrc中加入这些行:

nmap <C-UP> :m-2<CR>  
nmap <C-DOWN> :m+1<CR>