如何在vim中将:s与regex和filename一起使用

如何在vim中将:s与regex和filename一起使用,vim,macros,escaping,remap,Vim,Macros,Escaping,Remap,想要创建一个函数,在每个函数定义中添加python logger,我在宏中遇到: nnoremap <leader>L :%s/\(\s*\)def \(\w\S*\)\(self.*\):/\0\r\1\tlogging.info(\'\2)\')/g<cr> 这不起作用,因为它将整个=expand(“%p”)打印为文本,而不是文件名 在我看来,一般来说,在文本替换中,如果不使用正则表达式,我可以使用expand 我将非常感谢正确的宏和解释为什么它不起作用。这应该起作

想要创建一个函数,在每个函数定义中添加python logger,我在宏中遇到:

nnoremap <leader>L :%s/\(\s*\)def \(\w\S*\)\(self.*\):/\0\r\1\tlogging.info(\'\2)\')/g<cr>
这不起作用,因为它将整个
=expand(“%p”)
打印为文本,而不是文件名

在我看来,一般来说,在文本替换中,如果不使用正则表达式,我可以使用expand

我将非常感谢正确的宏和解释为什么它不起作用。

这应该起作用:

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>
{string}以“\=”开头时,它被作为表达式计算, 请参见|子替换表达式|。你可以用它来做复杂的事情 替换字符或特殊字符


\=
如果在{string}内部使用{string}(即不在开始时),它将被字面上理解为(即作为一个特殊字符

它几乎完美!它只在*上有问题,在带有*和**参数的函数上有错误:E871:(NFA regexp)不能有多跟多!E61:Nested*您能提供一个您想要更改的行和结果的示例吗?当然,它应该是:
def\uuu init\uuu(self,*args,**kwargs):
和最终结果:)这行根本不起作用——所以没有:)如果我能解决它,我会在评论中发布它。
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>
                                    *sub-replace-special* *:s\=*