在vim的可视模式下移动多行

13
中按下v并进入可视模式后,我想将这些行上移几行。这篇讨论中的解决方案不适用于我,因为我想在可视模式下移动行,也就是说,我不想输入m:+n,因为我不知道n的值。是否有键盘快捷键可以让我通过按键序列将所选行在可视模式下每次向上或向下移动一行?

包含所选行的示例

1个回答

25

虽然没有内置的命令可以实现该功能,但是您可以使用: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 +箭头,我只需要键入<Alt+Up>吗? - Konrad
1
理想情况下是可以的,但 <Alt> 键并不可靠。 - romainl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接