如何在vim中交换两行?

Bar*_*zyk 75 vim

我有这个:

pick 887b66f add 222 Dziewiecsil to flowers new title
pick dc331cb new name of beginning commit
Run Code Online (Sandbox Code Playgroud)

我希望得到这个:

pick dc331cb new name of beginning commit
pick 887b66f add 222 Dziewiecsil to flowers new title
Run Code Online (Sandbox Code Playgroud)

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

Sve*_*ach 125

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

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

  • `dd`在将其复制到"寄存器"后删除当前行.`p`在*当前行之后将寄存器的内容复制("置入")到缓冲区*中.同样,你可以用`xp`交换两个字符,或者用`dwwP`交换两个字. (30认同)
  • 将光标移动到第一行,然后键入`ddp`.如果您还没有处于命令模式,请点击"Esc"进入命令模式. (3认同)

小智 41

dd删除当前行,然后您可以使用粘贴删除的行p.虽然使用了另一种方式m.随着m你可以移动线路即

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

:m 0 将当前行移至顶部

:m $ 将当前行移至底部

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

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

  • 这也是我一直在寻找的答案,以扩展我对 vim 的了解。 (3认同)
  • 感谢对非vim“本地人”的解释:-) (2认同)
  • 谢谢!这就是我一直在寻找的答案。当使用视觉模式同时滑动多行时,这会变得更加方便。 (2认同)

小智 12

尽管这个问题很老并且被标记为已回答,但我想通过说您可以使用正常模式命令来扩展答案,这些命令由Sven Marnach提供,nnoremap如下所示:

:nnoremap <C-Up> <Up>ddp<Up>
:nnoremap <C-Down> ddp
Run Code Online (Sandbox Code Playgroud)

这将允许您在文件中移动带有Ctrl+UpCtrl+ 的行Down。但是,这将覆盖@"寄存器,它存储您上次复制的字符串/单词/字母/等。因此,通过在ddp命令之前添加“(reg),我们可以解决这个问题:

:nnoremap <C-Up> <Up>"add"ap<Up>
:nnoremap <C-Down> "add"ap
Run Code Online (Sandbox Code Playgroud)

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

: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>
Run Code Online (Sandbox Code Playgroud)

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

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


小智 8

例子:

  1. one
> 2. two
Run Code Online (Sandbox Code Playgroud)

:m-2, 开关(当前行 - 2)

> 2. two
  1. one
Run Code Online (Sandbox Code Playgroud)

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

  1. one
> 2. two
Run Code Online (Sandbox Code Playgroud)

如果你愿意,你可以映射这个。

  • 例如 https://github.com/benknoble/Dotfiles/blob/master/links/vim/plugin/bubble.vim (2认同)
  • 这是比默认答案更好的答案 (2认同)

ojo*_*lva 7

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

这包括移动后的缩进操作,这也很棒(这是双等号==,以防您不想要)。

它还支持视觉插入模式,以便您可以在编辑时或使用完整块移动线条。

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
Run Code Online (Sandbox Code Playgroud)

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