如何在 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}(即不在开头) 它将按字面意思(即不是作为一个特殊字符)
想要创建一个函数来添加我 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}(即不在开头) 它将按字面意思(即不是作为一个特殊字符)