AI時代にVimを学ぶ意味 - Vim初心者が過ごした夏の記録

に公開

はじめに

こんにちは。株式会社スペースマーケットで内定者インターンをさせていただいているh4luです。

この夏密かに触っていたものがあります。
それがタイトルにもあるように「Vim」です。

と言っても、触っているのは純正のVimではなくVSCode及びObsidianでVimプラグインを入れて遊んでいるだけですが。
まずはVimに慣れようということで、普段から使っているアプリケーションにVimらしさを取り入れてみました。

本記事では、Vim初心者が実際に使ってみて気づいたことや感じたことを、率直にお伝えしていきます。

対象読者:

  • Vim...聞いたことはあるけど...という方
  • エディタの話?素直にVScodeやCursor使いなよ

本記事の内容:

  • Vimのなにが良いのか
  • 初心者がVimに触れてみた感想

本記事で話さない内容:

  • 基本的なVim操作
  • Vimチュートリアル的な話題

Vimとの出会い

私のVimとの出会いは、Gitのコミットメッセージ編集時でした。
その頃はGitすらも触り始めたてでしたので、突然現れた見慣れない画面にGit側の仕様なのかと疑いました。
キーボードを叩いて文字が入力される時とされない時を幾度か繰り返し、マウスでカーソル移動を試みるも反応しない。
私はただ、ほんの少しコミットメッセージを編集したかっただけなのに......。

という苦い出会いでした。
何が起きているんだと調べた結果、どうやら:wqでこの迷宮から抜け出せるらしいことを突き止めました。
なぜこれで抜け出せるかも釈然としなければ、:wqという馴染みない文字列にドン引きしながらも、しかしこのコマンドを叩けば元の平穏なターミナルに戻れたのですから、まさに狐につままれたような体験として記憶に残っています。

Vimとは

さて、Vimとは一言でいうと「キーボード操作に最適化されたテキストエディタ(およびその操作体系)」です。

ここで、Vimの最大の特徴であるモードについて触れておきましょう。
Vimには主に以下のモードがあります。

  • Normalモード(通常モード)
    カーソル移動や削除、コピー、検索などの編集操作を行うモードです。コミットメッセージの編集時にキーボードを叩いても文字が入力されなかったのはこれが原因です。

  • Insertモード(挿入モード)
    文字を入力するモードです。通常のエディタと同じように、打った文字がそのまま画面に表示されます。

  • Visualモード(選択モード)
    テキストを範囲選択するモードです。矩形選択など、高速な選択操作が可能になります。

「マウス使えば良くない?」

Vimをふんわり認知していた頃の私がそう感じていたように、同じ疑問を持たれた方もいらっしゃるかもしれません。

ですが、実はみなさんも普段から似たようなことをやっていると思います。

例えば:

  • Ctrl + C(コピー)
  • Ctrl + V(ペースト)
  • Ctrl + S(保存)

これらのショートカットを知らずに、全てマウスで操作していたPC初心者時代に戻れるでしょうか。

「コピーしたい文章をマウスで選択して、右クリックして、メニューからコピーを選んで、貼り付けたい場所にカーソルを合わせ、右クリック、ペーストを選んで......」

この手順にノスタルジーを感じることはあっても、戻りたいとは思わないはずです。

Vimが愛される理由はそこにあると思います。
一度覚えてしまえば、マウスに手を伸ばす時間すら惜しくなる、そんな効率性をVimは提供してくれるのです。
ここでVimのチートシートをご覧ください。

チートシートをご覧いただくと、各キーに満遍なくコマンドが割り当てられていることがお分かりいただけるでしょう。
ここで重要なのは、これらのコマンドは単体ではなく組み合わせることで真価を発揮するという点です。
ちょうど格ゲーのコンボを想像していただくと分かりやすいかもしれません。
そのため、歴戦のVimmerのコーディング画面は何が起きているのか理解できないほどの速さで進んでいきます。

興味のある方は、ぜひこちらの動画をご覧ください。
https://www.youtube.com/watch?v=cWvAhmfZJZg

Vimのなにが良いの?

Vimに限ったことではありませんが、何かを勧められる際、具体的にどんな恩恵が得られるのかを示された方が、イメージしやすいものです。
「VSCodeやCursorで十分では?」という疑問はもっともです。
それでもVimに魅力を感じる理由は、**「キーボードから手を離さない快適さ」と「操作を組み合わせる創造性」**にあります。

