2016-08-04 32 views
1

婉婷創建一個函數,它會增加我的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")爲文本,而不是一個文件名。

在我看來,通常在文本替換中,如果我不使用正則表達式,我可以使用擴展。

我會非常感謝正確的宏和解釋爲什麼它沒有工作。

回答

1

這應該工作:

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