在vim可视模式下移动多行

时间:2016-12-11 09:08:46

标签: vim text text-editor vim-plugin

按下 v 并在中输入可视模式后,我想将这些行向上移动几行。解决方案discussed here不适合我,因为我想在视觉上移动,即我不想输入 m + n因为我不知道n的价值。 是否有键盘快捷键可以让我按下按键顺序,在视觉模式下按下或向上移动选定的行?

Sample with selected lines

1 个答案:

答案 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_=)并重新选择我们的行。

demo

Bonus普通模式映射

" 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>==