Vimでのケース保存代替


154

することができ、これは Vimの中で行うことができますか?

つまり、「BadJob」を検索して「GoodJob」で置き換えると、次のように置き換えられます。

'badjob' -> 'goodjob'  
'BadJob' -> 'GoodJob'  
'badJob' -> 'goodJob'  
'BADJOB' -> 'GOODJOB'

16
これはvim機能でなければなりません。それはとても理にかなっています。
バッハ、

回答:


120

abolish.vimを使用します

:%S/badjob/goodjob/g

13
私たちはティム・ポープに値しません。
Andrew Keeton

1
このプラグインは私にはうまくいかないようです。のような単語BadJobをに置き換えたい場合、GoodJob使用できません%S/badjob/goodjob/g。一致を検出できません。
ロイマンソン

@Roymunson実行する必要があるのは次のとおりです%S/BadJob/GoodJob/g。それから、Subvertコマンドは大文字小文字混合モードに切り替わり、OPで指定されたすべての置換を実行します。
シバム

28

これがあなたが探している種類の解決策であるかどうかわかりません...しかし、私はこれを使用しました: keepcase.vim

それ以外の場合、vimでのサポートはありません...


11

確かにできます

:s/\cbad/\= strpart(submatch(0), 0 ,1) == toupper(strpart(submatch(0), 0, 1)) ? "GOOD" : "good"/

ps。私はkeepcase.vimがいくつかの同様のロジックをカプセル化していると思います:)


はい、2007年以降です。:%SubstituteCase / \ cbadjob / GoodJob / g ^^
Luc

gVim 7.2以降の意味?:(私はのgvim 7.1(12月- 2007年)で、それを試してみましたが、それが仕事をdin't
FC。

いいえ、2007年に:SubstituteCaseコマンドをプラグインに追加しました。以上です。プラグインはvim.orgで入手でき、ほとんどのプラグインでは通常のようにvimに同梱されていません。
Luc Hermitte、

1.ユーザーがを持っている場合、これは失敗します:set ignorecase。2.の代わりににBad置き換えられGOODますGood。3. job質問の「」の部分は無視されるため、これもlambada→に置き換わりlamgoodaます。これらのバグの修正と説明、および私の回答のその他のいくつか。(また、LOLOWLs!)
アーロントーマ

7

これを貼り付けて調整することができます:(
もちろん、これを時々行う場合は、この怪物ではなくプラグインが必要になります。しかし、急いでいて一度だけ必要な人のために、これは簡単なハックですあなたの貼り付けの喜びのために:)

:%s/\cbad\zejob/\= ( submatch(0)[0] is# toupper(submatch(0)[0]) ? 'G' : 'g' ) . ( submatch(0)[1] is# toupper(submatch(0)[1]) ? 'OOD' : 'ood' )

検索パターンとは別に、置換コードの4つの'文字列を編集する必要があり'ます。太字の部分を編集します

:%s / \ c bad \ ze job / \ =
(submatch(0)[0] is#toupper(submatch(0)[0])? ' G ': ' g ')。
(submatch(0)[1] is#toupper(submatch(0)[1])? ' OOD ': ' ood ')

この「オレンジ」バージョンを貼り付けに使用しないでください。改行文字もコマンドを破壊するためです。

/\ze ポジティブな先読みをマークするためのvim正規表現構文糖:後のパターン \zeがチェックされますが、置換されません。


is#?? 説明させてください…(もし興味があれば)

#(また、中==#及び他の)大文字と小文字の区別を強制。それ以外の場合、:set ignorecase(私が使用するので、これは便利に必要なので:set smartcase)、vimは考慮します'a' == 'A'!!

クレイジーであるので、実際に説明する必要があります。これはユーザー設定に依存するため、==NEVARを使用する必要があります。 (実際に必要な場所を除きます。)==#整数を比較するときに使用する推奨事項にも従います。 http //learnvimscriptthehardway.stevelosh.com/chapters/22.html#code-defensively

is#代わりに、==#防御的にコーディングする別の方法です:タイプセーフを改善します。 ます。http //google.github.io/styleguide/vimscriptguide.xml?showone = Type_checking#Type_checking
文字列リテラルと比較するときに使用する必要があります。

'single-quoted'"double quoted" 文字列の代わりに別の良い習慣がありますhttp : //google.github.io/styleguide/vimscriptguide.xml?showone=Strings#Strings


HT @fc。-この答えは、彼らの上に構築答え少数の欠点を固定し、。


4

大文字と小文字を区別して正確な(大文字と小文字を区別しない)文字列のみを照合する場合、別の可能性は次のとおりです。

:s/abc/\={'abc':'xyz','Abc':'Xyz'}[submatch(0)]/i

2

keepcaseプラグインの代わりに、SmartCaseを使用して、元のケースを保持しながら単語を置き換えることができます。(悪い評価に落胆しないでください。)


1
次のようなコマンドを入力するのが面倒で覚えにくいものを短縮するためのトリックはあります:%s/file\A\?size/\=SmartCase("LastModifiedTime")/ig
MichaelHärtl2014年

@MichaelHärtl::SmartCaseコマンドを使用できます。私は自分のフォークでそれを拡張しました。これには依存関係としてingo-libraryが必要であることに注意してください。
Ingo Karkat 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.