vimコマンドとは、テキストエディタ Vim で移動・編集・保存を行うためのキー操作のことで、「操作(d・c・y)+範囲(w・$・iw など)」の組み合わせで覚えるのが近道です。サーバーの設定ファイルの修正や Git のコミットメッセージなど、Vim を使う場面はいまも多くあります。

この記事では、よく使うコマンドをモード別の早見表にまとめ、主な操作は Vim 9.1(Ubuntu 24.04 の apt パッケージ)に実際にキー入力を送り、「操作前 → 操作後」のファイル内容を確認して載せています。テキストオブジェクト、確認付き置換、矩形選択、マクロ、:g、レジスタまで扱い、抜けられない・保存できない・スワップファイルの警告・ペーストでインデントが崩れる、といったときの実際のメッセージと対処もまとめました。

検証方法:設定ファイルを読まない vim -N -u NONE で起動し、キー入力を再生して保存後の内容を確認しました。メッセージは tmux で画面を取得しています。最新版は Vim 9.2(2026年2月14日リリース)ですが、この記事のコマンドは 9.1 と共通です。

vimコマンドの早見表(まずはこれだけ)

分類 やりたいこと コマンド
保存・終了 保存 / 保存して終了 :w / :wq(:x、ZZ)
保存・終了 保存せずに終了 :q!(ZQ)
保存・終了 変更を捨てて読み直す :e!
入力 カーソルの前 / 後ろから入力 i / a
入力 行頭 / 行末から入力 I / A
入力 下 / 上に行を追加して入力 o / O
入力 ノーマルモードに戻る Esc
移動 左・下・上・右 h j k l
移動 次の単語 / 前の単語 / 単語末 w / b / e
移動 行頭 / 最初の文字 / 行末 0 / ^ / $
移動 先頭行 / 最終行 / 42行目 gg / G / 42G(:42)
移動 行内の文字「x」へ(次 ;) fx
移動 対応する括弧へ %
移動 半画面下 / 上 Ctrl-d / Ctrl-u
移動 前にいた位置へ戻る Ctrl-o
削除 1文字 / 1行 / 3行 x / dd / 3dd
削除 単語 / 行末まで dw / D
コピー 1行 / 単語 yy / yiw
貼り付け 下(後ろ)/ 上(前) p / P
変更 単語を書き換え ciw
変更 「"」や「()」の中を書き換え ci" / ci(
変更 1文字置換 / 大文字小文字切り替え r / ~
変更 行を連結 J
取り消し 元に戻す / やり直す u / Ctrl-r
繰り返し 直前の変更を繰り返す .
検索 下へ / 上へ、次 / 前 /word / ?word、n / N
検索 カーソル位置の単語を検索 *
置換 全行のすべて / 確認しながら :%s/old/new/g / :%s/old/new/gc
選択 文字 / 行 / 矩形 v / V / Ctrl-v
選択 複数行の先頭に一括入力 Ctrl-v → I → 入力 → Esc
マクロ 記録 / 終了 / 再生 qa / q / @a
一括 パターンに合う行を削除 :g/pattern/d
レジスタ 名前付きでコピー / 貼り付け "ayy / "ap
画面 横分割 / 縦分割 / 移動 :sp / :vs / Ctrl-w + hjkl
タブ・バッファ 新しいタブ / 次のタブ / 一覧 :tabnew / gt / :ls
その他 並べ替え / 数値を増やす :sort / Ctrl-a

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「vimコマンド一覧|モード別早見表と置換・マクロの実行結果つき」

Vimのモードと切り替え方

Vim は「キーが何をするか」がモードで変わります。起動直後はノーマルモード(移動・編集コマンドを打つモード)で、文字を入力するときだけ挿入モードに入ります。迷ったら Esc でノーマルモードに戻るのが基本です。

モード 何をするか 入り方 戻り方
ノーマル 移動・削除・コピー 起動直後 / Esc ―
挿入 文字を入力 i a I A o O c... Esc
ビジュアル 範囲を選択 v V Ctrl-v Esc
コマンドライン :w :%s などを入力 : / ? Enter で実行 / Esc で中止
stateDiagram-v2
    [*] --> ノーマル
    ノーマル --> 挿入: i a o
    挿入 --> ノーマル: Esc
    ノーマル --> ビジュアル: v V Ctrl-v
    ビジュアル --> ノーマル: Esc
    ノーマル --> コマンドライン: : / ?
    コマンドライン --> ノーマル: Enter / Esc

起動・保存・終了のコマンド

保存は :w、終了は :q、保存せずに終了は :q! です。! は「警告を無視して実行する」という意味です。

やりたいこと コマンド
42行目を表示して起動 / 最初の「word」へ vim +42 file / vim +/word file
読み取り専用で開く vim -R file(view file)
別名で保存 :w new.txt
変更があるときだけ保存して終了 :x / ZZ
すべて閉じる / すべて保存して閉じる :qa! / :wqa
10〜20行目だけ別ファイルに保存 :10,20w part.txt
別ファイルやコマンド結果を挿入 :r other.txt / :r !date

削除・コピー・貼り付け(オペレーター+モーション)

Vim の編集は「オペレーター(何をするか)+モーション(どこまで)」の組み合わせです。d(削除)+w(単語)で dw、y(コピー)+$(行末)で y$ になります。同じキーを2回(dd yy cc)打つと1行が対象です。前に数字をつけると回数を指定できます。

オペレーター 意味 例
d 削除(切り取り) dw d$ dd dG dt.
c 削除して入力開始 cw c$ cc
y コピー(ヤンク) yw y$ yy
> / < インデントを増やす / 減らす >> 3>>
= 自動インデント gg=G
gU / gu / g~ 大文字 / 小文字 / 反転 gUU g~iw

Vim の削除は「切り取り」なので、dd で消した行はそのまま p で貼り付けられます。

実行結果(操作前 → 操作後)

カーソルは1行目の先頭から開始しています。「/」は改行の区切りです。

キー入力 操作前 操作後
jdd task-1 / task-2 / task-3 / task-4 task-1 / task-3 / task-4
3dd task-1 / task-2 / task-3 / task-4 task-4
yyp item: pen / item: note item: pen / item: pen / item: note
ddp line A / line B line B / line A
wdw order 1024 shipped today order shipped today
wD order 1024 shipped today order(行末まで削除)
5x abcdefghij fghij
d3w one two three four five four five
lxp teh the
jdG 1 / 2 / 3 / 4 1
dt. path/to/file.txt .txt
2wcwpublished Esc status = draft status = published
3J red / green / blue / white red green blue / white
gJ foo / bar foo bar(空白を整えずに連結)
gUU hello vim HELLO VIM
5 Ctrl-a count: 7 count: 12

Ctrl-a はカーソル以降で最初に見つかった数値が対象です。カーソルが行頭の count: にあっても 7 が増えます。

テキストオブジェクト(ciw・ci"・dap・cit)

テキストオブジェクトは「単語」「引用符の中」「括弧の中」「段落」「タグの中」といった“まとまり”を指す範囲です。i は内側、a は外側(引用符・括弧・空白)も含みます。カーソルがまとまりの途中にあっても全体が対象になるので、cw より ciw のほうが位置を気にせず使えます。

オブジェクト 対象 よく使う形
iw / aw 単語 / 単語+空白 ciw daw yiw
i" / a"(i' も同様) 引用符の中 / 引用符も含む ci" da"
i( / a( () の中 / () も含む ci( da(
i{ / i[ {} / [] の中 di{ ci[
it / at タグの中 / タグも含む cit yit dat
ip / ap 段落 / 段落+後ろの空行 dap yap vip
キー入力 操作前 操作後
wwciw980 Esc price = 1200 yen price = 980 yen
ci"new name Esc(行頭から) name = "old name" # memo name = "new name" # memo
fhda" say "hi" now say now
fwdaw one two three one three
f1ci(x, y Esc print(add(1, 2)) print(add(x, y))
f(lci(result Esc print(add(1, 2)) print(result)
jdi{ task { / id: 1 / title: "write" / } task { / }
citnew text Esc <p>old text</p> <p>new text</p>
fayit j0f>p <li>apple</li> / <li></li> <li>apple</li> / <li>apple</li>
dap para1 line1 / para1 line2 / (空行)/ para2 line1 para2 line1

ci" はカーソルが行頭にあっても、同じ行で後ろにある最初の "..." を探して書き換えます。一方 ci( は「カーソルを囲んでいる括弧」が対象なので、カーソルが内側の 1 にあれば add(...) の中、外側の a にあれば print(...) の中が書き換わります。

元に戻す・やり直す・繰り返す

u で元に戻し、Ctrl-r でやり直します。.(ドット)は直前の変更をもう一度実行します。挿入モードに入ってから Esc で抜けるまでが「1回の変更」です。

コマンド 動き
u / Ctrl-r 元に戻す / やり直す
U 最後に変更した行の変更をまとめて取り消す
. 直前の変更を繰り返す
:earlier 5m / :later 5m 5分前の状態へ / 戻す
キー入力 操作前 操作後
A; Esc j. j. x = 1 / y = 2 / z = 3 x = 1; / y = 2; / z = 3;
Aa Esc Ab Esc uu x x(2回分の追加を取り消し)

検索・置換のコマンド

検索は /word、置換は :範囲s/検索/置換/フラグ です。範囲を省略すると今の行、% をつけると全行が対象です。

やりたいこと コマンド
単語「id」だけを検索(idx は対象外) /\<id\>
大文字小文字を区別せず検索 /\cword
検索ハイライトを消す :noh
件数だけ数える(置換しない) :%s/word//gn
今の行の最初の1つ / すべて :s/old/new/ / :s/old/new/g
2〜3行目 / 今の行から末尾まで :2,3s/old/new/g / :.,$s/old/new/g
選択範囲だけ V で選択 → :(:'<,'> が入る)→ s/old/new/g
確認しながら / 大文字小文字を無視 :%s/old/new/gc / :%s/old/new/gi
見つからなくてもエラーにしない :%s/old/new/ge
/ を含む文字列 :%s#/usr/local#/opt#g(区切りを # に)
直前の検索パターンで置換 :%s//new/g
改行に置換 / 行末の空白を削除 :s/,/\r/g / :%s/\s\+$//e

確認付き置換(c)では、一致するたびに y(置換)/ n(飛ばす)/ a(残りすべて)/ q(終了)/ l(これで最後)を選びます。

コマンド 操作前 操作後
:s/cat/fox/ cat cat cat / cat dog fox cat cat / cat dog
:%s/cat/fox/g cat cat cat / cat dog fox fox fox / fox dog
:2,3s/v1/v2/ v1 / v1 / v1 / v1 v1 / v2 / v2 / v1
:s/test/TEST/gc → y n y test test test TEST test TEST
Vj:s/a/b/ a=1 / a=2 / a=3 b=1 / b=2 / a=3
:s/,/\r/g a,b,c a / b / c
:%s/\s\+$//e foo / bar(末尾タブ) foo / bar

正規表現で置換する

Vim の正規表現は、標準では + ( ) の前に \ が必要です。先頭に \v(very magic)をつけると、他の言語と同じ書き方になります。

" 標準の書き方(\( \) \+ が必要)
:%s/\(\d\+\)-\(\d\+\)-\(\d\+\)/\3\/\2\/\1/

" \v をつけると ( ) + をそのまま書ける。区切りを # にすると / のエスケープも不要
:%s#\v(\d+)-(\d+)-(\d+)#\1年\2月\3日#

" = の後ろの単語だけを大文字に(\zs で一致の開始位置を指定、& は一致全体)
:%s/=\zs\w\+/\U&/
コマンド 操作前 操作後
1つ目 2026-09-28 / 2026-10-01 28/09/2026 / 01/10/2026
2つ目 2026-09-28 / 2026-10-01 2026年09月28日 / 2026年10月01日
3つ目 id=abc / id=xyz id=ABC / id=XYZ

置換側では \1〜\9(グループ)、&(一致全体)、\U / \L(大文字 / 小文字)、\r(改行)が使えます。

ビジュアルモード・矩形選択

v は文字単位、V は行単位、Ctrl-v は矩形(ブロック)単位の選択です。選択後にオペレーター(d y c > U など)を押すと、その範囲に適用されます。gv で直前の選択範囲を再選択できます。

キー入力 操作前 操作後
jVjd 1 / 2 / 3 / 4 1 / 4
Ctrl-v jj I# Esc alpha / beta / gamma # alpha / # beta / # gamma
Ctrl-v jj $A, Esc alpha / beta / gamma alpha, / beta, / gamma,
Ctrl-v jjll d 01 apple / 02 grape / 03 peach apple / grape / peach
f0 Ctrl-v jj g Ctrl-a item0 / item0 / item0 item1 / item2 / item3
fovitU <b>bold</b> <b>BOLD</b>

矩形選択の I は、入力中は1行目にしか文字が見えませんが、Esc を押した時点で全行に反映されます。長さの違う行の末尾に追加するときは $ を押してから A にします。

マクロで繰り返し作業を記録する

マクロは「キー操作の記録と再生」です。qa で記録開始、操作して q で終了、@a で再生、3@a で3回再生します(直前のマクロの再実行は @@)。

キー入力 操作前 操作後
qa I- Esc j q 3@a apple / banana / cherry / durian - apple / - banana / - cherry / - durian
j qa f,r Tab j0 q @a name,qty / pen,3 / note,5 name,qty / pen Tab 3 / note Tab 5

コツは「位置を決める → 編集 → 次の行へ移動」までを1セットで記録することです。0 や f で位置を決めてから編集すると、どの行でも同じ結果になります。全行に適用するなら :%norm @a も使えます。

:g コマンドで条件に合う行をまとめて操作する

:g/パターン/コマンド は一致するすべての行にコマンドを実行します。:v/パターン/コマンド は一致しない行が対象です。

コマンド 操作前 操作後
:g/^#/d(# で始まる行を削除) keep 1 / # memo / keep 2 / # memo2 keep 1 / keep 2
:v/ERROR/d(ERROR 行だけ残す) ERROR a / INFO b / ERROR c ERROR a / ERROR c
:g/=/normal A;(各行でノーマルコマンド) x = 1 / y = 2 x = 1; / y = 2;
:g/TODO/t$(末尾にコピー) TODO a / done b / TODO c TODO a / done b / TODO c / TODO a / TODO c
:g/^/m0(行を逆順に) 1 / 2 / 3 3 / 2 / 1
:%norm A!(全行の末尾に追加) a / b / c a! / b! / c!
:sort b / 10 / a / 2 / b 10 / 2 / a / b / b
:sort n(数値順) 10 / 2 / 33 / 1 1 / 2 / 10 / 33
:sort u(重複を削除) b / a / b / a a / b

数値を並べるときは :sort n を使います。:sort は文字の順なので、10 が 2 より前になります。空行の削除は :g/^$/d です。

レジスタを使い分ける

レジスタは Vim 内の複数のクリップボードです。"a のように「"+名前」を前につけると、そのレジスタでコピー・貼り付けできます。中身は :reg で確認できます。

レジスタ 入るもの
""(無名) 直前に削除・コピーした内容(p の対象)
"0 直前にコピー(y)した内容。削除では上書きされない
"1〜"9 直前に削除した行(古いものが後ろへずれる)
"a〜"z 名前付き。"A のように大文字で書くと追記
"+ OS のクリップボード(+clipboard 対応版のみ)
"_ 捨てる。"_dd は他のレジスタを変えない
キー入力 操作前 操作後
"ayy j "ap first / second first / second / first
yy j dd "0p copy me / junk copy me / copy me
"ayy j "Ayy j "ap one / two / three one / two / three / one / two
yiw o Ctrl-r 0 world Esc hello hello / hello world

「コピーした行を、別の行を消したあとに貼りたい」ときは "0p です。dd の直後の p は、消した行のほうを貼り付けます。挿入モードでは Ctrl-r +レジスタ名で貼り付けられます。

画面分割・タブ・バッファ

開いたファイルは「バッファ」、表示する枠は「ウィンドウ」、ウィンドウのまとまりが「タブ」です。

やりたいこと コマンド
横分割 / 縦分割 :sp file / :vs file
ウィンドウ間の移動 Ctrl-w + h j k l
今のウィンドウだけ残す / 大きさをそろえる Ctrl-w o / Ctrl-w =
新しいタブ / 次 / 前 :tabnew file / gt / gT
バッファ一覧 / 切り替え / 閉じる :ls / :b 2(:bn :bp)/ :bd
2ファイルの差分 vim -d a.txt b.txt(]c [c で移動)

vim a.txt b.txt で起動して :ls を実行した表示です。% は今のバッファ、a は表示中を表します。

:ls
  1 %a   "a.txt"                        line 1
  2      "b.txt"                        line 0

画面を開かずに一括編集する(vim -Es)

vim -Es は画面を出さずに Ex コマンドを実行するモードです。-c でコマンドを渡すと、複数ファイルの置換などをスクリプトで行えます。

printf 'version: v1\n' > a.txt
printf 'version: v1\nname: x\n' > b.txt
# すべての .txt で置換して保存(e フラグで一致しないファイルもエラーにしない)
vim -Nu NONE -Es -c 'args *.txt' -c 'argdo %s/v1/v2/ge | update' -c 'qa'
head a.txt b.txt
==> a.txt <==
version: v2

==> b.txt <==
version: v2
name: x

エディタの中なら :args *.txt → :argdo %s/v1/v2/ge | update で同じことができます。

困ったときの対処

Vim から抜けられない

Esc を押してから :q! + Enter で、保存せずに終了します。Ctrl-c を押すと、Vim 9.1 では画面下に抜け方が表示されます。変更があるまま :q を打ったときのエラーもあわせて載せます(実際の表示)。

Type  :qa!  and press <Enter> to abandon all changes and exit Vim
E37: No write since last change (add ! to override)

権限がなくて保存できない(:w !sudo tee %)

一般ユーザーで root 所有のファイルを編集すると、:w と :w! は次のエラーになりました。

E45: 'readonly' option is set (add ! to override)
"/tmp/t26etc/app.conf" E212: Can't open file for writing

sudo が使えるユーザーなら、:w !sudo tee % > /dev/null で Vim を閉じずに保存できます。バッファの内容を sudo tee に渡し、%(今のファイル名)に書き込む仕組みです。実行後に W12: Warning: File "..." has changed and the buffer was changed in Vim as well の確認が出るので、L(Load File)で読み直します。検証では port=80 を port=8080 に書き換えて保存できました。最初から管理者権限で編集するなら sudoedit ファイル名(sudo -e)が確実です。

スワップファイルの警告(E325: ATTENTION)

同じファイルを別の Vim で開いている、または前回 Vim が異常終了したときに出ます(実際の表示の抜粋)。

E325: ATTENTION
Found a swap file by the name ".memo.txt.swp"
          modified: YES
        process ID: 5106 (STILL RUNNING)
Swap file ".memo.txt.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort:
状況 選ぶキー
STILL RUNNING(別の端末で開いている) Q で閉じ、開いている方で作業する
異常終了し、未保存の変更を取り戻したい R → 内容を確認して :w → .swp を削除
変更は不要 E → 作業後に .swp を削除

ペーストするとインデントが崩れる

自動インデントが有効なときに、貼り付けた文字が「1文字ずつ入力された」と扱われると、インデントが二重になります。set autoindent の状態で if x: / a / b を送った結果です。

条件 結果
set autoindent(通常の入力として送る) if x: / a / b(3行目がずれる)
set autoindent paste if x: / a / b
set autoindent + ブラケットペースト if x: / a / b

Vim 8.0 以降はブラケットペースト(端末が貼り付けの開始・終了を知らせる仕組み)に対応しており、対応端末では自動で崩れを防ぎます。それでも崩れる場合は :set paste → 貼り付け → :set nopaste とします。

最小の .vimrc の例

設定は ~/.vimrc に書きます。Vim 9.2 からは ~/.config/vim/vimrc(XDG の置き場所)にも対応しました。次の設定は vim -Nu vimrc -Es で読み込み、:set で反映を確認しています。

set number cursorline          " 行番号・カーソル行の強調
syntax on
set hlsearch incsearch         " 検索のハイライト・入力中に検索
set ignorecase smartcase       " 小文字なら区別しない・大文字を含めば区別
set expandtab tabstop=4 shiftwidth=4 softtabstop=4
set autoindent
filetype plugin indent on
set backspace=indent,eol,start
set encoding=utf-8 fileencodings=utf-8,cp932,euc-jp
set undofile undodir=~/.vim/undo " 閉じても undo 履歴を残す(先に mkdir -p ~/.vim/undo)
nnoremap <Esc><Esc> :nohlsearch<CR>

設定の影響を切り分けたいときは vim --clean で既定の状態から起動できます。OS のクリップボードを使うには +clipboard 版が必要で、Ubuntu の vim パッケージは -clipboard でした(vim --version で確認できます)。

Neovim との違い(要点)

Neovim は Vim から派生したエディタで、この記事のコマンドはほぼそのまま使えます。2026年4月の Neovim 0.12 では組み込みのプラグイン管理(vim.pack)が加わりました。

項目 Vim Neovim
設定ファイル ~/.vimrc ~/.config/nvim/init.lua(または init.vim)
既定値 hlsearch などは設定が必要 hlsearch incsearch autoindent などが最初から有効
:w !sudo tee % 使える :! が対話的なコマンドに対応しないため、パスワード入力が必要な sudo では使えない(公式 FAQ)

よくある質問

Q. vi と vim は何が違いますか? A. vim は vi を拡張したエディタで、複数回の undo、ビジュアルモード、テキストオブジェクト、画面分割などが加わっています。基本操作は vi でも使えますが、テキストオブジェクトや矩形選択は vim の機能です。

Q. 覚える順番のおすすめは? A. 「i → 入力 → Esc → :wq」と :q!、次に hjkl w b 0 $ gg G、その後 dd yy p u .、慣れたら ciw ci"、:%s、矩形選択、マクロの順がおすすめです。vimtutor コマンド(Vim 9.2 では :Tutor も)で練習できます。

Q. 置換で「E486: Pattern not found」が出て止まります。 A. 一致する文字列がないときのメッセージです。:argdo などでまとめて実行するときは、e フラグ(:%s/old/new/ge)をつけるとエラーを出さずに進みます。

まとめ

  • 基本は「i で入力 → Esc → :wq」、保存せず抜けるなら :q!
  • 編集は「オペレーター+モーション」:dw y$ c3w、数字で回数を指定(3dd 5x)
  • ciw ci" ci( dap cit はカーソルが途中でもまとまり全体が対象
  • 置換は :%s/old/new/g、確認は gc、正規表現は \v で書きやすくなる
  • 同じ編集の繰り返しは .、複数行は矩形選択・マクロ・:g で一度に
  • コピーした内容は "0 に残るので、削除のあとに貼るなら "0p
  • 保存できないときは :w !sudo tee % > /dev/null、ペーストの崩れは :set paste

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「vimコマンド一覧|モード別早見表と置換・マクロの実行結果つき」

株式会社RJCでは、エディタ操作のような日々の小さな効率化も、メンバー同士で便利な使い方を教え合いながら取り入れています。こうした知識を共有しながら、日々技術を磨いています。

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?