まずは例として、以下のユーザー一覧を表す配列を、Vimコマンドを使って記述する様子を見てみましょう。

const users = [
  { name: 'Alice' },
  { name: 'Bob' },
  { name: 'Carol' },
  { name: 'Dave' },
];

これは範囲指定を用いて、複数行に対して同じ操作を一括で行うコマンド(Visualモード)を使っています。Ctrl+Vで矩形選択を開始し、複数行を選択してからIで挿入、入力後Escで全行に適用されます。詳しい解説は割愛しますが、このように「繰り返し」をまとめて処理できるのがVimの強みです。

変数名の一括変更

もう少し実用的な例も見てみましょう。コードを書いていると、変数名を一括で変更したい場面がよくあると思います。そんな時のVimの使い方をお見せします。

では、これが何をしているのか、順を追って見ていきましょう。

使用しているコマンド

まず、それぞれのコマンドの役割を理解しておきましょう。

*: カーソル下の単語を検索
c: テキストを削除してそのままInsertモードに入る
w: 「次の単語の先頭まで」という範囲指定
n: 直前の検索の次の出現箇所へジャンプ
.: 直前に実行した操作を繰り返す

実際の動作の流れ

これらを組み合わせた*cwn.は、特定の単語を連続して書き換える際のテクニックの一つです。

  1. * - カーソルの下の単語を検索
  2. cw - その単語を変更して新しい文字を入力
  3. n - 次の単語へジャンプ
  4. . - さっきの変更(cwで入力した内容)を繰り返す

つまり、**「この単語を探して → 書き換えて → 次を探して → 同じ変更を適用」**という流れを、n.を連打するだけで繰り返せるのです。

今回の例では2箇所しか変更していませんが、変更箇所が10箇所、20箇所と増えたときの効率の良さは、想像に難くないでしょう。

ここでお見せしたのは、あくまで一つのアプローチです。例えば:%s/oldName/newName/gのような置換コマンドを使えば、ファイル全体を一括で置換することもできます。

目的は同じでも道は無数にあり、状況が変われば最適解も変わります。
自分の「手札」を増やし場面に応じて使い分けていくことにゲーム性すら感じられる、と言っても過言ではありません。

偏見かもしれませんが、エンジニアはこういった「個人に内在する暗黙知」を育てることに惹かれる生き物だと思っています。

今のAI時代において、変数名の修正もAIにプロンプトを投げた方が早く済むでしょう。
テストデータもCopilotの補完で十分、と言われればその通りかもしれません。

ですが、自分の道具を育てる楽しさや手に馴染んでいく感覚、それ自体に価値を感じるならVimは最高の遊び場になり得ます。
趣味性を認めましょう。エンジニアリングは効率だけじゃない。カッコいいと思えるものを使う、それで十分な理由になります。


Vimマクロ

せっかくですので、もう少し踏み込んだ話題にお付き合いください。
Vimには「マクロ」という機能があり、これをいかに使いこなすかが、Vim習熟度の一つの指標になるとも言われています。
Vimマクロとは、一連のコマンドを記録しておくことで、繰り返し作業を自動化できる機能です。

こちらも実際の動きをご覧いただきましょう。
先ほどのユーザー一覧を表す配列を、今度はマクロを使って記述してみます。

最初にお見せした例では、範囲指定を用いて複数行に一括で同じ処理を施すというものでした。対して今回は、コマンドを記録してそれを繰り返し呼び出す、という異なるアプローチを取っています。

Vimマクロの利点は、記録したコマンドの再利用性です。
どういうことか、さらに具体例で見てみましょう。
以下のような配列を新たに作成する必要が出たとします。

const locations = [
  { city: 'Tokyo' },
  { city: 'Osaka' },
  { city: 'Kyoto' },
  { city: 'Sapporo' },
  { city: 'Fukuoka' },
  { city: 'Nagoya' },
];

先ほど記録したマクロを呼び出せば、{ name: 'hoge' },という形式で所定の位置に自動で記述してくれます。
すでに私たちは文字列を簡単に置換できる術を手にしていますのでnamecityに書き換えることなど、もはや造作もないことです。

マクロの基本要素

