この記事は弊社(株式会社スタメン)で開催した社内勉強会「Editor.stmn:Vim 入門勉強会 〜 はじめの一歩を踏み出そう 〜」で作成した資料になります。
こちらは勉強会で使用した演習用のリポジトリです。ぜひ本記事とあわせてご活用ください。
https://github.com/KaitoMuraoka/vim-practice
Vimの基本操作を身につける
ターミナル上で対話しながらコードを書き進めるコーディングエージェント、たとえばClaude CodeやCodexの普及によって、ターミナルそのものを使いこなす場面が増えています。
また、サーバーやコンテナの中には、グラフィカルなエディタが入っていない環境が珍しくありません。
そうした環境でもVim(あるいはその前身であるvi)はたいてい最初から入っており、SSH接続した先で設定ファイルを直す、といった作業にそのまま使えます。
この勉強会は、ターミナルの中で完結する編集手段である「Vim」の第一歩を歩き、素晴らしきVimの世界へ入門しよう、な会になります。
Vimのインストール
まずは Vim をインストールしないと全てが始まりません。そのため、vi, Vim, Neovim をインストールして使ってみましょう。
すでに GUI エディタや IDE、 Emacs を使っている人は Vim のキーバインドで作業ができる拡張機能があるので、そちらを導入すると良いでしょう。
以下に、Vim のインストール方法、拡張機能について追記します。
普段、使い慣れたエディタに導入することをオススメします。
- vi:多くのUnix系OS(macOS、Linuxなど)に標準搭載されているため、追加のインストールは不要な場合がほとんど
- Vim:公式サイトの手順でインストール
- Neovim:公式サイトの手順でインストール
-
Emacs:Vim互換の
evilパッケージを導入(M-x package-installでevilをインストールし、設定ファイルに(require 'evil)と(evil-mode 1)を追加) - VSCodeとCursorなど:拡張機能パネルで「Vim」を検索し、vim 拡張機能をインストール
- Xcode:拡張機能は不要。メニューバーの「Editor」→「Vim Mode」を選択するだけで有効化
- Android StudioとJetBrains製IDE(IntelliJ IDEA、PyCharmなど):「Settings」→「Plugins」→「Marketplace」から「IdeaVim」を検索してインストールし、IDEを再起動
これらの拡張機能やプラグインは、移動や編集といった基本操作の大部分を再現しますが、実装はVim本体そのものではありません。
そのため、:wqのようなCommand-lineモードのコマンドが一部サポートされていないなど、細かな挙動の違いが残ることがあります。
モードという仕組み
Vimを使ってまず戸惑うのは、キーボードのキーを押しても文字が入力されない、という体験です。
これはVimがモーダルエディタという仕組みを採用しているためです。
モーダルエディタとは、同じキーでも今どの「モード」にいるかによって働きが変わるエディタを指します。
Vimには次の4つのモードがあります。
- Normalモード:文字の移動や削除、コピーなど、編集の指示を出すモード(起動した直後はこのモードです)
- Insertモード:文字を入力するモード
- Visualモード:範囲を選択するモード
-
Command-lineモード:
:から始まるコマンドを実行するモード(保存や置換など)

出典: cs61a
実際、多くのエディタでは、文字入力用のキーとカーソル移動用のキーが分かれておらず、移動や削除にはCtrlキーとの組み合わせを多用します。(Ctrl + C でコピーなど)
Vimは逆に、Normalモードにいる間はほぼすべてのキーに編集コマンドとしての意味を持たせています。
そのため、指をホームポジションから離さずに、移動や削除、コピーの大半をこなせます1。
Insertモードで文字を入力し終えたら、EscキーでNormalモードに戻ります。
この「Insertで打って、Escで戻る」という往復が、Vimでの編集の基本の型になります。
操作の途中で、今どのモードにいるかわからなくなったり、意図しない文字が入力されたりすることがあります。
そうしたときはEscキーを押せば、たいていの場合Normalモードに戻れます。
迷ったらまずEscを押す、という単純なルールがあれば、初めてVimに触れるときでも操作に迷いにくくなります。
絵を描くようにコードを書く
初心者にとっては「なぜノーマルモードがあるのか」と疑問に思います。
私は Vim を操作することは絵を描くのと同様だと思っています。
画家は絵の具をキャンバスに塗りつけるのが仕事の全てではありません。絵筆を握る前に
- 構図を考える
- 光源の調節
- 絵の具を混ぜ合わせて新しい色を作る
などさまざまなことを考えるでしょう。
プログラマも同様です。コードを書くだけがプログラマの仕事ではありません。
- 設計について考えこと
- 参考資料に目を通す
- コードの整形
- 関数のジャンプ(コードリーディング)
つまり、Vim を使う動作は画家が絵を描くのと似た動作を行います。
画家が絵を描くように、プログラマは Vim でコードを描くのです。
カーソルを動かす
Normalモードでのカーソル移動には、h j k lの4キーを使います。
hは左、lは右、jは下、kは上に1文字(1行)動きます。
1文字単位の移動に加えて、単語単位の移動もできます。
wはカーソルを次の単語の先頭へ、bは前の単語の先頭へ、eは今の単語(または次の単語)の末尾へ移動します。
行の中での移動には0と$を使います。
0は行の先頭、$は行の末尾にカーソルを移動します。
ファイル全体での移動にはggとGを使います。
ggはファイルの先頭、Gはファイルの末尾に移動します。
これらの移動コマンドの前に数字を置くと、その回数だけ移動を繰り返せます。
たとえば3jは3行下へ、5wは5単語先へ移動します。
この「数字+コマンド」という組み合わせ方は、このあとの削除やコピーのコマンドにもそのまま使えます。
文字と行を編集する
Insertモードには複数の入り方があり、カーソルがどこに置かれるかがそれぞれ違います。
-
i:カーソル位置の直前から入力を開始 -
a:カーソル位置の直後から入力を開始 -
o:カーソル行の下に新しい行を作って入力を開始 -
O:カーソル行の上に新しい行を作って入力を開始 -
I:行の先頭に移動してから入力を開始 -
A:行の末尾に移動してから入力を開始
削除にも複数のコマンドがあります。
xはカーソル位置の1文字を削除し、ddはカーソルのある行を丸ごと削除します。
dwはカーソル位置から単語の末尾までを削除し、Dはカーソル位置から行末までを削除します。
削除したテキストは消えてなくなるわけではなく、Vim内部に保持されています。
yyでカーソルのある行をコピー(Vimではこれを「ヤンク」と呼びます)し、pでカーソルの次の行に、Pでカーソルの前の行に貼り付けられます。
ddで削除した行も同じしくみで保持されるため、ddの直後にpを押せば、行の削除ではなく行の入れ替えとして使えます。
操作を間違えたときはuでUndo(直前の操作を取り消す)します。
取り消しすぎた場合はCtrl-rでRedo(取り消しをやり直す)します。
検索して置き換える
文字列を検索するには、Normalモードで/に続けて検索したい文字列を入力し、Enterを押します。
/hello
検索を実行すると、最初に見つかった箇所にカーソルが移動します。
同じ方向に次の候補を探すにはn、逆方向に探すにはNを押します。
見つけた文字列を一括で置き換えるには、Command-lineモードから:%sコマンドを使います。
:%s/before/after/g
このコマンドは、ファイル全体(%)を対象に、beforeという文字列をafterに、行内のすべての一致(g)について置き換えます。
gを付けなければ、各行で最初に一致した1箇所だけが置き換わります。
保存して終了する
編集した内容を保存するには:w、Vimを終了するには:qをCommand-lineモードで実行します。
保存と終了を同時に行いたいときは:wqとまとめて入力します。
一方、保存せずに変更を破棄して終了したい場合は:q!を使います。
!は「保存されていない変更があっても構わず実行する」という指示で、ほかのコマンドでも同様の意味で使われます。
勉強会の後に
ここまでの内容だけでも、ファイルを開いて、動いて、直して、保存して閉じる、という一通りの作業がこなせるようになります。
Vimには本記事で扱っていない機能や、.vimrc(Neovimではinit.lua)による設定のカスタマイズなど、この先も学べる領域が広がっています。
Vimに標準で同梱されているvimtutorというチュートリアルを使えば、ここで扱った内容を一人でも復習できます。
-
hjklが移動キーに使われているのは、viが開発された当時に使われていたキーボード(ADM-3Aなど)に矢印キーが独立して存在せず、これらのキーに矢印の刻印があったことに由来すると言われています。 ↩