Vim在同一行复制并粘贴文本

时间:2012-10-03 13:09:00

标签: 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 Editor进行此操作?

更新: 我想我错过了一个重要的观点,即值A,B,C ...... I ......可以有不同的长度。我只是用它们作为符号。

谢谢!

4 个答案:

答案 0 :(得分:3)

如果所有行的长度和格式与示例相同:

将光标放在parens (A B C)上面或内部的任何位置:

v 控制 + v

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

选择全部:

ý / 输入 P

这将猛拉(y)整个块,移动到关闭的paren,然后粘贴块(p)。

如果线条长度不同或者无法合理地选择作为块

您可以使用图案替换。这是特定于您的示例,我们正在寻找模式(A B C),其中A,B和C是括号中包含的大写字母,用空格分隔。我们将该模式的匹配加上以下空格,并将其替换为该模式的匹配,空格和模式匹配。

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

答案 1 :(得分:1)

(这些在vim中为我工作)

使用块选择:

14l<C-v>jj6ly7lp

使用宏(如果长度不同):

使用以下方式记录宏:

qqf(;vf)y;pj0q

然后根据需要重复:

100@q

适用于100行的文件

答案 2 :(得分:1)

是的,有几种方法可以在vim中执行此操作(与大多数事情一样)。我可能会选择快速宏:转到第一行并从正常模式点击qa开始录制名为“a”的宏。现在手动编辑该行。当然你会希望操作是通用的,所以不要只输入值,使用yank并将其复制。编辑完成后,退出到正常模式并按j向下移动到下一行(这将使您在下一行运行宏)。再次点击q以停止录制,然后键入@a以执行下一行的宏,然后再次点击它以在下一行上运行它等。或者,一旦执行{{1} }一次,您可以@a再次运行相同的宏。您还可以多次提供@@的计数。

或者,您可以使用@@命令执行正则表达式,但这取决于您的行实际外观以及您对正则表达式的好处。

答案 3 :(得分:0)

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

所以我做的如下

  1. 开始按q录制宏。
  2. /(找到开头括号,所以它转到第二个。
  3. n转到第三个。
  4. v标记视觉块
  5. /)搜索括号的结尾
  6. y复制视觉块
  7. n转到下一个)支架
  8. 关闭括号旁边的一次性箭头键
  9. p粘贴视觉块
  10. 向下箭头键转到下一行。
  11. Home键转到下一行的第一个位置。
  12. q停止录制宏
  13. @a对所有行进行相同的操作。
  14. 它工作得非常好! 非常感谢你们!