4

これに対する答えを広範囲に検索しましたが、どこにも見つかりません。関数ブロック内のすべてのコードを 1 行 (検索と置換を使用) またはその他のコマンドで置き換えたいと考えています。また、ファイル全体の複数の機能に対してこれを実行できるようにしたいと考えています。

私はこのようなコードのブロックを持っています...

{
いくつかのコード
さらにコード...
何行ものランダムなコード
}

中括弧内のすべてを次のような 1 行のコードに置き換えたいと思います。

{
return STATUS_OK;
}

私は次のようなものを試しました、

%s/^{_[^}]+/\treturn STATUS_OK;/g

ただし、これは行頭の最初の } ではなく、最初の } で停止します。

私はこれを試しました

%s/^{_[^^}]+/\treturn STATUS_OK;/g

行頭の最初の } で停止するためですが、これは何らかの理由で機能しません。何か案は?ありがとう。

4

5 に答える 5

5

この正規表現は、関数名を考慮せずに最も外側のカーリーに一致します。

 %s/^{\(\(\s\+}\)\|[^}]\|\_s\)*/{\treturn STATUS_OK;/g

壊す:

^{  # match a curly at the beginning of a line
\(  # group these alternations.... either match
     \(\s\+}\) \|  # whilespace followed by a closing curly 
                   # (to get rid of internal blocks) or ..
     [^}]      \|  # match a non curly, or ..
     \_s           # match newlines and whitespaces
 \)*               # match the alternation as long as you can
于 2013-11-06T15:37:08.697 に答える
2

これ (マクロ) は大丈夫ですか:

qq/{<cr>ci{return STATUS_OK;<esc>q

それから99@q

(コマンドライン) でそれを行う:sのが好きなら、試してみてください:

%s/^{\zs\_.\{-}\ze}/\rreturn STATUS_OK;\r/

\_.ここでは「ドットオール」( )が必要なため、正規表現は機能しません

編集

投稿した正規表現は、最初の } にのみ一致し、行頭の最初の } には一致しません。

私はあなたの要求を誤解しました。ただし、比較的簡単なコマンドに合わせて変更します。

%s/^{\zs\_.\{-}\ze\_^}/\rreturn foo;\r

このコマンドは次のように変更されます。

asdfasf
{
some code
more code...
many lines of random code
     } (this is not the leading one)

{
some code
more code...
many lines of random code
}

の中へ

asdfasf
{
return foo;
}

それがあなたが探していたものであることを願っています。

于 2013-11-06T15:26:18.500 に答える
0

私はマクロでそれを行います:

  1. レジスタ "a" のテキスト "return STATUS_OK" をヤンクします。
  2. すべてを見つける {
  3. マクロの記録を開始します
  4. 次へ{
  5. vi{
  6. レジスターの内容を貼り付けます
  7. マクロを繰り返す
于 2013-11-06T15:22:55.803 に答える
0

ビルトインです。

/^{/
Vi{C

行頭の { は、V「視覚的に行を選択する」、i{「中かっこ内」、つまり C です。

于 2013-11-06T16:18:12.400 に答える