Vimのu/Uキーがアンドゥと大文字小文字変換の二重の意味を持つ理由
大文字化しようとしてUを押したら、変換されるどころか行が丸ごと元に戻った。ビジュアルモードに入っていたつもりが、実際はノーマルモードのままだった、というのはVimでありがちな事故だ。原因はu/Uが、モードによってまったく違う意味を持つキーだからだ。
同じキーでも、モードで意味が変わる
| キー | ノーマルモード | ビジュアルモード |
|---|---|---|
u | アンドゥ | 選択範囲を小文字化 |
U | 直近に変更した行をまとめてアンドゥ | 選択範囲を大文字化 |
ノーマルモードのUは「アンドゥ」と聞くと意外に感じるかもしれないが、正確には「直近に一括で変更された行の内容を、変更前に戻す」コマンドで、u(1手ずつ戻す一般的なアンドゥ)とは少し性質が違う。いずれにせよビジュアルモードの変換とは無関係な機能だ。
なぜこの割り当てになっているのか
ノーマルモードのu/UはVi時代から存在するアンドゥ系のコマンドで、ビジュアルモードはVimになってから追加された機能だ。ビジュアルモードでは、範囲を選択した状態でu/Uを押すという操作自体がアンドゥとして意味を持たないため、そこに大文字小文字変換という別の機能を割り当てても衝突しない。Vimの多くのキーはこうして「モードが変われば同じキーでも別の役割を持てる」という前提で設計されている。
他のモードではどうか
ノーマルモード・ビジュアルモード以外でもu系のキーは登場する。挿入モード中にCtrl-o uのように一時的にノーマルモードへ抜けて実行すれば、そこではやはりアンドゥとして働く。モードをまたいで同じキーが使い回されているという前提さえ頭に入っていれば、どの文脈でも動作を予測しやすくなる。
混同を避けるコツ
一番確実なのは、変換前に画面下部を見てビジュアルモードに入っているか確認する癖をつけることだ。ノーマルモードなら何も表示されず、ビジュアルモードなら-- VISUAL --のような表示が出る。急いで操作しているときほど確認を飛ばしがちなので、意識してワンテンポ置くとよい。
もう1つの回避策は、大文字小文字変換にビジュアルモードのU/uではなく、ノーマルモードのオペレータgU/guを使う習慣に切り替えることだ。こちらはアンドゥのキーと文字が重ならないため、そもそも混同しようがない。具体的な使い方は大文字小文字変換まとめで扱っている。
gU/guに寄せてしまうのが根本的な解決になる。
急いでいるときに何度か行アンドゥとの取り違えをやらかしてから、大文字小文字変換はgU/guに切り替えた。ビジュアルモードのU/uより1文字多いが、間違えて行が消える心配がなくなったので、結果的にこちらのほうが速く安心して使えている。
まとめ
u/Uはノーマルモードとビジュアルモードで役割が完全に別物になる。混同が不安な人は、大文字小文字変換をgU/guに寄せてしまうと事故を根本的に避けられる。