我正在尝试使用 vim 向 python 脚本中的所有函数添加一个打印语句(尽管编程语言在这里无关紧要)。基本上我想改变这个:
def func1(a, b):
pass
进入这个:
def func1(a, b):
print 'in func1'
pass
我在想类似的东西:g/\vdef (\w+)\(/CMD
,但我的 vim 技能还不够好,无法想出CMD
。有谁知道我可以用什么?
谢谢!
您可以使用自己用来完成这项工作的任何东西,前缀为:normal!
:
g/\vdef\ (\w+)\(/exe "normal!^wywoprint 'in \<C-r>0'"
(注意:根据帮助,使用时必须转义空格\v
:
使用 "\v" 意味着在它之后的模式中,除了 '0'-'9'、'a'-'z'、'A'-'Z' 和 '_' 之外的所有 ASCII 字符都有特殊含义。“很神奇”
. 你看,这里没有列出空格。)
这是仅使用一个替换的替代方法(基于 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
_//