1

我正在尝试使用 vim 向 python 脚本中的所有函数添加一个打印语句(尽管编程语言在这里无关紧要)。基本上我想改变这个:

def func1(a, b):
    pass

进入这个:

def func1(a, b):
    print 'in func1'
    pass

我在想类似的东西:g/\vdef (\w+)\(/CMD,但我的 vim 技能还不够好,无法想出CMD。有谁知道我可以用什么?

谢谢!

4

2 回答 2

3

您可以使用自己用来完成这项工作的任何东西,前缀为:normal!

g/\vdef\ (\w+)\(/exe "normal!^wywoprint 'in \<C-r>0'"

(注意:根据帮助,使用时必须转义空格\v

使用 "\v" 意味着在它之后的模式中,除了 '0'-'9'、'a'-'z'、'A'-'Z' 和 '_' 之外的所有 ASCII 字符都有特殊含义。“很神奇”

. 你看,这里没有列出空格。)

于 2013-01-31T02:58:24.840 回答
2

这是仅使用一个替换的替代方法(基于 ZyX 模式)。

:%s/\v(def\ )(\w+)(\(.*\):)(\n\s*)/\1\2\3\4print "in \2"\4

分解:

  • (def\ )是第一个捕获组,然后是
  • (\w+),第二个捕获组,我们要重用的函数的名称,后跟
  • (\(.*\):),第三个捕获组,其次是
  • (\n\s*),我们将用来正确缩进新行的最后一个捕获组。
  • \1\2\3\4重新打印整个匹配,因为我们不想改变它,然后
  • print "in \2"是我们想要的新内容,后面是
  • \4保持pass线路完好无损。

可能有一种方法可以进行嵌套捕获组,但我没有走那么远。

请注意,您可以将其与:global

:g/\v(def\ )(\w+)(\(.*\):)(\n\s*)/s//\1\2\3\4print "in \2"\4

:g由于. _ :s_//

于 2013-01-31T07:58:22.067 回答