1

次のコードでは:

int return_int_func() { return 0; }
float fv = return_int_func();

明らかに、コンパイラはfv、自動キャストのために精度が失われる可能性があることを警告します。それらの多くに直面して、私はすべてのものを代替コマンドに置き換えたい. 要するに、私はこれが欲しい:

float fv = static_cast<float>(return_int_func());

しかし、実際のコードには、次のような形式がたくさんあります。

float fv = obj.int_field;
float fv = obj->load_int_field("name");
float fv = xx.yy->zz;

ターゲット ( obj.int_fieldobj->load_int_field("name")またはxx.yy->zz) を選択して、 に置き換えstatic_cast<float>(\1)ます。私はこれを試しました:

:'<,'>s/\%V/static_cast<float>(&)/g

しかし、vimは選択した単語のすべての文字static_cast...を置き換えますが、それは私が望んでいることではありません。それから私はこれを試しました:

:'<,'>s/\(\%V\)/static_cast<float>(\1)/g

Vimも同じことをします。コンテンツ全体(および正規表現文字にもかかわらず) を自分のパターンに置き換える方法がわかりません。助言がありますか?

4

5 に答える 5

1

解決策はほとんど簡単すぎます。ここにあります。

:s/\%V.*\%V./static_cast<float>(&)/

これは実際には、 の例とほとんど同じ:helpです。このことから:h /\%V、朝一番に調べればよかったということを取り除くことができます...

\%Vビジュアルモードで選択されたものと一致する幅ゼロのアトムです。ここでは、ビジュアル エリアの先頭で一致させることができます。.*次に、可能な限り(貪欲に)一致します。その貪欲さは\%V.、試合の最後の文字も視覚領域内にある必要がある決勝戦によって抑制されます。


ヒント: この変更を何行にもわたって何度も行う必要がある場合は、次のマッピングを定義してください (さらに良いのは、それらを vimrc に永続的に配置することです)。

nnoremap & :&&<CR>
xnoremap & :&&<CR>

次に、何かを選択し、 を押し&て置換を実行するだけで、上記の置換を繰り返すことができます。

于 2013-10-23T13:05:30.537 に答える
1

あなたの質問を言い換えてみましょう: いくつかのテキストを視覚的に選択してから、選択したテキストが置換テキストの一部でもある置換を実行したいと考えています。

この場合、マクロははるかに優れたツールだと思います。

マクロを作成するには、まず、静的キャストでラップする最初のテキストを選択します。たとえば、 を選択しますreturn_int_func()。(各ステップで、バッファーがどのように見えるかを示します。)

  1. 準備ができたら、 を押しqqてレジスタへの記録を開始しq、 を押しcます。

    float fv = |;
    
  2. ラッパー テキストの左側の部分を入力しますstatic_cast<float>(

    float fv = static_cast<float>(|;
    
  3. CTRL-R "(Control-R に続いて) を押す": これにより、元のテキストが再挿入されます。

    float fv = static_cast<float>(return_int_func()|;
    
  4. 入力)して変更を完了し、Esc キーを押して挿入モードを終了します。

    float fv = static_cast<float>(return_int_func()▉;
    
  5. 最後に、 を押しqて録音を停止します。

この時点で、最初の変更を行い、それをマクロとして register に記録しましたq

残りのすべての変更については、 などのターゲットを選択し、obj->load_int_field("name")を押し@qて変更を繰り返します。

:help 10.1マクロの詳細については、検索してください。

于 2013-10-23T10:51:44.993 に答える
0

あなたが試すことができます

:%s/float fv =(.*)$/float fv = static_cast<float>(\1)/g
于 2013-10-23T02:55:07.930 に答える
0

私があなたを正しく理解していれば、選択したテキストに対してのみテキスト置換を行いたいと考えています。これを行うのはそれほど簡単ではありません。少なくとも、:sコマンドで実行できるほど簡単ではありません。視覚的な選択は単一行にすることも、複数行にまたがることもできるため、文字単位、行単位、ブロック単位にすることもできます..

しかし、それはこの関数で行うことができます:

function! SubVisualText(pat, repl,flag)
    try
        let v_save = @v
        normal! gv"vy
        let s = @v
        let s = substitute(s, a:pat, a:repl,a:flag) 
        call setreg('v',s,visualmode())
        normal! gv"vp
    finally
        let @v = v_save
    endtry
endfunction 

あなたはそれを使用します:

  • 関数のソース
  • v領域を視覚的に選択します ( 、Vまたはで実行できますCtrl-V)
  • :<ctrl-u>call SubVisualText(pattern, replacement, flag)<Enter>

<ctrl-u>関数は範囲を必要としないため、これは先頭の範囲を削除するためのものです。

あなたがそれを実行すると、次のようになります:(私はCtrl-V選択でテストしました)

ここに画像の説明を入力

于 2013-10-23T09:54:17.200 に答える