如何在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