我经常发现自己需要结合正则表达式,某种运动以及复制和粘贴的问题.我确信在vim中有一些方法可以做到这一点,但我还没有看到任何结合起来的东西.作为一个例子,我想解决的问题是这样的.
有谁知道在VIM中快速自动执行此类任务的方法?
我还没有学会所有新奇的仅限 vim 的功能;我在 vim 之前学习了 vi,这个解决方案适用于任何 vi-ish 编辑器。也许使用 vim 功能有更好的解决方案。
在这种情况下,我通常会使用该:map命令绑定多个键,每个键都执行上述部分操作。你需要挑选一些暂时不需要的钥匙;我经常为此使用gand 。v@Neil Forrester 建议使用功能键,这是一个好主意。
现在,您显示了正则表达式模式,其中括号指示匹配组。(在 vi 或 vim 中,您实际上需要在每个括号之前添加一个反斜杠以使其“神奇”;请参阅文档。)但是,对于此解决方案,我将使用该命令f,该命令 (f)inds 指定特点; 和/或t跳转到字符的命令。 f跳转到一个字符,其中t跳转到一个字符之前。因此,使用 withf"我们可以跳转到字符串的第一个双引号,然后使用t"我们可以跳转到第二个双引号之前。因此,该序列f"lyt"将找到第一个双引号,将一个字符向右移动,然后将所有内容拉到下一个双引号为止。但是,让我们将拉出的文本存储到 26 个命名缓冲区之一中;让我们只使用缓冲区“a”:f"l"ayt" 这有点令人困惑,因为我们必须使用"a来引用命名缓冲区“a”,但我们还有很多其他"字符需要查找。
此外,在“映射”中,您可能需要记录 Enter 键的击键。方法是按 Ctrl+V,然后按 Enter 键。这将显示为^M。在我下面的代码中,如果您看到^M它并不意味着^后面跟着一个实际的实际键M,而是表示代表 Enter 键的单个键。
现在,我们可以进行两个键映射。让我们绑定v执行步骤 1 和 2,以及g执行步骤 3 和 4。
:map v /^Description "/^Mf"l"ayt"
:map g /^TEXT "/^Mf"ldt""aP
Run Code Online (Sandbox Code Playgroud)
不要忘记,使用 Ctrl+V 和 Enter 而不是实际键入 ^M,因此您不能只复制/粘贴上面的内容而不对其进行编辑。
现在,使用v键执行步骤 1 和 2,使用g键执行步骤 3 和 4。通过交替敲击这两个键,您可以快速完成很多操作。
也可能有一种方法可以通过在 vim 中使用脚本来做到这一点,但另一方面,如果您想编写脚本,您可能只想编写一个简短的 Python 脚本(或您最喜欢的语言)。上面的两个关键宏确实提供了一种在 vim 中执行此类操作的快速方法。
vim 有某种在您键入时记录按键的功能,我认为它可以用于快速创建此类宏。