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

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

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


当前回答

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

ddp

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

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

其他回答

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

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

可以使用命令:

:g/^/move 0

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

当你在vim中点击命令:help move时,结果如下:

(范围):m[爱]{地址 } *: m * *:莫* *:* * E134 *移动 移动[range]给出的线到线的下方 由{address}给出。

例:移动当前行一行=>:m+1。

例:将数字为100的线移到数字为80的线下面=>:100 m 80。

例:将数字为100的线移到数字为200的线下面=>:100 m 200。

例如:将数字在[100,120]以内的行移动到数字为200 =>:100,120 m 200的行下面。

只需将此代码添加到.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

这是一个在我的机器上工作的解决方案 :运行VIM 8.1的MacBook Pro

这些命令不会删除缓冲区顶部或底部的行。

使用Alt-J和Alt-K输出的实际符号是一种变通方法,因为它们的键代码在我的环境中映射不正确。

把这个放在旧的.vimrc中,看看是否适合你。

" Maps Alt-J and Alt-K to macros for moving lines up and down
" Works for modes: Normal, Insert and Visual
nnoremap ∆ :m .+1<CR>==
nnoremap ˚ :m .-2<CR>==
inoremap ∆ <Esc>:m .+1<CR>==gi
inoremap ˚ <Esc>:m .-2<CR>==gi
vnoremap ∆ :m '>+1<CR>gv=gv
vnoremap ˚ :m '<-2<CR>gv=gv