技術トップへ戻る

-- Vim実践への道 --

このファイルはVim/Neovimがあなたの常用コードエディタとなることをサポートするためのhtmlファイルであり、あなたがプログラマとして、作業を行うための実践的なモノのみを掲載している。
"Vim大百科事典"のように"不必要な"コマンドすら掲載しているわけではない。
Vim/Neovimモーダルエディタに分類されるテキストエディタ で主に以下四つのモードを行き来する。
Normal Mode, Insert Mode, Visual Mode Command-line modeが存在する。

念のため言っておくと:q!と書いてあるなら文字通り:q!と打つべきである。
それでは、Vimと共にあらんことを

ノーマルモード

オフィスに鳴り響く電話、コピー機そしてキーボードの音。
そっと、ショルダーハッキングしてみるとその社員はホームポジションと呼ばれる場所に手を置いているではないか。 そして、書き出す。書きだしたと思えばまた、定位置へ戻る。
普通にキーボードで入力を難なくこなせる一般社員であれば必ずキーボードにおけるホームポジションから始まるはずだ。
これは、Vimmerにも同じことがいえる。
Normal Mode、これはVimにおけるホームポジションであり、これから説明するコマンドたちにとってそれは全ての原点なのだ。
一般Vimmerなら必ず始まりと終わりはここにいなければならない。そうでないなら、それはもはや「一本指打法」と同じくらい作法の悪い振る舞いであり、目も当てられない。
さらに、いうならH, J, K, LこれらのキーはVimmerにとって第二のホームポジションと言えるだろう。

