在 vim 视觉模式下移动多行

Moving multiple lines in vim visual mode

在按下 v 并进入 可视模式 之后 , I would like to move those lines up a few rows. The solution discussed here 不适合我,因为我想移动行 视觉上, 即我不想像我那样输入 m:+n不知道 n 的值。 是否有键盘快捷键可以让我在可视模式下通过按按键序列一次向下或向上移动 选定的 行?

没有用于此的内置命令,但您可以使用 :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>==