Vim在同一行上复制和粘贴文本

Vim在同一行上复制和粘贴文本,vim,Vim,我有一个输入文本如下- (command (and (A B C) )) (command (and (D E F) )) (command (and (G H I) )) ... ... 我想复制和粘贴的文字在同一行的一部分 (command (and (A B C) (A B C))) (command (and (D E F) (D E F))) (command (and (G H I) (G H I))) ... ... 是否可以使用VI编辑器自动完成 更新: 我想我错过了一个重要

我有一个输入文本如下-

(command (and (A B C) ))
(command (and (D E F) ))
(command (and (G H I) ))
...
...
我想复制和粘贴的文字在同一行的一部分

(command (and (A B C) (A B C)))
(command (and (D E F) (D E F)))
(command (and (G H I) (G H I)))
...
...
是否可以使用VI编辑器自动完成

更新: 我想我错过了一个重要的点,A,B,C。。。我可以有可变长度。我只是用它们作为象征

谢谢

(这些在vim中为我工作)

使用块选择:

14l<C-v>jj6ly7lp
然后根据需要重复以下步骤:

100@q

适用于100行文件

是的,在vim中有几种方法可以做到这一点(与大多数情况一样)。我可能会选择快速宏:转到第一行,在正常模式下点击
qa
,开始录制名为“a”的宏。现在手动编辑该行。当然,您希望操作是泛型的,所以不要只是键入值,而是使用yank和put来复制它。编辑完成后,跳转到正常模式并按j向下移动到下一行(这将设置您在下一行运行宏)。再次点击
q
停止录制,然后键入
@a
在下一行执行宏,然后再次点击以在下一行运行宏,以此类推。或者,一旦您点击
@a
一次,您可以执行
@
再次运行同一宏。您还可以向
@
提供要执行多次的计数

或者,您可以使用
:s
命令执行正则表达式,但这取决于行的实际外观以及使用正则表达式的效果。

如果所有行的长度和格式与示例中的相同: 将光标放在parens的任何位置或内部
(A B C)

va(Ctrl+v)

现在您已经选择了
(A B C)
,并且处于块选择模式。使用任何机制来阻止向下选择。如果是几行,您可以向下移动。如果是多行,您可以添加计数,或者使用搜索(
/
)或文件结束Shift+g

选择全部后:

y/)输入

这将拉动(y)整个块,移动到闭合块,并在其(p)之后粘贴块

如果线条长度不同或无法合理选择为块 您可以使用模式替换。这是特定于您的示例的,我们正在查找模式
(A B C)
,其中A、B和C是包含在括号中并由空格分隔的大写字母。我们取一个匹配的模式加上下面的空格,然后替换为该模式的匹配,一个空格,然后再次匹配

:%s/\(([A-Z] [A-Z] [A-Z])\) /\1 \1/

我结合了bmearns和Kev给出的技术

所以我所做的如下

  • 通过
    q
    开始录制宏
  • /(要找到开口支架,请转到第二个支架
  • n转到第三个
  • v标记视觉块
  • /)搜索括号末端的步骤
  • y以复制可视块
  • n转到下一个)括号
  • 按一次箭头键转到关闭支架旁边
  • p以粘贴可视块
  • 向下箭头键转到下一行
  • Home键转到下一行的第一个位置
  • q
    停止录制宏
  • @a对所有线路执行相同的操作
  • 它工作得非常好!
    谢谢大家

    Ctrl-v
    视觉块,猛拉和paste@kev:将此作为答案发布。当行数很大时,这是太多的手动任务。您是否尝试过替换命令
    :%s/foo/bar/
    ?@RajTendulkar:regex非常适合可变长度。问题在于
    abc
    模式是否有嵌套的括号。如果没有,您可以轻松地使用正则表达式捕获括号之间(或包括括号)的所有内容。类似于
    \([^)]\)
    :%s/\(([A-Z] [A-Z] [A-Z])\) /\1 \1/