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

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

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


当前回答

对我来说,是ddkkp(而不是用大写P的ddkP,这也可以)。

其他回答

将以下内容添加到~/。Vimrc文件(确保你没有映射n,m)

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

现在按n键将向下移动一行,m键将向上移动一行。

: 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 H ddkkp
noremap N ddp

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

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

ddp

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

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

如果你想在匹配特定搜索的多行上执行此操作:

向上::g/您的查询/正常ddp或:g/您的查询/ m -1 向下:g/您的查询/正常ddp或:g/您的查询/ m +1