2

我有一个输入文本如下 -

(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

4 回答 4

3

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

将光标放在括号上或内部的任何位置(A B C)

va(Ctrl+v

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

一旦你选择了所有:

y/)Enterp

这将拉动(y)整个块,移动到关闭的括号,然后将块粘贴到它之后(p)。

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

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

:%s/\(([A-Z] [A-Z] [A-Z])\) /\1 \1/
于 2012-10-03T13:25:26.960 回答
1

(这些在 vim 中对我有用)

使用块选择:

14l<C-v>jj6ly7lp

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

使用以下命令记录宏:

qqf(;vf)y;pj0q

然后根据需要重复:

100@q

适用于 100 行的文件

于 2012-10-03T13:13:55.360 回答
1

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

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

于 2012-10-03T13:17:22.510 回答
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 对所有行执行相同的操作。

它工作得很好!非常感谢你们!

于 2012-10-03T13:31:54.837 回答