web-dev-qa-db-ja.com

Vimのケース保存代替

this はVimで実行できますか?

つまり、「BadJob」を検索して「GoodJob」に置き換えると、次の置き換えが行われます。

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

abolish.vim を使用します。

:%S/badjob/goodjob/g
105
Mark Lodato

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

そうでなければvimにはサポートがありません...

27
LB40

きっとできる

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

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

10
fc.

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

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

検索パターンとは別に、置換コードの4つの'strings'を編集する必要があります。boldのパーツを編集します。

:%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#??説明させてください…(興味があれば。)

#==#および others でも)は大文字と小文字を区別します。それ以外の場合、: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"strings は別の良い習慣です: http://google.github.io/styleguide/vimscriptguide.xml?showone = Strings#Strings


HT @fc。 -この回答は answer に基づいており、いくつかの欠点を修正しています。

6
Aaron Thoma

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

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

keepcaseプラグインの代替手段は SmartCase-元の大文字小文字を保持したまま単語を置き換える です。 (悪い評価に落胆させないでください。)

2
Ingo Karkat