10

シンプルな vim スクリプト関数を作成しようとしていますが、問題が発生しています。この関数は、2 つの入力文字列を取得して検索を実行し、それらのすべてのインスタンスを置換する必要があります。私は今、次のものを持っています:

  function! FindAndReplaceAll(from, to)                                           
     echo a:from                                                                   
     :%s/a:from/a:to/gc                                                            
  endfunction   

私がする時:

:call FindAndReplaceAll("test", "test2")

echo a:from は正しく機能しますが、:%s... は from および to リテラルに作用しています。vim構文のハイライトがそれらを変数として強調表示していないことに気付いたので、基本的な構文の問題があるようです。

私の質問は次のとおりです。

  1. これで正しい構文は何ですか? 答えだけでなく、理由の説明をいただければ幸いです。上記が間違っているのはなぜですか?
  2. とにかく、これを次のように呼び出すことができるようにします

    :call FindAndReplaceAll(test, test2)

だから私は引用符を追加する必要はありません...

4

2 に答える 2

18

変更が必要です

:%s/a:from/a:to/gc

に:

exe '%s/' . a:from . '/' . a:to . '/gc'

あなたの発言は文字通りに解釈されます。つまり、現在のバッファで文字列 "a:from" を文字列 "a:to" に置き換えます。

しかし、あなたが意図しているのは、 によって評価されa:fromた文字列をによって評価された文字列に置き換えることですa:to。これは、組み込みexe[cute]関数によって実現できます (:h exeコマンド ライン モードで次のように入力すると、ヘルプが表示されます)。

2番目の質問については、引用符を使用する必要があります。そうしないと、変数として使用されます。

于 2013-03-07T02:08:11.843 に答える
1

コマンド ラインは、直接テキストではなく、「execute」で呼び出す必要があります。

 function! FindAndReplaceAll(from, to)                                           
     echo    a:from                                                                   
     execute "%s/" . a:from . "/" . a:to . "/gc"                                                            
 endfunction  
于 2013-03-07T02:07:41.993 に答える