Vim:一次移动中交换两个不相邻行的位置

4

(注:这是我的第一篇帖子)

在Vim文件中,我如何一次性交换第15行和第33行(例如)?


一步操作,却是一个长命令。将当前行与当前行向下数第15行进行交换:dd14jpkdd14kP - Amarghosh
4个回答

9

最快的方法是移动行:

:33m 15|15m 33

将第33行移动到第15行下面,然后将第15行移动到第33行下面。

最好先按“将高行号移至低行号”进行操作,否则您必须调整偏移量:

:15m 33|32m 14


4
我能想到两种方法。使用Vim可能还有更多的方法!
:33 | delete | 15 | put | 15 | delete | 32 | put

...or...

13ggdd15ggPjdd33ggP

当写下来时,这种方法需要的按键较少,但有点难以理解!


2
这只会移动 - 不会交换。要进行交换,您必须执行 :33 | delete | 15 | put | 15 | delete | 32 | put - Amarghosh
你是对的,我没有完成这项工作。已相应更新回答。 - johnsyweb
谢谢你们两位的答案:我测试了它们两个(我不是程序员)。两个都完美运行,唯一的问题是要记住代码,命令更容易(只需要记住32而非33的扭曲)。再次感谢。 - ThG

3

如果我已经在文件中,我发现这个命令是最快的方式:

:15mo33

1

我经常使用以下内容:

" Tip #470 : Piet Delport & Anthony (ad_scriven)
vnoremap <silent> g" <esc>:call <sid>SwapVisualWithCut()<cr>

function! s:SwapVisualWithCut()
  normal! `.``
  if line(".")==line("'.") && col(".") < col("'.")
    let c = col('.')
    normal! gvp```]
    let c = col('.') - c
    normal! ``
    :silent call cursor(line("."),col(".")+c)
    normal! P
  else
    normal! gvp``P
  endif
endfunction

这个想法是在任何地方删除一些内容,然后去选择其他字符,按下g"键,将删除的字符与新选择的字符交换。


你好, 我已经阅读了您的回复并感谢您(顺便问一下,在这个论坛上用法语写是否正确?)。然而,我在VIM方面还处于初学阶段;如果我能进步,我打算使用它来写一本书(这里每一行实际上相当于一个段落)。 但是,您的回答对我来说仍然太“高级”,这让我感到遗憾。无论如何,再次感谢(这是英语!)ThG - ThG
这段代码必须原封不动地放在您的 .vimrc 文件中,或者放在一个插件中 - 实际上,我的一个插件已经定义了它:http://code.google.com/p/lh-vim/source/browse/misc/trunk/plugin/vim-tip-swap-word.vim。然后,您只需要记住 g" 应该如何使用即可。不知何故,这比记住命令 :putdelete 更简单。 - Luc Hermitte
关于在这里说法语是否可以。通常情况下,当有趣的答案在英语论坛中给出,但是用我不懂的语言时,我会感到很恼火,所以我避免自己这样做。如果您想要法语的答案,请尝试邮件列表vim-fr(雅虎),或dvpz,甚至sdz。 - Luc Hermitte

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接