2017-08-06 14 views
4

複数の検索と置換を組み合わせるコマンドまたは関数を作成したいとします。私は、以下のコマンドを試してみました:Gvimで複数の検索置換が可能

command MyFR %s/first/1st/g | %s/second/2nd/g | %s/third/3rd/g 

それは動作しますが、何の「最初の」または「第二」が見つからない場合は途中で停止します。エラーは次のとおりです。

E486: Pattern not found: <pattern> 

は、どのように私は、テキストには「最初は」存在しない場合でも、「第2」と「第三」のこのコマンドの仕事を交換することができますか?ご協力いただきありがとうございます。

答えて

4

あなたは:h :s_flagsに記述されている自分の置換コマンドのそれぞれにeフラグを追加することができます。

[e]  When the search pattern fails, do not issue an error message and, in 
    particular, continue in maps as if no error occurred. This is most 
    useful to prevent the "No match" error from breaking a mapping. Vim 
    does not suppress the following error messages, however: 
     Regular expressions can't be delimited by letters 
     \ should be followed by /, ? or & 
     No previous substitute regular expression 
     Trailing characters 
     Interrupted 

それは与える:

com! MyFR %s/first/1st/ge | %s/second/2nd/ge | %s/third/3rd/ge 

を別の解決策をマージするだろうすべての置換を単一のものにする:

com! MyFR %s/\vfirst|second|third/\={'first': '1st', 'second': '2nd', 'third': '3rd'}[tolower(submatch(0))]/g 

今回、置換部分では、リテラル文字列を使用する代わりに式を使用します(:h s/\=参照)。ここで、式は辞書の所与の値である。

辞書のキーはすべて一致した可能性のあるテキストで、値はその置換文字です。

あなたが辞書から検索した値がマッチしたテキストに評価しtolower(submatch(0)):h submatch()を参照)、その小文字版の正規化された(すべて大文字の文字がtolower()を通じて小文字の対応になっている)です。

+0

はい、 '' ge''は単純なオプションであり、動作します。ありがとう。 – rnso

+0

辞書をうまく使用していますが、あまりにも正確に一致していますか? –

+0

@LievenKeersmaekersああ、あなたは正しい。私はそれを忘れてしまった。この問題を回避するには、 'tolower()'の中に 'submatch()'をラップして一致するテキストを正規化して、キーが常に取得され、 'E716'エラーがないようにすることができます。 – user852573

関連する問題