基本的なマクロの構文はq<文字>...q パターンに従います。

  • q<文字> - レジスタ(a-z)への記録開始
  • <コマンド> - 記録したい操作を実行
  • q - 記録停止
  • @<文字> - マクロを実行
  • @@ - 最後に実行したマクロを繰り返す
  • <数字>@<文字> - マクロを複数回実行

簡単に言えば、a〜zの各文字にコマンドの組み合わせを保存でき、それを好きなタイミングで呼び出せるということです。10回繰り返すといった回数指定まで可能なのです。

マクロを組む上で大切なのは、カーソルがどこにあっても確実に動作する汎用性です。
「単語の先頭にカーソルがある時だけ動く」マクロよりも、「行のどこにカーソルがあっても期待通りに動く」マクロの方が使いやすいのは明らかです。

そのため、実用的なマクロは位置決めコマンド(0^)で開始し、次のターゲットへの移動(jn)で終了するように設計することが推奨されます。こうすることで、一貫した動作が保証され、繰り返し実行もスムーズになります。

先ほどお見せしたマクロを分解してみましょう。
マクロの記録:

  1. qa - レジスタaへの記録を開始
  2. ^ - 行頭に移動
  3. i - Insertモードに入る
  4. { name: ' - テキストを入力
  5. <Esc> - Normalモードに戻る
  6. A - 行末に移動してInsertモードに入る
  7. ' }, - テキストを入力
  8. <Esc> - Normalモードに戻る
  9. j - 次の行へ移動
  10. q - 記録を終了

マクロの実行:
11. 3@a - 記録したマクロを3回連続実行

これにより、残りの3行に同じ処理が一瞬で適用されます。

感想

プラグインから純正Vimへ

最初はVimに慣れるため、日頃使うObsidianやVSCodeにVimプラグインを入れて遊んでいましたが、マウス操作前提のアプリケーションでVimらしさを再現しようとすること自体が、かえって開発体験を下げているのではと感じるようになりました。

Vimの公式ドキュメントを見て「これ使ってみたい」と思っても、VSCode Vimではサポートされていないことが度々あり、そのたびにもどかしさを感じます。

であれば、素直にVim本体に向き合い、自分好みに試行錯誤しカスタマイズし育てていく方が、よっぽど楽しそうです。

日本語との相性

日本語入力との相性には課題がありますが、メモアプリObsidianでの使用なので、多少の体験の悪さは許容しています。
ただ、InsertモードからNormalモードに戻る際、何度「っj」が表示されたことか。(<Esc>は位置的に遠いのでjjをモード切り替えとして使っていますが、日本語入力との相性が悪いらしくこの現象が頻発します。)

AI時代のVim

今を生きる若手エンジニアにとって、AIの話からは逃れられません。

散々「コーディングの効率が上がる」とVimについて語ってきましたが、効率性を求めるのであればAIで結論づいてしまいます。Vimを一から学ぶよりAIツールを極める方が投資対効果は高いでしょう。

技術の変遷が早い業界だからこそ、技術トレンドに敏感である能力は重要です。AI時代に言語化スキルが必要なことも承知しています。
ですが、自分が純粋に好きなもの、楽しいと感じるものに費やす時間も同じくらい大切だと思うのです。

自分の中の全てを言語化できなきゃいけないわけではありません。
「なんとなく気持ちいい」「使っていて楽しい」という、低レイヤーのシンプルな気持ちも大切であり、どれほど丁寧に言葉にしても完全には他者と共有できない自分だけの感覚です。
効率を最優先する人も、趣味性を大事にする人も、どちらも正解です。

少しVimの話から逸れてしまいました。

この夏、Vimというツールに触れてみて、新しい(古典的な)世界の可能性を少しだけ垣間見ることができました。
次のステップはVimやNeovimへの挑戦です。
まだまだVimの入り口に立ったばかりですので、.vimrc, init.luaをカスタマイズして自分好みの環境をじっくり構築していきたいです。

最後に、本記事ではVimの基本的な操作には触れていないので、もし少しでもVimに興味を持たれた方は以下で紹介する動画を視聴してみてください。

https://youtu.be/UP0oV_1Q0Q8?si=1uqzvLI1BDfT9_T-

https://youtu.be/RSlrxE21l_k?si=Xp8DZlYDPtTIXAyv

スペースマーケット Engineer Blog

Discussion