Vimで大文字・小文字を変換する方法まとめ(範囲指定/1文字/置換)
変数名の大文字小文字を統一したいだけなのに、消して打ち直すのは面倒です。Vimには範囲や場面ごとに複数の変換コマンドが用意されています。一通り知っておくと、その場に応じて一番速い方法を選べるようになります。
| キー | これだけ覚える |
|---|---|
| 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や$など任意のモーション・テキストオブジェクトと組み合わせられます。ビジュアルモードで範囲を目視確認する手間を省きたいときは、こちらのほうが速くなります。
大文字と小文字を反転する
~ " カーソル下の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とノーマルモードのアンドゥを混同しかけたことは今でもあります。
まとめ
大文字小文字変換にはビジュアル選択・オペレータ・1文字反転・置換コマンドと複数の手段があります。ビジュアルモードのU/uとノーマルモードのアンドゥの混同については別記事で詳しく触れています。