如何在vim中交换两行?

时间:2015-01-27 19:15:40

标签: vim

我有这个:

pick 887b66f add 222 Dziewiecsil to flowers new title
pick dc331cb new name of beginning commit

我希望得到这个:

pick dc331cb new name of beginning commit
pick 887b66f add 222 Dziewiecsil to flowers new title

有没有办法使用键盘快捷键快速完成此操作?

5 个答案:

答案 0 :(得分:107)

要将当前行与下一行交换,请在命令模式下键入ddp

  • dd - 删除行(实际上在其他编辑器中称为剪切)并将其保存在寄存器
  • p - 从缓冲区粘贴行

答案 1 :(得分:36)

dd删除当前行,然后您可以使用p粘贴删除的行。使用m还有另一种方法。使用m,您可以移动线条,即

:m 1将在第1行之后移动当前行

:m 0会将当前行移至顶部

:m $会将当前行移至底部

在您的示例中,将光标放在第一行并键入:m $

更多信息:http://vim.wikia.com/wiki/Moving_lines_up_or_down

答案 2 :(得分:3)

示例:

  1. one
> 2. two

使用:m-2,切换(当前行-2)

> 2. two
  1. one

使用:m+1开关(当前行+ 1)

  1. one
> 2. two

您可以根据需要对此进行映射。

答案 3 :(得分:2)

尽管问题很老并且标记为已回答,但我想通过说您可以使用由Sven Marnach nnoremap提供的普通模式命令来扩展答案。像这样:

:nnoremap <C-Up> <Up>ddp<Up>
:nnoremap <C-Down> ddp

这将允许您在文件中使用 Ctrl + Up Ctrl + Down 移动线条。但是这会覆盖@"寄存器,它会存储您上次复制的字符串/字/字母/等。因此,通过在ddp命令之前添加&#34;(reg),我们可以解决此问题:

:nnoremap <C-Up> <Up>"add"ap<Up>
:nnoremap <C-Down> "add"ap

这里我们在删除和粘贴命令之前添加"a以将我们的行存储在@a寄存器中,因此您的默认复制寄存器不会被覆盖。但是它可能会覆盖@a寄存器的内容(谁知道,但是您可以将它用于您的用例中的重要内容,但这一步有点偏执,如果您愿意,可以跳过它),让&#39;我也解决了这个问题:

:nnoremap <silent><C-Up> :let save_a=@a<Cr><Up>"add"ap<Up>:let @a=save_a<Cr>
:nnoremap <silent><C-Down> :let save_a=@a<Cr>"add"ap:let @a=save_a<Cr>

<silent>需要阻止我们的命令回显到底部的消息行。)

现在我们有两个映射,允许我们使用键盘快捷键在文件中移动行。您可以重新定义按钮,我使用 Alt + j / k ,对于那些<A-j><A-k>命令。但是并非所有终端仿真器都支持Alt键映射AFAIK。

答案 4 :(得分:0)

Vim wikia页中提出的映射实际上是映射组合键的最佳方法,这些组合键模仿Sublime和其他编辑器实现此功能的方式。

这包括在移动之后进行的缩进动作,这也很棒(如果您不希望这样做,则是双等于==的符号)。

它还支持视觉插入模式,因此您可以在编辑时或使用fulblock时移动行。

nnoremap <A-j> :m .+1<CR>==
nnoremap <A-k> :m .-2<CR>==
inoremap <A-j> <Esc>:m .+1<CR>==gi
inoremap <A-k> <Esc>:m .-2<CR>==gi
vnoremap <A-j> :m '>+1<CR>gv=gv
vnoremap <A-k> :m '<-2<CR>gv=gv

我个人将它们映射到Mac上的<D-J><D-K>,而不是<A-映射到 Alt 键。这样,我就使用 Cmd + Shift + j / k ,这对我的指尖感觉更加自然。 >