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