如何在 vim 中使用 :s 与正则表达式和文件名

How to use :s with regex and filename in vim

想要创建一个函数来添加我 python 每个函数的记录器定义我想到了宏:

nnoremap <leader>L :%s/\(\s*\)def \(\w\S*\)\(self.*\):/[=11=]\r\tlogging.info(\')\')/g<cr>

它有效,但我也需要编辑文件名,所以我添加到宏:in \=expand("%p")。现在宏看起来像这样:

nnoremap <leader>L :%s/\(\s*\)def \(\w\S*\)\(self.*\):/[=12=]\r\tlogging.info(\' \=expand("%p") )\')/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*

:[range]s[ubstitute]/{pattern}/{string}/[flags] [count]

                                    *sub-replace-special* *:s\=*

When the {string} starts with "\=" it is evaluated as an expression, see |sub-replace-expression|. You can use that for complex replacement or special characters.

\=如果在里面使用{string}(即不在开头) 它将按字面意思(即不是作为一个特殊字符