2016-08-04 99 views
1

Wanting eine Funktion erstellen, die mir Python-Logger an jeder Funktion hinzufügen wird definiere ich auf Makro kam:Wie man verwendet: s mit regex und den Dateinamen in vim

nnoremap <leader>L :%s/\(\s*\)def \(\w\S*\)\(self.*\):/\0\r\1\tlogging.info(\'\2)\')/g<cr> 

Es funktioniert, aber ich brauche eddited Dateiname auch, so habe ich Makro hinzugefügt: in \=expand("%p"). Jetzt Makro sieht wie folgt aus:

nnoremap <leader>L :%s/\(\s*\)def \(\w\S*\)\(self.*\):/\0\r\1\tlogging.info(\' \=expand("%p") \2)\')/g<cr> 

Welche nicht funktioniert, weil es ganze =expand("%p") als Text druckt, nicht als Dateinamen.

Es scheint mir, dass ich in der Textsubstitution im Allgemeinen expand verwenden kann, wenn ich Regex nicht verwende.

Ich wäre schrecklich dankbar für korrekte Makro und Erklärung, warum es nicht funktioniert hat.

Antwort

1

Dies sollte funktionieren:

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*

: [Bereich] s [ubstitute]/{Muster}/{string}/[flags] [ zählen]

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

Wenn die {string} beginnt mit "\ =" es als Ausdruck ausgewertet wird, siehe | Unter ersetzen Ausdruck |. Sie können das für komplexe Ersatz- oder Sonderzeichen verwenden.

\= wenn es innen verwendet wird, um die {string} (dh nicht am Anfang) es wird buchstäblich (dh nicht wie pecial Zeichen)

genommen werden
+0

Es ist fast perfekt! es hat nur ein Problem mit *, mit dem erro auf Funktionen mit * und ** args: E871: (NFA regexp) Kann kein Multi haben, folge einem Multi! E61: Verschachtelt * – pholat

+0

Können Sie ein Beispiel für eine Zeile angeben, die Sie ändern möchten, und das Ergebnis? –

+0

Sicher wäre es: 'def __init __ (selbst, * args, ** kwargs):' – pholat