コマンド説明備考
Locomotions
Escノーマルモードに戻る困ったらこれ。気がついたらこれ。呼吸よりもこれ。
[count]kカーソルを上に移動[count]というのは基本、正の整数回繰り返すを意味し、
4jと打てば四行目下に移動する。
ちなみに、[]で囲まれたものはoptionalであり、
これから、登場する大多数のコマンドで利用可能なものである。
[count]jカーソルを下に移動
[count]hカーソルを左に移動
[count]lカーソルを右に移動
[count]w次の単語の先頭に移動 (word):h wordで詳細を見れる。
[count]W記号を無視してスペース区切りで移動するWはshift+wを表す
[count]b前の単語の先頭に移動
[count]B記号を無視してスペース区切りで戻る
[count]e単語の末尾に移動
[count]E記号を無視してスペース区切りの最後へ移動
0カーソルの横座標を0列目へ移動数字のzeroであってアルファベットに属するoではない
$カーソルの横座標を最終列目へ移動
^行の最初の空白以外の文字に移動pythonのようなインデントされたコードでは 0 よりもこちらを多用する
[count]+次の行の行頭(最初の非空白文字)へ移動j 押して ^ 押すのと同じ。Enterキーでも同じ挙動をする。
[count]-前の行の行頭(最初の非空白文字)へ移動k 押して ^ 押すのと同じ。
%対応する括弧に移動 () [] {}ちなみに、全く役立たないが60%と入力するとそのファイルの60%の行目に移動する。
Jump Motions
ggカーソルの縦座標をファイルの一行目へ移動10ggと打てば10行目に移動する。:10でも同じ。
Gカーソルの縦座標をファイルの最終行へ移動10Gと打てば10行目に移動する
gd定義へ移動 (Go Definition)標準では「ファイル内の宣言場所」へ飛ぶだけだが、
プラグインを入れると「別ファイルの定義元」へ飛べるようになるのがデファクトスタンダード
gr参照一覧を表示・移動 (Go References)標準機能ではない(標準のgrは無効または別機能)。
プラグインを入れた環境では「その変数が使われている場所」を一覧表示するキー
として定着している
gfカーソル下のファイル名を開く (Go File)include "header.h" のファイル名の上で押すと、そのファイルに飛べる。
パスが正しければ標準機能で動く
[count]{パラグラフの始まりの一行外側に移動するパラグラフ(paragraph)について知りたいなら:h paragraph
[count]}パラグラフの終わり一行外側に移動する
[count]^oひとつ前のジャンプ位置に戻る大きな動きに対して有効。h,j,k,lのような動きでは記録されない
[count]^iまたは<Tab>ひとつ後のジャンプ位置へ移動する^o, ^iについて詳しく知りたいなら:h jump-motionsとタイプしてみよう。
[count]g;最後に編集した場所へ移動^o (ジャンプリスト) と違い、「編集」した場所だけを辿れる。超便利。
[count]g,編集箇所の履歴を順方向に辿る
Search and Jump
[count]f{char}カーソル位置をカーソル位置から右側以降で見つかった最初の{char}に移動する{char}とは文字列を意味し、[]と違いoptionalではない。
ff と打てばカーソルより右の最初の'f'へカーソル位置が動く。
[count]F{char}カーソル位置をカーソル位置から左側以降で見つかった最初の{char}に移動する[count]Ff と打てばカーソルより左の最初の'f'へカーソル位置が動く。
[count]t{char}カーソル位置をカーソル位置から右側以降で見つかった最初の{char}の左側に移動する
[count]T{char}カーソル位置をカーソル位置から左側以降で見つかった最初の{char}の右側に移動する
[count];直前の f, t, F, T の検索を繰り返す
[count],直前の f, t, F, T の検索を逆方向に繰り返す
/{pattern}文字列 {pattern} を前方検索する検索後に Enter で確定。正規表現も使える。
/Make each program do one thing well.と打てば
Make each program do one thing well.という文字列へ移動する。
?{pattern}文字列 {pattern} を後方検索する
[count]*カーソル下の単語を前方検索する超便利。変数名の上で押せば、次に出てくる同じ変数の場所に飛べる。
[count]#カーソル下の単語を後方検索する* の逆方向
[count]n次の検索結果へ移動 (next)/ の後は下方向、? の後は上方向に進む
[count]N前の検索結果へ移動n の逆方向
Edit
["x][count]y{motion}今のカーソル位置の行をヤンク
最も慣れ親しんだいい方で言うならコピー
2yjまたはy2jと打てばカーソル行含む下二行がヤンクされる
y2}と打てば下にある2個のパラグラフがヤンクされる。
["x]はレジスタだがこの余白は説明を書くには狭すぎる。
["x][count]yy今のカーソル位置の行を削除
["x]y[count]i{object}{object}に対応する中の文字列をヤンクするする初めに言っておくと、「初級者であるならここにいるべきではない」
{object}これは:help内には書かれていないものだが、
説明のため導入する。
{object}には、"", (), [], {}, <>などの囲いつまり、
ペアとなるものが該当し、b, B, tも使用できる。
また、テキストオブジェクトw, W, pも使用できる。
さらに、“余白”を拡張するなら
ファイル内にexit(int(0))があり、 yi(と入力するとint(0)がヤンクされ
y2i(と入力すると0がヤンクされる。
お察しの通り、'second' innerである。
y2i(はGoogle ColabやVSCodeの拡張機能などでは挙動が違う
:help object-selectと打つと更なる詳細を得る。
["x]y[count]a{object}{object}を含む{object}に対応するものをヤンクする
["x][count]x今のカーソル位置の文字を削除いろいろ意味不明な記号が出てきたが臆することは無い。
3xと押せば三文字消える。
["x][count]X今のカーソル位置の前の文字を削除
["x][count]d{motion}今のカーソル位置の行を削除2djまたはd2jと打てばカーソル行含む下二行が消える。
2d}と打てば下にある2個のパラグラフが消える。
["x][count]D今のカーソル位置より文末までを削除
["x][count]dd今のカーソル位置の行を削除
["x]d[count]i{object}{object}に対応する中の文字列を削除する
["x]d[count]a{object}{object}を含む{object}に対応するものを削除する
["x][count]p今のカーソル位置の行から下にペーストレジスタ..余白(以下略)
["x][count]P今のカーソル位置の行から上にペースト
[count]uUndo
[count]^rRedo^rはctrl+rを示す。
[count]>右へインデント
[count]<左へインデント
Window Fix
H / M / L今見えてる画面内の 最上部(High) / 中央(Middle) / 最下部(Low) に移動しばしば、プラグインによって上書きされている
zzカーソル行を画面中央へ
ztカーソル行が画面の一番上に来るようにスクロール (Top)
zbカーソル行が画面の一番下に来るようにスクロール (Bottom)
^u半画面分、上へスクロール (Up)^b (Back / 1画面戻る) よりも文脈を見失いにくいので好まれる傾向がある
^d半画面分、下へスクロール (Down)^f (Forward / 1画面進む) よりも好まれる
Mark-motions
m{a-z}現在のカーソル位置をマーク {a-z} に記録するma と打てば、現在地が 'a' に登録される
'{a-z}マーク {a-z} をつけた行の行頭へ移動する'a でマーク a の行へ戻る(シングルクォート)
`{a-z}マーク {a-z} をつけた正確な位置(列含む)へ移動するバッククォート。行頭ではなくピンポイントに戻りたい時に使う

インサートモード

かつて、主張してはならない学説が存在した。それを一度主張してしまえば異端と言われ魔女と言われ―
そんな中、生き残った男がいた―その名はガリレオ・ガリレイ。
彼は、一般庶民も読めるイタリア語で挑発的な本を出版し、 聖書の解釈にまで口を出した。
その結果、1616年に地動説は正式に「異端」とされ、裁判にかけられてしまう―
しかしあなたが知る通り、現代では「地球は回っている」と習うだろう。そう、世界は"変わった"のだ。
....しばしば、Vimmerにとって"世界を編集"するためにはインサートモードである必要がある。
追記だが、ここで紹介されるコマンドはインサートモードで使えるコマンドではなく、
インサートモードへ移項するためのコマンドでありノーマルモードからの遷移である。

コマンド説明備考
[count]i今のカーソル位置でインサートモード
[count]I今のカーソル位置の文字列の行頭からインサートモードに入る
[count]a今のカーソル位置の一つ右からインサートモード
[count]A今のカーソル位置の文字列の行末からインサートモードに入る
[count]o今のカーソル位置の下に新しい行を作ってインサートモード3oを入力後,stringと入力し,<ESC>を押すと下に三行現れる。
しかし、奇妙なことに<Ctrl-c>を押すと
三行追加はキャンセルされ既に表れている文字列のみが残る。
[count]O今のカーソル位置の上に新しい行を作ってインサートモード
[count]r{char}現在のカーソル位置の文字を{char}で置き換えるsコマンドが存在するがrで代用できる
[count]R現在のカーソル位置からReplace Modeへ入る何を隠そう、Replace modeの登場だがモード名は覚えなくてよく、
RGNU's Not Unix!と打てば現在のカーソル位置から右にある文字列が
GNU's Not Unix!に置き換わる。
["x][count]c{motion}現在のカーソル位置から{motion}で移動した範囲を消してインサートモードに入る
["x][count]cc現在のカーソル行を消してインサートモードに入る
["x][count]C現在のカーソル位置から右側を消してインサートモードに入る2Cと打てばカーソル行含む下に二行が消えてインサートモードになる
["x]c[count]i{object}{object}に対応する中の文字列を削除し、インサートモードに入る
["x]c[count]a{object}{object}を含む{object}に対応するものを削除し、インサートモードに入る
gi最後にインサートモードで編集した位置でインサートモードに入る

ヴィジュアルモード

ピエト・モンドリアン( 1872年3月7日 - 1944年2月1日)は、19世紀末から20世紀のオランダ出身の画家。
彼のキャリアの終盤には、皆も一度は見たことがある実に秩序だった絵画が描かれている。
そう、あのプログラミング言語Pietが影響を受けたであろう絵画だ。
彼にとって絵画は平面でなければならず、垂直と水平が秩序であるのであろう。
また、これから紹介するコマンドに対してVisual-Modeは水平線と垂直線で囲まれた"秩序"を提供する。

コマンド説明備考
[count]v文字単位ビジュアルモードに入る
[count]V行単位ビジュアルモードに入る
[count]^v矩形選択モードに入る
gv直前の選択範囲を再選択
v[count]i{object}{object}に対応する中の文字列を選択する
v[count]a{object}{object}を含む{object}に対応するものを選択
Locomotions
oヴィジュアルモードで選択されている範囲を壊すことなくカーソル位置を上または下に移動させる
O矩形選択で選択されている範囲を壊すことなくカーソル位置を左または右に移動させる
Edit
yヴィジュアルモードで選択された範囲をヤンク。実行後はノーマルモードに戻る
xヴィジュアルモードで選択された範囲を削除
dヴィジュアルモードで選択された範囲を削除
["x][count]pヴィジュアルモードで選択された範囲を貼り付けた文字で置き換える
cヴィジュアルモードで選択された範囲を削除し、そのままインサートモードへ移行
rヴィジュアルモードで選択された範囲の文字を、直後に入力した1文字で全て置き換える
I矩形選択された範囲の行頭でインサートモードに入る適当な文字列を入力した後<ESC>を押すと素晴らしい発見を得るだろう
A矩形選択された範囲の行末でインサートモードに入る
uヴィジュアルモードで選択された範囲のアルファベットを小文字にする
Uヴィジュアルモードで選択された範囲のアルファベットを大文字にする
~ヴィジュアルモードで選択された範囲のアルファベットの大文字小文字を反転する
[count]>ヴィジュアルモードで選択された範囲の行を右へインデント
[count]<ヴィジュアルモードで選択された範囲の行を左へインデント
Jヴィジュアルモードで選択された範囲の行を一行に結合するこのコマンドはノーマルモードでも使用できる
:文字列<',>'をコマンドラインに書き込んだ状態でコマンドモードに入る。ここまでの時点ではまだコマンドラインモードについて解説していないが、
<',>'はヴィジュアルモードで選択された範囲を示す

コマンドラインモード

第一次世界大戦後の混乱に乗じて民主的な選挙で台頭したヒトラー
その後、授権法によって議会から立法権を奪い、大統領の権限も統合して「総統」としての絶対的な独裁体制を確立。
この国家の歴史において、もっとも恐ろしいのは「外部の敵」ではなく、 自ら作り上げた「命令の仕組み」が自分自身を縛り、処罰し始めることだ。
これはVimのコマンドラインモードで私たちが犯すミスと驚くほど似ている。

コマンド説明備考
:wファイルを保存する
:qウィンドウを閉じる
:q!保存せずに強制終了する
:wq保存して終了する
:x保存して終了する:wq と似ているが、変更がない時は書き込まない
:e [pathtofile][pathtofile]のファイルを開く:e vim.textと打てば現在のディレクトリにあるvim.textを開く
:s/[old]/[new]/g現在の行にある[old]という文字列を[new]という文字列で置換する
:%s/[old]/[new]/gファイル全体の[old]という文字列を[new]という文字列で置換する%はバッファを指す
:<',>'%s/[old]/[new]/gヴィジュアルモードで選択された範囲の[old]という文字列を[new]という文字列で置換する
:/pattern下方向に向かって文字列を検索する
:?pattern上方向に向かって文字列を検索する
:set number行番号を表示する:set nu と略せる
:sp [file]ウィンドウを横に分割して開くsplit の略。画面が上下に分かれる
:vs [file]ウィンドウを縦に分割して開くvsplit の略。画面が左右に分かれる
:wincmd w次のウィンドウへ移動<Ctrl + w>を押した後wを押すのと同じ
:wincmd h左のウィンドウへ移動<Ctrl + w>を押した後hを押すのと同じ
:wincmd j下のウィンドウへ移動<Ctrl + w>を押した後jを押すのと同じ
:wincmd k上のウィンドウへ移動<Ctrl + w>を押した後kを押すのと同じ
:wincmd l右のウィンドウへ移動<Ctrl + w>を押した後lを押すのと同じ
:tabnew [file]新しいタブでファイルを開く
:tabnext次のタブへ移動,gt と同じ
:tabprevious前のタブへ移動gT と同じ
:! [command]外部コマンドを実行する:!lsでカレントディレクトリを表示
:r [file]指定したファイルの内容を差し込む現在のカーソル行の下に挿入される
:r ! [cmd]外部コマンドの実行結果を差し込む:r !dateで現在時刻を挿入
:cd [path]カレントディレクトリを変更するファイル保存時のパス指定に便利
:pwd現在の作業ディレクトリを表示する
:historyコマンドの履歴一覧を表示する
:noh検索のハイライトを消す
:help [kw]ヘルプを表示する