1

vimを使用して、Pythonスクリプトのすべての関数にprintステートメントを追加しようとしています(ここではプログラミング言語は問題ではありません)。基本的に私はこれを変更したい:

def func1(a, b):
    pass

これに:

def func1(a, b):
    print 'in func1'
    pass

のようなことを考えて:g/\vdef (\w+)\(/CMDいましたが、私の vim スキルはまだ十分ではありませんCMD。誰が私が何を使うことができるか知っていますか?

ありがとう!

4

2 に答える 2

3

この仕事を自分で行うために使用したものは何でも使用できます:normal!

g/\vdef\ (\w+)\(/exe "normal!^wywoprint 'in \<C-r>0'"

(注:ヘルプによると、使用するときはスペースをエスケープする必要があります\v

「\v」の使用は、その後のパターンで、「0」から「9」、「a」から「z」、「A」から「Z」、および「_」を除くすべての ASCII 文字が特別な意味を持つことを意味します。「とても魔法」

. ご覧のとおり、スペースはここにリストされていません。)

于 2013-01-31T02:58:24.840 に答える
2

これは、1 つの置換のみを使用する代替手段です (ZyX' パターンに基づく)。

:%s/\v(def\ )(\w+)(\(.*\):)(\n\s*)/\1\2\3\4print "in \2"\4

壊す:

  • (def\ )は最初のキャプチャ グループで、その後に続きます
  • (\w+)、2 番目のキャプチャ グループ、再利用する関数の名前、その後に続く
  • (\(.*\):)、3 番目のキャプチャ グループ、続いて
  • (\n\s*)、新しい行を正しくインデントするために使用する最後のキャプチャ グループ。
  • \1\2\3\4変更したくないため、一致全体を再印刷します。
  • print "in \2"は必要な新しいコンテンツで、その後に続きます
  • \4passラインをそのまま維持します。

ネストされたキャプチャ グループを作成する方法はおそらくあると思いますが、私はそこまで行きませんでした。

それを次と組み合わせることができることに注意してください:global

:g/\v(def\ )(\w+)(\(.*\):)(\n\s*)/s//\1\2\3\4print "in \2"\4

に使用される「複雑な」パターンは、 のおかげで に:g再利用されます。:s//

于 2013-01-31T07:58:22.067 に答える