如何在vim中交换两行?


93

我有这个:

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

有没有办法使用键盘快捷键来快速执行此操作?


如果您不熟悉vim,则可以考虑使用其他编辑器。您可以配置git的编辑器仅使用或者git config --global core.editor <whatever>通过包括一次(包括GIT),或很多事情export EDITOR=<whatever>在你的.bashrc
Sven Marnach 2015年

Answers:


157

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

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

3
将光标移到第一行,然后键入ddp。如果您尚未处于命令模式,请单击Esc进入命令模式。
Sven Marnach 2015年

32
dd将当前行复制到“寄存器”后删除。在当前行之后p寄存器的内容复制(“放入”)到缓冲区中。同样,您可以用交换两个字符,或用交换两个词。xpdwwP
基思·汤普森

不幸的是,@ KeithThompson并不像交换两个单词那样容易。
CS

@CS您是否指的是dwwP如果两个单词都在一行的末尾,则工作方式不同的事实?(并且将一行中的最后一个单词与下一行中的第一个单词交换起来更加棘手。)
Keith Thompson

1
@KeithThompson是的,尽管我在发表评论后感到有点难过,因为那是字面上的极端情况;)
CS

51

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

:m 1 将当前行移到第1行之后

:m 0 将当前行移到顶部

:m $ 将当前行移到底部

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

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


1
感谢您对非vim“本地人”的解释:-)
Bruno Bieri

1
这也是我也在寻求扩展我的vim知识的答案。
Phemelo Khetho

谢谢!这就是我一直在寻找的答案。使用可视模式同时滑动多条线时,这甚至变得更加方便。
Kareem Jeiroudi

8

尽管这个问题是很老并标记为回答,我想应该说你可以使用普通模式下的命令,这是由提供延长答案斯文Marnachnnoremap像这样:

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

这将允许您在文件中使用Ctrl+UpCtrl+移动行Down。但是,这将覆盖@"寄存器,该寄存器存储您最后复制的字符串/单词/字母/等。因此,通过在命令dd和之前添加“(reg)” ,p我们可以解决此问题:

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

在这里,我们"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>

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

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



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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.