使用方法:s的正则表达式和文件名在vim

使用方法:s的正则表达式和文件名在vim

问题描述:

婉婷创建一个函数,它会增加我的Python记录器在每个函数定义我来了个宏:使用方法:s的正则表达式和文件名在vim

nnoremap <leader>L :%s/\(\s*\)def \(\w\S*\)\(self.*\):/\0\r\1\tlogging.info(\'\2)\')/g<cr> 

它的工作原理,但我需要eddited文件名所以我加入宏:in \=expand("%p")。现在,宏看起来像这样:

nnoremap <leader>L :%s/\(\s*\)def \(\w\S*\)\(self.*\):/\0\r\1\tlogging.info(\' \=expand("%p") \2)\')/g<cr> 

不工作,因为它打印整个=expand("%p")为文本,而不是一个文件名。

在我看来,通常在文本替换中,如果我不使用正则表达式,我可以使用扩展。

我会非常感谢正确的宏和解释为什么它没有工作。

这应该工作:

nnoremap <leader>L :%s/\(\s*\)def \(\w\S*\)\(self.*\):/\=substitute(submatch(0),submatch(0),'&\r'.submatch(1).'\tlogging.info('''.expand("%p").' '.submatch(2).''')','g')/<cr> 

4.2 Substitute *:substitute* *:s* *:su*

:[范围] S [ubstitute]/{图案}/{串}/[标志] [ count]

        *sub-replace-special* *:s\=* 
子替换表达式|

{字符串}用 “\ =”评价作为表达, 见开始|。您可以将其用于复杂的 替换或特殊字符。

\=如果它是用来内部{串}(即未在开始时),它会采取字面上(即如作为pecial字符

+0

它几乎完美!它只对*有问题,带有*和**参数的函数的错误: E871:(NFA正则表达式)不能有多重跟随多! E61:嵌套* – pholat

+0

您能否提供您想要更改的行的示例和结果? –

+0

当然,它会是:'def __init __(self,* args,** kwargs):' – pholat