2012-03-17 3 views
1

すべてのキーワードが大文字の場合は、かなり長いSQLスクリプトがあります。私はそれらを小文字に変更したいが、文字列リテラルと私自身の識別子の正確な値を保持する。
たとえば、このテキストで:すべての大文字を小文字に変更する方法はありますが、Vimの文字列リテラルを除外する方法

KEYWORD BEFORE 'SOME STRING LITERAL' KEYWORD AFTER 
mixedCaseValue 
MY_OWN_VARAIBLE 
UGLY APPERCASE KEYWORDS, other text 

私は「の前にキーワード」だけをしたい、「KEYWORD AFTER」と最後の「UGLY大文字KEYWORDS」が小文字とそのまま左の他のすべてのことにします。
:%s/\<\u\+\>/\L&/gのようなものを使用すると、最初の行の引用符内のテキストも影響を受けます。

ご意見はありますか?

+0

これは役に立ちますか?私はあなたが必要とするものは何もわかりません - http://vim.wikia.com/wiki/Switching_case_of_characters – Coffee

+0

プログラミング言語で文字列リテラルのより厳密な構文的定義を詳しく教えてくださいつかいます?これらの一重引用符で囲まれた文字列リテラルは、複数の行にまたがることはできますか?文字列リテラル内に一重引用符をエスケープする構文はありますか? –

答えて

1

その文字列リテラルは複数行にまたがらないと仮定すると、それは何の構文 はありません文字列リテラル内の単一引用符をエスケープする場合は、置換コマンドに続く。

:%s/\%(^\%([^']*'[^']*'\)*\)\@<=[^']\+/\=substitute(submatch(0),'\<\u\+\>','\L&','g')/g 
+0

ほとんどの場合動作します。私の例で実行すると、 'mixedCaseValue'と' MY_OWN_VARAIBLE'も変更されます。しかし、今私はどの方向へ行くかを知っています。ありがとう! – east825

+0

@ east825:文字列リテラル以外のすべてを小文字にするのではなく、すべて大文字の小文字だけを小文字にしたいと思いました。私が提案したコマンドは、それを行うために変更することができます。してください、答えの更新を参照してください。 –

+0

WOW!それは巨大です!そして、それは私が欲しかったのとまったく同じように働くようです(少なくとも一見すると)。私はあなたが勝者だと思います。今私はVimの助けを借りて、それが何であるかを理解するために時間を費やす必要があります) – east825

2

一つの方法:

:%v/'/s/\(^\|\s\)\@<=\u\+\(\s\|,\)\@=/\L&/g 

説明:

%      # Range: All file. 
v/pattern/command  # Apply command to all lines that doesn't match pattern 
'      # The pattern, so apply substitution to lines that doesn't have it. 
s/string/replacement/ # Replacement command. 
\(^\|\s\)\@<=   # Zero-width preceding match: Beginning of line or a space. 
\u\+     # One or more alphabetic uppercase letters. 
\(\s\|,\)\@=   # Zero-width positive match: Space or comma. 
\L&     # Lowercase the string matched 
/g      # Apply globally: Many times for each line. 

結果:

'SOME STRING LITERAL' 
mixedCaseValue 
MY_OWN_VARAIBLE 
ugly appercase keywords, other text 
+0

ニースのソリューション!私は以前は '\ @<='と '\ @ ='について知りませんでした。私はそれが初めにv /がなければさらに良くなると思った。そのため、このパターンは文字列リテラルと同じ行のupperaceキーワードと一致しません(例ではこのような例は表示されませんでした)。また、少なくとも$の内側の2番目のカッコで、行の最後にキーワードを一致させます。 – east825

+1

@ east825:はい。あなたが正しいです。それはあなたの例のための特定の解決策ですが、他の多くのケースでは失敗する可能性があります。他の可能性であなたの例を完成すれば、より多くのユーザーがより良いアプローチを提供します。 – Birei

+0

申し訳ありませんが、私の悪い - 'v /'なしでは、引用符で囲まれた大文字の単語(例では 'STRING')も一致します。 – east825

1
私の内部のvimを愛する魂はこれらを書くことcringes

、しかし...

これはあなたが頻繁に行う必要はありません何かあれば、あなただけのcを追加することによって、それをブルートフォースかもしれません置換コマンドにフラグを立てて、各変更の確認を促します。もしあなたが退屈さを覚えることができれば、たくさんのスクリプトをすばやく吹き飛ばすことができるはずです。この方法(短期的に)は、良い代替コマンドを作る時間を費やすよりも速いかもしれません。

また、タッチする必要のない文字列リテラルがいくつかある場合は、それらの文字列を他の文字列に変更して、グローバル置換によって変更されないようにしてから、グローバル置換を行い、それらを元に戻します。また総体的だが効果的。

私は汚れています。

+0

実際に私はすでにそうしていました)私はちょうど誰かがこのような置換を自動的に行うことができる素敵なパターンを知っているかもしれないと思っていました。 – east825