Vimで大文字・小文字を変換する方法まとめ(範囲指定/1文字/置換)
変数名の大文字小文字を統一したいだけなのに、消して打ち直すのは面倒です。Vimには範囲や場面ごとに複数の変換コマンドが用意されています。一通り知っておくと、その場に応じて一番速い方法を選べるようになります。
目次(11項目)
| キー | これだけ覚える |
|---|---|
| gUiw / guiw | カーソル位置の単語を大文字化 / 小文字化 |
| ビジュアルモードでU / u | 選択範囲を大文字化 / 小文字化 |
| ~ | カーソル下の1文字を反転 |
| gUU / guu | 行全体を大文字化 / 小文字化 |
ビジュアルモードで範囲選択して変換
v{範囲選択}U " 大文字化
v{範囲選択}u " 小文字化
目で見て選んだ範囲をそのまま変換できるので直感的で、最初に覚える人が多い方法です。ただしノーマルモードのu(アンドゥ)・U(行単位のアンドゥ)と同じキーのため、ビジュアルモードに入っているかを確認せずに打つと、意図と違う結果になることがあります。
ノーマルモードでモーション指定して変換
gUiw " カーソル位置の単語を大文字化
guiw " カーソル位置の単語を小文字化
gUU " 行全体を大文字化(guuの逆)
guu " 行全体を小文字化
hello world
HELLO world
gU/guはオペレータなので、iwや$など任意のモーション・テキストオブジェクトと組み合わせられます。ビジュアルモードで範囲を目視確認する手間を省きたいときは、こちらのほうが速くなります。
maxRetryCount の上で gUiw を押したところ大文字と小文字を反転する
~ " カーソル下の1文字を反転
g~iw " 単語全体を反転
hello
Hello
~はカーソル下の1文字だけを大文字↔小文字に反転します。[count]を前置きすれば複数文字をまとめて反転できます。g~はオペレータ版で、gU/guと同じ要領でモーションと組み合わせられます。
反復と組み合わせる
gUiwやguiwのようなオペレータ系のコマンドは、実行後に.(ドットコマンド)で同じ変換を繰り返せます。次の単語へwで移動して.を押すだけで、選択操作を挟まずに複数の単語を次々に変換できます。ビジュアルモードのU/uは選択の手間が毎回発生する分、この繰り返しやすさでも差が出ます。
ファイル全体を一括変換する
単語や行単位だけでなく、ファイル全体をまとめて変換したい場面もあります。ビジュアルモードで全選択してから変換する方法と、オペレータとモーションを組み合わせる方法の2通りがあります。
ggVGU " ビジュアルモードで全選択してから大文字化
gggUG " オペレータ+モーションで先頭から末尾まで大文字化
ggVGUは、ファイル先頭(gg)に移動してから行単位ビジュアルモード(V)に入り、末尾(G)まで選択して大文字化(U)する流れです。gggUGは、ファイル先頭に移動してからgUオペレータにファイル末尾へのモーションGを渡す、より短い書き方です。小文字化したい場合はUをu、gUをguに置き換えれば十分です。
置換コマンドで変換する
正規表現の置換パターンの中でも大文字小文字を制御できます。
:s/\(.*\)/\U\1/ " マッチ全体を大文字化
:s/\(.*\)/\L\1/ " マッチ全体を小文字化
:s/\<./\u&/g " 各単語の先頭だけ大文字化
\U/\Lはそれ以降を大文字/小文字化、\u/\lは次の1文字だけを大文字/小文字化します。複数行にまたがる一括変換や、条件付きの変換をしたいときに向いています。
最初はビジュアルモードのU/uしか知らず、単語単位の変換のたびに選択操作を挟んでいました。gUiwを覚えてからは選択の手間が消え、変数名を書き換える作業がかなり速くなりました。ただしビジュアルモードのu/Uとノーマルモードのアンドゥを混同しかけたことは今でもあります。
変換されない文字がある
日本語・数字・記号には大文字と小文字の区別がないので、これらの上で gU や ~ を使っても何も変わりません。英数字混じりの行に gUU をかけても、日本語の部分はそのまま残ります。
そのため、範囲を細かく選ばずに行ごと処理しても副作用が出にくくなっています。「英字だけを大文字にしたい」というときに、わざわざ英字の範囲を選ぶ必要はありません。
ただし全角の英字(ABC)は英字として扱われ、変換の対象になります。全角と半角が混ざったファイルでは、意図しない箇所が変わっていないか確かめてください。
命名規則を変換する
スネークケースをキャメルケースに変えたい、といった変換は置換で書けます。\u は次の1文字だけを大文字にするという指定です。
:%s/_\(\l\)/\u\1/g " foo_bar → fooBar
:%s/\(\l\)\(\u\)/\1_\l\2/g " fooBar → foo_bar
2つめは、小文字の直後に大文字が来る場所にアンダースコアを入れ、その大文字を小文字にしています。範囲を絞りたいときは % の代わりに行番号や選択範囲を指定してください。
~ をオペレータに変える
~ は既定では1文字ずつ処理する例外的なキーですが、set tildeop を書くとオペレータとして振る舞います。この設定を入れると ~w で単語1つ、~~ で1行という書き方に変わります。
set tildeop
~iw " 単語の大小を反転(g~iw と同じ)
~~ " 行全体を反転
そのぶん、これまでどおり1文字だけ反転したいときは ~l と打つことになります。g~ を使えば設定なしで同じことができるので、無理に入れる必要はありません。u と U の違いで、ビジュアルモードとの使い分けを扱っています。
まとめ
大文字小文字変換にはビジュアル選択・オペレータ・1文字反転・置換コマンドと複数の手段があります。ビジュアルモードのU/uとノーマルモードのアンドゥの混同については別記事で詳しく触れています。gUとguはオペレータなので、モーションやテキストオブジェクトを後ろに置けます。gUiwなら単語まるごと、というように範囲の指定方法は他のオペレータと共通です。
ここで扱ったキーは、ブラウザ上で動くVim道場の大文字と小文字を変えるでそのまま試せます。インストールもログインも要りません。