使用方法: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字符)
它几乎完美!它只对*有问题,带有*和**参数的函数的错误: E871:(NFA正则表达式)不能有多重跟随多! E61:嵌套* – pholat
您能否提供您想要更改的行的示例和结果? –
当然,它会是:'def __init __(self,* args,** kwargs):' – pholat