🔖

覚えやすくまとめたVimコマンド

2024/05/17に公開

はじめに

VSCodeが物足りない人へ AstroNvimの紹介という記事を読んでVSCodeからVim(Neovim)へ乗り換えようと思い立ったのですが、Vimコマンドがどうも自分には覚えずらかったのでこの記事を書きました。特に、初心者向けに有用なコマンドをまとめてある記事を読んだところ、それぞれのコマンドが関連性なく書いてあるように見えてしまい上手く頭に入ってこなかったので、できるだけ体系的に覚えられるよう各種コマンドを類別し、ニーモニック付きでVimコマンドについてまとめてみました。

ニーモニックについては、Vim Mnemonic | Vim のコマンドの覚え方大全からかなり多くを引用しています。とてもわかりやすい記事だったので、おすすめです。

コマンドの文法

[count] [command]:count回commandを行う

ただし、countは省略することができ、その場合は原則としてcountを1とみなした動作を行う。

種類

この記事ではコマンドを以下のように類別した。ただし、モーション・オペレータ・スクロールコマンド・Exコマンド以外の名称はオフィシャルなものでは可能性がある。特に編集コマンド・ビジュアルコマンド・ウィンドウコマンドは筆者の造語である。また、この類別は完全ではなく、ここで取り上げていないコマンドも数多く存在する。

  • モーション
    • 例: h, j, k, l, w, e
    • カーソルの移動を行う
  • オペレータ
    • 例: d, y, c
    • 目的語としてモーションやテキストオブジェクトをとり、一定の範囲に対してある操作を行う
  • 挿入コマンド
    • 例: i, a, o
    • Insert Modeへ移行する
  • 編集コマンド
    • 例: p, r, x
    • オペレータでも挿入コマンドでもないが、テキストの編集を行う
  • ビジュアルコマンド
    • 例: v, V
    • Visual Modeへ移行する
  • 検索コマンド
    • 例: /, ?
    • 検索を行う
  • スクロールコマンド
    • 例: Ctrl-u, Ctrl-d
    • スクロールを行う
  • undo/redo
    • 例: u, Ctrl-r
    • undo/redo
  • Exコマンド
    • 例: :q, :w
    • :から始まる
  • ウィンドウコマンド
    • 例: Ctrl-w h, Ctrl-w +
    • Ctrl-wから始まり、ウィンドウを操作する

モーション

hjkl

    ^
    k
< h   l >
    j
    v

gk, gjで表示行上の上下移動をすることができる。

左右の移動

key description mnemonic
0 行頭へ 正規表現と同じ
^ 行頭の非空白文字へ
$ 行末へ 正規表現と同じ
g_ 行末の非空白文字へ
g^ g$ ^ $のスクリーン行ver
gm スクリーン行の真ん中 middle
f{char} 次の{char}へ find {char}
F{char} 前の{char}へ
t{char} 次の{char}の1文字左 till {char}
T{char} 前の{char}の1文字右
; 最後のf,F,t,Tを繰り返す
, 最後のf,F,t,Tを逆方向に繰り返す

上下の移動

key description
gg ファイルの[count]行目
G ファイルの下から[count]行目
{num}% ファイル中の{num}%の位置

単語単位の移動

以下の表において、wordやWORDは次を意味する。

  • word: \w+ または [^\s\w]+
  • WORD: \S+

ただし、\w[0-9a-zA-Z_]\sは空白文字、\Sは非空白文字を表す文字クラスである。

key description mnemonic
w 次のwordの先頭へ next word
W 次のWORDの先頭へ next WORD
e 次のwordの末尾へ end of next word
E 次のWORDの末尾へ End of next WORD
b 前のwordの先頭へ backward
B 前のWORDの先頭へ Backward
ge 前のwordの末尾へ
gE 前のWORDの末尾へ

オブジェクト単位の移動

行・段落・セクションの定義はドキュメントを参照のこと。ただし、難しいので筆者は覚えないことにした。

key description
( ) 文の開始・終了
{ } 段落の開始・終了
[ ] セクションの開始・終了

様々な移動

