按下 v 并在vim中输入可视模式后,我想将这些行向上移动几行。解决方案discussed here不适合我,因为我想在视觉上移动行,即我不想输入 m : + n
因为我不知道n
的价值。 是否有键盘快捷键可以让我按下按键顺序,在视觉模式下按下或向上移动选定的行?
答案 0 :(得分:8)
没有内置命令,但您可以使用: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
因此,右前命令是:m-2
。
当前行不是一个好的起点,因为它是我们选择的第一行,但我们可以使用'>
标记(视觉选择的结束):
aaa
aaa
current line > bbb <
bbb < visual selection
end of visual selection > bbb <
end of visual selection + 1 > ccc
ccc
因此,右前命令是: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>==