虽然没有内置的命令可以实现该功能,但是您可以使用:help :move
来创建一个。
" move selected lines up one line
xnoremap <somekey> :m-2<CR>
" move selected lines down one line
xnoremap <otherkey> :m'>+<CR>
我们想要的是将选择区域移动到当前行上方和上两行之间:
current line - 2 > aaa
current line - 1 > aaa
current line > bbb <
bbb < visual selection
bbb <
ccc
ccc
因此正确的ex命令是:m-2
。
当前行不是一个好的起点,因为它是我们选择中的第一行,但我们可以使用'>
标记(视觉选择的结尾):
aaa
aaa
current line > bbb <
bbb < visual selection
end of visual selection > bbb <
end of visual selection + 1 > ccc
ccc
正确的ex命令是:m'>+1
。
但是我们丢失了所选内容,所以在再次移动所选内容之前必须使用gv
将其恢复。不太好。
" move selected lines up one line
xnoremap <somekey> :m-2<CR>gv
" move selected lines down one line
xnoremap <otherkey> :m'>+<CR>gv
我们只需将gv
附加到先前映射的末尾。很好。但是,我们如何在进行此操作时修复缩进?
" move selected lines up one line
xnoremap <somekey> :m-2<CR>gv=gv
" move selected lines down one line
xnoremap <otherkey> :m'>+<CR>gv=gv
将=gv
添加到我们的映射中可以修复缩进问题(:help v_=
)并重新选择我们的行。
" move current line up one line
nnoremap <somekey> :<C-u>m-2<CR>==
" move current line down one line
nnoremap <otherkey> :<C-u>m+<CR>==
<Alt+Up>
吗? - Konrad<Alt>
键并不可靠。 - romainl