如何在vim中交换两行?

如何在vim中交换两行?,vim,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 有没有办法使用键盘快捷键快速完成此操作?要将当前行与下一行交换,请在命令模式下键入d

我有这个:

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

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

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

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

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

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

:m 0
将当前行移到顶部

:m$
将当前行移到底部

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


更多信息:

尽管这个问题已经很老了,并且被标记为已回答,但我想进一步说明一下,您可以使用正常模式命令,这些命令由
nnoremap
提供,如下所示:

:nnoremap <C-Up> <Up>ddp<Up>
:nnoremap <C-Down> ddp
在这里,我们在删除和粘贴命令之前添加
“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>
:nnoremap:let save\u a=@a“add”ap:let@a=save\u a
:nnoremap:let save_a=@a“add”ap:let@a=save_a
需要防止将命令回显到底部的消息行。)

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

示例:

  1. one
> 2. two
:m-2
,开关(当前线路-2)

:m+1
开关(当前线路+1)


如果需要,您可以对此进行映射。

Vim页面中建议的映射实际上是映射组合键的最佳方式,这些组合键模仿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
nnoremap:m.+1==
nnoremap:m.-2==
inoremap:m.+1==gi
inoremap:m.-2==gi
vnoremap:m'>+1gv=gv

VNORMAP: M,如果您不熟悉VIM,您可以考虑使用不同的编辑器。您可以只使用<代码> Git配置——Global Cy.Edgult>代码>,或针对许多事情(包括Git)配置Git编辑器。通过在
.bashrc
中包含
export EDITOR=
。将光标移动到第一行,然后键入
ddp
。如果尚未处于命令模式,请点击
Esc
进入命令模式。
dd
在将当前行复制到“寄存器”后删除该行。
p
复制(“puts”)寄存器的内容放在当前行后的缓冲区中。类似地,您可以用
xp
交换两个字符,或者用
dwwP
交换两个字@KeithThompson不幸的是,交换两个字并不像交换两个字那么容易。@CS您指的是如果两个字在同一行时,
dwwP
的工作方式不一样吗一行的d?(将一行的最后一个单词替换为下一行的第一个单词更为棘手。)@KeithThompson是的,尽管我在发表评论后感觉有点糟糕,因为这是一个字面上的边缘情况;)谢谢你对非vim“本地人”的解释“:-)这是我用来扩展我对vim知识的答案。谢谢!这就是我一直在寻找的答案。当使用视觉模式同时刷多条线时,这会变得更加方便。这太棒了!比选择的答案更多才多艺!:)这是比默认答案更好的答案
> 2. two
  1. one
  1. one
> 2. two
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