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

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

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


当前回答

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

:3m 9完成移动。

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

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

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

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

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

其他回答

最简单的方法和vscode一样。将下面的行添加到.vimrc

"Ctrl+Shift+up move line above"
nmap <C-S-Up> :m -2<CR>

"Ctrl+Shift+down move line below
nmap <C-S-Down> :m +1<CR>

这招对我很管用:

http://vim.wikia.com/wiki/Moving_lines_up_or_down_in_a_file

顺便说一句,如果你想使用ALT+some_key,而你的终端(urxvt这样做)拒绝遵守,你应该在你的.vimrc中输入如下内容:

" For moving lines (^] is a special character; use <M-k> and <M-j> if it works)
nnoremap ^]k mz:m-2<CR>`z==
inoremap ^]j <Esc>:m+<CR>==gi
inoremap ^]k <Esc>:m-2<CR>==gi
vnoremap ^]j :m'>+<CR>gv=`<my`>mzgv`yo`z
nnoremap ^]j mz:m+<CR>`z==
vnoremap ^]k :m'<-2<CR>gv=`>my`<mzgv`yo`z

其中^]是代表ALT键的单个字符。 要输入该字符,在Vim中使用C+v, Esc(在Windows中使用C+q, Esc)。

向上移动一行:ddkP

向下移动一行:ddp

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

ddp

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

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

正是你在这些插件中寻找的:

https://github.com/vim-scripts/upAndDown https://github.com/matze/vim-move