key description mnemonic
% 対応する記号((){}[])へ
[ 対応しない記号((){}[])へ
go ファイル先頭から[count]byte目 go
H スクリーン最上行から[count]行目 h(←)
M スクリーン中央へ middle
L スクリーン最下行から[count]行目 l(→)

オペレータ

文法

[operator] [motion]|[text object]:指定した範囲に対してoperatorの動作を行う

目的語としてmotionをとる場合は現在のカーソル位置からmotionで指定した動きで到達する場所までをoperatorの操作範囲とし、text objectの場合はtext objectの示す範囲を操作範囲とする。
また、operatorを二つ重ねると操作の対象が行になる。

operator

key description mnemonic
c 削除してInsert Modeへ change
d 削除 delete
y コピー yank
gu 小文字化
gU 大文字化
g~ 大文字・小文字をトグル
> インデントを増やす
< インデントを減らす
zf 折りたたみを作成

テキストオブジェクト

以下の表の記号にはa,iのどちらかが前につき、下のような意味を付与する。

  • a: 囲い記号を含んだ全体(arround)
  • i: 囲い記号を含まず、その内部(inner)
key description mnemonic
w wordを選択 word
W WORDを選択 WORD
s 文を選択 sentence
p 段落を選択 paragraph
t HTML, XMLタグを選択 tag
b ( ) ()ブロックを選択 bracket
B { } {}ブロックを選択 Bracket
[ ] []ブロックを選択
< > <>ブロックを選択
" ' ` 引用符の中身を選択

テキストオブジェクトはビジュアルモードでも使用することができる。

レジスタ

"{レジスタ名}y,d,pの前に入力することで、ヤンク・削除・プットの際に使用するレジスタを選択することができる。

name register description
削除用レジスタ _ dなどで結果を破棄する場合に用いる
無名レジスタ デフォルトのレジスタ
名前付きレジスタ a~z ユーザが自由に指定することができる

レジスタの中身は:regコマンドで確認することができる。

挿入コマンド

key description mnemonic
i カーソルの前でInsert Modeへ insert
I 行頭の非空白文字でInsert Modeへ
a カーソルの後ろでInsert Modeへ append
A 行末でInsert Modeへ
o 下に改行してInsert Modeへ open line
O 上に改行してInsert Modeへ
gi 最後に入力がされた場所でInsert Modeへ

編集コマンド

key description mnemonic
C 行末まで削除してInsert Mode c$
D 行末まで削除 d$
Y 行をコピー yy
p ペースト put
P カーソルの前にペースト Put
x カーソル下の文字を削除 dl
X カーソル前の文字を削除 dh
s カーソル下の文字を削除してInsert Modeへ substitute
S カーソル前の文字を削除してInsert Modeへ
r カーソル下の文字を置き換える replace
R 置換モード
J 行を連結する Join

Yが行末までのコピーではないのは、viとの互換性のため。

ビジュアルコマンド

ビジュアルモードではノーマルモードのコマンドの多くを使うことができる。視覚的に領域を選択し、その領域に対してコマンドを適用するという使い方ができる。

key description mnemonic
v 文字単位のVisual Modeへ visual mode
V 行単位のVisual Modeへ
Ctrl-v 矩形選択のVisual Modeへ
gv 最後に使用したのと同じ範囲選択のVisual Modeへ
v_o 選択されたテキストのもう一方の端へ移動する Go to other end
v_O v_oと同じ/矩形選択モードでは行内のもう一方のコーナーに移動

検索コマンド

key description mnemonic
/{word} {word}を前方検索
?{word} {word}を後方検索 ? = Shift+/
* カーソル下のwordを前方検索
# カーソル下のwordを後方検索
g* g# * #の部分一致ver
n 次の検索対象へ next
N 前の検索対象へ

スクロールコマンド

上/下方スクロール

key description mnemonic
Ctrl-e 下へ[count]行スクロール extra line
Ctrl-y 上へ[count]行スクロール
Ctrl-d 下に半ページスクロール scroll downwards
Ctrl-u 下に半ページスクロール scroll upwards
Ctrl-f 下に1ページスクロール scroll forwards
Ctrl-b 下に1ページスクロール scroll backwards

カーソル相関スクロール

key description mnemonic
zt [count]行(省略時は現在行)をウィンドウの最上行に top
zz [count]行(省略時は現在行)をウィンドウの中央に
zb [count]行(省略時は現在行)をウィンドウの最下行に bottom

undo/redo

key description mnemonic
u 変更を戻す undo
Ctrl-r undoされた変更を戻す redo

Exコマンド

ウィンドウ作成

key description no {file} mnemonic
:new {file} ウィンドウを水平分割して{file}を開く 空のウィンドウを開く new
:vnew {file} ウィンドウを垂直分割して{file}を開く 空のウィンドウを開く vertical new
:e {file} {file}を開く 現在のファイルを開く edit
:sp {file} ウィンドウを水平分割して{file}を開く 現在のファイルを開く split
:vs {file} ウィンドウを垂直分割して{file}を開く 現在のファイルを開く vertical split
:tabnew 新しいタブを作成する

よく使うExコマンド

key description mnemonic
:q ファイルを閉じる quit
:q! 変更を保存せずファイルを閉じる
:w 変更をファイルに反映 write
:wq 保存してファイルを閉じる :q+:w
:!{cmd} 外部コマンドを実行
:r!{cmd} 外部コマンドの結果をバッファに挿入
:reg レジスタ一覧を表示 register
:his コマンド履歴を表示 history

置換コマンド

文法

:[range]s/{pattern}/{string}/[flags]

{pattern}にマッチする文字列を{string}に置換する。{range}で範囲を指定することができる。
ただしこれは簡略化したものなので、正確な情報については:substituteのドキュメントを参照のこと。

range

  • 省略: カレント行のみ
  • %: バッファ全体
  • {開始行},{終了行}: 指定した範囲
    • .: カレント行
    • $: バッファ末尾
  • '<,'>: Visual Modeで選択した範囲

flags

  • g: 該当するもの全てを置換(global)
  • c: 置換の際に毎回確認を行う(confirm)
    • 応答
      • y: 置換を行う(yes)
      • n: 置換を行わない(no)
      • l: 置換を行い終了する(last)
      • a: 以降の全ての置換を行う(all)
      • q: 置換を終了する(quit)
      • Ctrl-e: 画面を上にスクロールする
      • Ctrl-y: 画面を下にスクロールする
  • i: 大文字小文字を区別しない(ignore case)
    • デフォルトではこのフラグが有効
  • I: 大文字小文字を区別する

フラグは全て併用可能である

コマンドラインモードでの編集

command operation
Shift-→ 次の単語に移動
Shift-← 前の単語に移動
Ctrl-w 単語を削除
Ctrl-u カーソルより前の単語すべて削除
Ctrl-e 最後尾に移動
Ctrl-b 先頭に移動
Ctrl-p Ctrl-n 履歴の呼び出し
Ctrl-f コマンドラインウィンドウを開く
Ctrl-r-レジスタ名 レジスタの内容を挿入する

ウィンドウコマンド

ウィンドウ間の移動

command operation mnemonic
Ctrl-w h 右のウィンドウへ hのウィンドウver
Ctrl-w j 下のウィンドウへ jのウィンドウver
Ctrl-w k 上のウィンドウへ kのウィンドウver
Ctrl-w l 左のウィンドウへ lのウィンドウver
Ctrl-w t 一番上のウィンドウへ top
Ctrl-w b 一番下のウィンドウへ bottom

ウィンドウサイズ調整

command operation mnemonic
Ctrl-w + 現在のウィンドウの高さを[count]行高くする +
Ctrl-w - 現在のウィンドウの高さを[count]行低くする -
Ctrl-w > 現在のウィンドウの幅を[count]桁増やす >
Ctrl-w < 現在のウィンドウの高さを[count]桁減らす <
Ctrl-w = 全てのウィンドウの幅と高さをほぼ同じにする =

ウィンドウを閉じる

command operation last window Exコマンド mnemonic
Ctrl-w q 現在のウィンドウを閉じる Vimを終了する :q quit
Ctrl-w c 現在のウィンドウを閉じる 閉じることができない :close close
Ctrl-w o 現在のウィンドウ以外を閉じる :only only

タブの移動

command operation
gt 次のタブへ
gT 前のタブへ

コマンドの変化規則

コマンドの変化について、規則的なものを以下にまとめる。

  • 大文字化
    • モーション
      • word/WORD対応: w, b, e, ge
      • 操作が逆になる: f, t
    • オペレータ
      • 行末まで($)の操作になる: c, d
      • 逆向きの操作になる: gu
    • 挿入コマンド
      • 行単位の操作になる: i, a
      • 逆向きの操作になる: o
    • その他
      • 逆向きの操作になる: p, x, s, v, gt, n
  • オペレータコマンドを重ねる
    • 行単位の操作になる

おわりに

この記事に挙げているコマンドはVimコマンドのごく一部なので、全てのコマンドを確認したい方はvimindexを参照してください。

筆者はVim初心者なので不正確な表現や間違った情報が含まれている可能性があります。その際は、お手数ですがコメントで指摘していただけると幸いです。

参考文献

Discussion