2016-10-08 9 views
0

のは、私はいくつかのコードを持っているとしましょう:VIM:異なる値と文字列の各インスタンスを置き換える方法

divide(int x) { 
int a = 0; 
a += x; 
} 

subtract(int x) { 
int b = 0; 
b += x; 
} 

multiply(int x) { 
int c = 0; 
c += x; 
} 

私はVIMを使用していると私は、各インスタンスを検索と置換できるようにしたいと思います+ =を{'/=', '-=', '*='}の順に使用し、vimコマンドラインを使用します。 :%s/+=/...を使用したいと思いますが、どうすればよいか分かりません。

また、vimでthisのようなPythonを使用することも考えましたが、可能であれば、VIMではもっと単純なソリューションを使用することをお勧めします。あなたの+=の全てが異なる行に発生した場合

+1

関連記事:[?Vimのは、私が検索し、他のすべての試合を置き換えることができる方法]( http://stackoverflow.com/q/13763880/438329) –

答えて

2

:let c=0 | g/\m+=/ s!\m+=!\=['/=', '-=', '*='][c%3]! | let c+=1 

があるかもしれない場合は、同じ行に複数の+=

:fu! Cycle() | let c+=1 | return ['/=', '-=', '*='][c%3] | endf 
:let c=-1 | %s/\m+=/\=Cycle()/g 

参考文献:

  • :h :global
  • :h s/\=
+0

回答ありがとうございました!なぜこれがうまくいくのかについて少し詳しく説明できますか? – luca590

1

ここでは、@佐藤桂の回答の短い変形があります。最初に置き換えリストを定義し、次に:help sub-replace-expressionを使用してリストの最初の要素を削除します。

:let replacements = ['/=', '-=', '*='] | %s#+=#\=remove(replacements, 0)# 

が3個の以上の置換があり、そしてあなたが交換の繰り返したい場合は、これを使用する:

:let replacements = ['/=', '-=', '*='] | %s#+=#\=add(replacements, remove(replacements, 0))[-1]# 
+0

それでは、なぜこれは正確に機能しますか?私は%sの後の最初の#まですべてを理解しています。 – luca590

+1

'remove()'は、事前に設定されたリストから削除された要素を返します。したがって、各置換は、リストから1つの要素を削除(および使用)します。 2番目の変種は、各要素を再度追加することによってリストが空になるのを防ぎます。 –

関連する問題