viの基本的な使い方から少し高度ですが便利な機能を紹介します。viはUnix系OSで広く使われているテキストエディタです。Unix系OSではEmacsも有名ですが、Emacsはインストールされていないことも多いです。viはほぼ必ずインストールされていますのでviはある程度使えて方が良いでしょう。
一般的にviと呼ばれることも多いと思いますが、正確にはVimというプログラムです。 Vimはオリジナルのviエディタを元に開発されたプログラムです。今日のUnix系OSではviはVimのエイリアスになっていて、viとタイプしても実際に動作するプログラムVimになります。
ここで解説する内容は結構盛りだくさんですが、最初はカーソルの移動や文字の挿入方法など少しのコマンドに慣れるところから始めれば十分です。リファレンスとしても使えるように最初は覚える必要のない便利なコマンドも多く解説しています。それらは章のはじめに一覧としてまとめています。
viのモード
- <Esc>
- ノーマルモードに戻る
はじめにviのモードという概念を説明します。これを知らないとはっきり言ってviは使えないからです。
viではモードを切り替えながら作業を行います。viの起動時はノーマルモードになっています。viには多くのモードがありますが、ノーマルモードと挿入モードを知っていればテキストの編集作業はできます。ノーマルモードではタイプした文字はコマンドとして扱われ、カーソルの移動やスクロールなどを行えます。文字を挿入は通常、挿入モードで行います。
意図せず他のモードへ移行(例えばキーのタイプミスなどで)してしまったり、今のいるモードがわからなくなった場合のためにノーマルモードへ戻る方法を覚えておきましょう。どのモードであっても<Esc>を押すとノーマルモードに戻ります(場合によっては<Esc>を2回押す必要がある)。ノーマルモードで<Esc>を押すとビープ音が鳴ります。ビープ音がなったらノーマルモードになっています。
コマンドのキャンセル
- <Esc>
- 実行中のコマンドをキャンセルする
<Esc>キーはノーマルモードに戻るために使うほか、検索など実行中のコマンドのキャンセルにも使用します。間違ってコマンドを実行してしまった時は<Esc>キーを押しましょう。これも知らないと困るのではじめに覚えましょう。
viの起動/終了とファイルの保存
viの起動
viでファイルの編集を始めるには次のように入力します。
vi foo.txt
これでviが起動してfoo.txtというファイルを開きます。foo.txtが存在しなければ新規作成されます。ただし、実際にファイルが作成されるのはファイルを保存したときです。新規作成の場合は画面の下に"foo.txt" [New file]とメッセージが表示されるのでそれと分かります。
ファイルを開いたときに画面に~が表示される行がある場合、これは実際にはファイルにその行がないことを示しています。
ファイルの保存とviの終了
ファイルの保存とviの終了には次のコマンドを使います。
- :q
- viを終了する。ファイルが変更されていればエラーになる
- :q!
- viを強制終了する。ファイルが変更されている場合、変更を破棄して終了する
- :w
- ファイルに上書き保村する
- :wq
- ファイルに上書き保存して終了する
- ZZ
- ファイルに上書き保存して終了する
- :e!
- 元のファイルを再読み込みする
テキストを変更していない場合にviを終了するには、次のように入力してEnterをタイプします。
:q
:を入力すると画面の最下部に:が表示され、そこへカーソルが移動します。続けてqを入力しEnterをタイプします。テキストが変更されている場合:qの実行はエラーになります。これは保存していない変更を不用意に破棄してしまわないようにするためです。
テキストを変更している場合、変更を破棄して終了するには次のように入力してEnterをタイプします。
:q!
テキストをファイルへ上書き保存するには:wと入力してEnterをタイプします。
:w
ファイルへ上書き保存してvi終了するには次のように入力してEnterをタイプします。ZZとタイプしても同じです。
:wq
編集を最初からやり直したい場合は次のように入力してEnterをタイプします。これはテキストの変更を破棄して、元のファイルを再度読み込み直します。
:e!
ヘルプの使い方
- :help
- ヘルプを表示する
- :q、ZZ
- ヘルプを終了する
ヘルプを表示には次のように入力してEnterをタイプします。
:help
ヘルプ画面ではこのあと説明するノーマルモードのコマンドが使えますので、それを使って閲覧します。ヘルプ画面を閉じるには:qかZZを使います。
カーソルの移動とスクロール
カーソルの移動
ノーマルモードでは次のコマンドでカーソルを移動できます。
- h
- 左へ移動
- j
- 下へ移動
- k
- 上へ移動
- l
- 右へ移動
- 0
- 行頭へ移動
- $
- 行末へ移動
- ^
- ホワイトスペース以外の行の最初の文字に移動
h、j、k、lコマンドでのカーソル移動は基本中の基本です。これらは1文字分カーソルを移動します。カーソルの移動は矢印キーでも行えますがh、j、k、lは慣れると大変便利です。0は行頭へ、$は行末へカーソルを移動します。^はホワイトスペース文字でインデントされているときに便利です。
単語単位のカーソルの移動
次のコマンドは単語単位でカーソルを移動します。
- w
- 次の単語の先頭へ移動する
- b
- 前の単語の先頭へ移動する
- e
- 次の単語の末尾に移動する
- ge
- 直前の単語の末尾に移動する
- W
- 空白で区切られた次の単語へ移動する
- B
- 空白で区切られた前の単語の先頭へ移動する
- E
- 空白で区切られた次の単語の末尾に移動する
- gE
- 空白で区切られた直前の単語の末尾に移動する
これらのコマンドは単語単位でカーソルを移動します。小文字のコマンド(最初の4つ)は、.、 /、(といったアルファベット以外の文字で区切られた文字列を単語と認識します。大文字のコマンド(最後の4つ)ではスペースで区切られた文字列を単語と認識します。
カウンタを使う
多くのコマンドには繰り返し回数を指定できます。これをカウンタといいます。カウンタはコマンドの前に指定します。これまで説明したコマンドでいくつか例を示します。
5l 2w 3fa
5lはカーソルを前方へ5文字分進め、2wは2単語先の単語の先頭へカーソルを移動します。繰り返しが使えそうなコマンドではたいていカウンタは使えますので、いろいろ試してみるといいでしょう。
特定の行へ移動する
次のコマンドは特定の行へカーソルを移動します。
- G
- 最終行へ移動する。カウンタを指定するとカウンタの行へ移動する。
- gg
- ファイルの先頭行へ移動する
- H
- 画面の先頭の行へ移動する
- M
- 画面の中央の行へ移動する
- L
- 画面の末尾の行へ移動する
特定の行へカーソルを移動するにはカウンタに続けてGをタイプします。例えば27行目に移動するには27Gとタイプします。カウンタを指定しない場合は最終行へカーソルを移動します。先頭行へカーソルを移動するにはggとタイプします。もちろん1Gとタイプしても構いません。
画面をスクロールせずに、表示されている画面の先頭、中央、末尾の行へカーソルを移動するには、それぞれH、M、Lとタイプします。HはHome、MはMiddle、LはLastの意味です。
スクロール
次のコマンドは画面をスクロールします。
- CTRL-F
- 1画面下にスクロールする
- CTRL-B
- 1画面上にスクロールする
- CTRL-E
- 1行下にスクロールする
- CTRL-Y
- 1行上にスクロールする
- CTRL-D
- 画面の半分だけ下にスクロールする
- CTRL-U
- 画面の半分だけ上にスクロールする
- zt
- カーソル行が画面の最初の行になるようスクロールする
- zb
- カーソル行が画面の最後の行になるようスクロールする
CTRL-Fで1画面下にスクロールします。下にスクロールすると表示されていたテキストより下の部分が表示されます。CTRL-Bは同様に1画面上にスクロールします。
1画面のスクロールは、完全な1画面分のスクロールではなく2行は重複しています。つまり、画面に表示されていた最後の2行はCTRL-Fを実行すると画面の先頭の位置へ移動します。
CTRL-Eは1行下に、CTRL-Yは1行上にスクロールします。CTRL-Dは画面の半分を下に、CTRL-Uは画面の半分を上にスクロールします。
ztはカーソル行を画面の最初の行になるようにスクロールします。zbはカーソル行が画面の最後の行になります。
挿入モードでの文字の挿入と削除
- i
- 挿入モードへ移行する。カーソルの位置は変わらない
- a
- 挿入モードへ移行する。カーソルは1文字分後ろのに移動する
- I
- 挿入モードへ移行する。カーソルは最初の非ホワイトスペース文字の上へカーソルを移動する
- A
- 挿入モードへ移行する。カーソルは行末へ移動する
- 矢印キー
- 上下左右へカーソルを移動する
- <Esc>
- ノーマルモードへ移行する
- <BackSpace>
- カーソル直前の文字を削除する
- <Delete>
- カーソル位置の文字を削除する
ノーマルモードではタイプした文字はコマンドとして扱われます。タイプした文字を挿入するには、挿入モードへ移行します。挿入モードへ切り替える基本的なコマンドはいくつかあります。
挿入モードではタイプした文字はカーソルの前に挿入されます。iコマンドは挿入モードへ移行します。挿入モードへ移行した時にカーソルの位置が(ノーマルモードの時のカーソルの位置から)変わりませんのでカーソルのある文字の直前に文字を挿入する時に使います。aコマンドは挿入モードへ移行するのはiコマンドと同じですが、挿入モードへ移行する時にカーソルが1文字分後ろへ移動します。そのため、カーソルのある文字の後ろに文字を挿入する時に使います。
行頭へテキストを挿入したい場合はIコマンドはを使います。Iコマンドは挿入モードへ移行して、カーソルは行頭へ移動します。ただしIコマンドの行頭は行の最初のホワイトスペース以外の文字です。これはホワイトスペースでインデントされているテキストのために便利です。Aコマンドは挿入モードへ移行して、カーソルは行末へ移動します。
挿入モードでのカーソルの移動には矢印キーを使います。もちろんノーマルモードへ戻ってカーソルを移動してからまた挿入モードに切り替えても構いません。ノーマルモードに戻るには<Esc>キーをタイプします。
挿入モードでカーソルの直前の文字を削除するには<BackSpace>を使用します。カーソル直後の文字を削除する<Delete>を使います。
新しい行の挿入
次のコマンドは空行を挿入して挿入モードへ移行します。
- o
- カーソルの下に新しい空行を挿入し、挿入モードへ移行する
- O
- カーソルの上に新しい空行を挿入し、挿入モードへ移行する
カーソルがある行の下に新しい行を挿入するにはoコマンドを使います。oコマンドはカーソル行の下に空行を追加して挿入モードへ移行します。カーソル行の上に新しい行を挿入するにはOコマンドを使います。
ノーマルモードでのテキストの削除
ノーマルモードでの削除コマンドは次の通りです。dオペレータと移動コマンドの組み合わせてテキストを削除する方法もここで説明します。
- x、dl
- カーソルの文字を削除
- X、dh
- カーソルの左側の文字を削除
- D、d$
- 行末まで削除
- dd
- 1行削除
dオペレータに続けて移動コマンドを入力すると、現在のカーソル位置から移動先までのテキストを削除できます。したがって、dlはカーソル位置の文字を削除し、dwは次の単語の先頭までのテキストを削除し、d$は行末までのテキストを削除します。カーソルの移動先の文字が削除されるかどうかは移動コマンドによって異なります。dlとdwではカーソルの移動先の文字は削除されませんが、d$はカーソル移動先の文字を削除します。
カーソルの移動にはカウンタを指定できるで、これを組み合わせることもできます。例えばd2wは2単語先までのテキストを削除します。
dlとdhは頻繁に使用するので1文字コマンドが用意されています。それぞれxとXです。d$にも1文字コマンドがあり、それはDです。
1行を丸ごと削除したい場合はddをタイプします。ddの前にカウンタを指定することもできます。例えば3ddはカーソルがある行から3行を削除します。ddはよく使いますので覚えておきましょう。
dオペレータとカーソル移動を組み合わせると色々なバリエーションの削除を実行できます。例えばdGでカーソルのある位置からテキストの最後までを削除できます。お気に入りの使い方を見つけて少しずつ慣れていきましょう。
テキストの変更
- C、c$
- 行末までを変更する
- s
- 1文字を変更する
- S、cc
- 行を変更する。ただしインデント(行頭のホワイトスペース)は残されます。
あるテキストを削除してからそこへ別のテキストを挿入することはよくあります。ノーマルモードでテキストを削除してから、挿入モードへ移行しても良いですがcオペレーターを使ったほうが便利です。
cオペレーターはdと同じようにテキストを削除しますが、テキストを削除した後に挿入モードに移行します。使い方もdと同じで、cの後にカーソル移動コマンドを続けます。ただしcwだけは例外で、dwが次の単語の先頭までのテキストを削除するのに対し、cwは次の単語との間の空白は残したまま挿入モードに移行します。これはceと同じ動作になります。この例外は歴史的な理由によるものです。
頻繁に利用する操作は1文字のコマンドあり、sはカーソル位置の1文字削除してから挿入モードへ移行します。Sは行を削除してから挿入モードへ移行しますが、行頭のホワイトスペースは削除されずに残されます。
テキストの移動とコピー
テキストのカット&ペースト
- p
- 削除したテキストをカーソルの後(下の行)にペースト(プット)する
- P
- 削除したテキストをカーソルの前(上の行)にペースト(プット)する
ノーマルモードでdやxなどのコマンドで何かを削除すると、削除されたテキストは記録されます。したがってviでテキストをカットするのに特別な操作はいりません。単にテキストを削除するだけです。
pコマンドを使うと、削除したテキストをペースト(viではこれをプットと呼ぶ) することができます。pコマンドはカーソルの直後にテキストをプットします。直前にddコマンドで行を削除した場合には、カーソルがある行の下にdd削除した行をプットします。
Pコマンドはカーソルの前にプットします。直前にddコマンドで行を削除したなら、カーソル行の上にその行をプットします。
プットは何回でも繰り返すことができます。カウンタを指定することもできます。カウンタを指定するとカウンタの数だけプットが繰り返されます。例えば、ddの後に3pを実行すると、カーソルがある行の下に削除した行のコピーが3つプットされます。
テキストのコピー&ペースト
- y
- カーソル移動コマンドを後ろに続けて移動先の文字列までをヤンク(コピー)する
- yy、Y
- 行全体をヤンク(コピー)する
テキストをコピーするにはyオペレーターを使います。yオペレーターの使い方は dやcオペレーターの使い方と同じでyに続けて移動コマンドを入力します。するとカーソルの位置から移動先の位置までのテキストを記録します(viでこの操作はヤンクと呼ぶ)されます。
たとえばywは次の単語の先頭までをヤンクします。これは次の単語の直前にある空白までをヤンクします。空白までヤンクされるのが嫌ならyeを使います。
記録されたテキストはpやPコマンドでプットできます。
yyはカーソルのある行全体をヤンクします。そのあとpコマンドでプットするとカーソルの下に行をプットします。Yはyyと同じです。行末までをヤンクするにはy$を使います。
テキストの上書き
- r
- カーソルの文字を置き換える
- R
- 置換モードに移行する
- <BackSpace>
- 置換モードでは直前の文字の置き換えを復元する
rコマンドは1文字上書きするために使います。rコマンドに続けて文字を入力すると、入力した文字でカーソルの文字を置き換えます。rコマンドはsコマンドのように挿入モードには切り替えません。
Rコマンドを置換モードに移行します。置換モードでは入力した文字がカーソルの文字を置き換えます。置換モードを抜けるには<Esc>をタイプします。
置換モードで<BackSpace>をタイプすると置き換えた文字を元に戻します。
取り消し(undo)とやり直し(redo)
- u
- 直前の編集をアンドゥする。繰り返すと遡ってアンドゥを実行する
- CTRL-R
- アンドゥした結果をリドゥする。
編集操作を元に戻したいときはuをタイプします。uコマンドは直前の編集をアンドゥします。繰り返しuをタイプすると編集を遡って復元します。アンドゥした操作を取り消して元に戻したい場合はCTRL-Rをタイプします。繰り返し実行するとアンドゥした結果を順にリドゥしていきます。
検索と置換
簡単な文字列の検索
- /文字列
- 文字列を検索する
- ?文字列
- 逆向きに文字列を検索する
- n
- 前方へ同じ検索文字列の検索を繰り返す
- N
- 後方へ同じ検索文字列の検索を繰り返す
文字列を前方へ検索するにはまず/を入力します。/を入力すると画面の最下部に/が表示され、その後ろにカーソルが移動します。続けて検索したい文字列を入力してEnterキーを押します。文字列が見つかれば最初に見つかった文字列へカーソルが移動します。続けて同じ文字列を検索するには単にnをタイプします。nコマンドを繰り返して、次々と同じ文字列を検索することができます。目的の文字列を通り過ぎてしまった場合はNをタイプします。これは同じ検索文字列を反対方向に検索します。
?コマンドは/と使い方は同じですが反対方向へ文字列を検索します。次々と同じ文字列を検索するにはNをタイプし、通り過ぎてしまった場合はnをタイプします。
検索文字列の入力を間違った場合はバックスペースキーで削除します。カーソルの移動は左または右矢印キーを使います。
検索文字列には正規表現も使えます。正規表現の詳細についてはヘルプなどを参照してください。
ヒストリ機能
- 上矢印キーまたは下矢印キー
- 検索履歴を遡る。または遡った履歴を順に辿る。
検索ではヒストリ機能が使えます。これには/に続けて上矢印キーをタイプします。繰り返し上矢印キーを押すと過去に検索した文字列を順に遡っていきます。下矢印キーは反対方向に履歴を辿ります。目的の文字列が表示されたらEnterキーで検索を実行します。
大文字と小文字を区別しないで検索する
- :set ignorecase
- 大文字と小文字を区別しないように設定する
- :set noignorecase
- 大文字と小文字を区別するように設定する
大文字と小文字を区別しないで検索するにはignorecaseオプションを設定します。設定するには次のように入力します。
:set ignorecase
大文字と小文字を区別するように戻すには次のように入力します。
:set noignorecase
置換
- :s
- 置換する。置換対象文字列には正規表現が使えます。
:sコマンドを使うと文字列を置換できます。書式は次の通りです。
:[範囲]s/置換対象文字列/置換文字列/[フラグ]
置換対象文字列には正規表現が使えます。置換文字列は通常の文字列です。オプションの範囲とフラグの意味はそれぞれ次の通りです。詳細についてはこの後に解説します。
フラグに指定する文字とその意味は次の通りです
- 指定なし
- 最初に見つかった文字列のみ置換する
- g
- すべてを置換する
- c
- 置換するか確認する
範囲に指定する文字とその意味は次の通りです
- 指定なし
- カーソルがある行を置換対象の範囲にする
- %
- ファイル全体を置換対象の範囲にする
- 開始行,終了行
- 開始行から終了行までを置換対象の範囲にする
- 対象行
- 数字で指定された行を置換対象の範囲にする
それでは1つずつ順番に例を見ていきましょう。まずはオプションの指定がない場合です。
:s/置換対象文字列/置換文字列/
範囲の指定がない場合は現在の行のみが対象になります。フラグの指定がない場合は最初に見つかったものだけが置換されます。つまり、これはカーソルのある行で最初に見つかった置換対象文字列のみを置換文字列で置き換えます。
見つかった全ての置換対象文字列を置き換えるには、次のようにg(global)フラグを指定します。
:s/置換対象文字列/置換文字列/g
見つかった置換対象文字列を置換するか確認しながら実行するには、次のようにc(confirm)フラグを指定します。
:s/置換対象文字列/置換文字列/c
実行すると次のような確認のメッセージが表示されます。
replace with XXXX (y/n/a/q/l/^E/^Y)?
この確認には括弧の中のいずれかのキーで回答します。それぞれのキーの意味は次の通りです。
- y
- Yes:置換する
- n
- No:置換せずにスキップする
- a
- All: 置換する。これ以降は確認なしですべてを置換する
- q
- Quit:置換を終了する
- l
- Last:置換してから終了する
- CTRL-E
- 画面を一行上にスクロールする。
- CTRL-Y
- 画面を一行下にスクロールする。
gとcを組み合わせて使うこともできます。
:s/置換対象文字列/置換文字列/gc
こうすると見つかった全ての置換対象文字列を確認しながら置換していくことができます。
それではもう1つのオプションの範囲指定を見ていきましょう。範囲を指定しなかった場合はカーソルのある行が置換の対象でしたが、%を指定するとファイル全体が置換の対象になります。カーソルがどこにあってもファイルの先頭から最後までが置換対象です。
:%s/置換対象文字列/置換文字列/
この例のほとんどの場合は望む動作にはならないでしょう。範囲に%を指定しているのでファイル全体が範囲になりますが、フラグがなにも設定されていないので各行で最初に見つかった置換対象文字列のみが置き換えられます。
多くの場合はファイルの全ての置換対象文字列を置換の対象にしたいでしょう。その場合はgフラグを指定します。
:%s/置換対象文字列/置換文字列/g :%s/置換対象文字列/置換文字列/gc
1つ目の例ではgフラグのみ指定していますので、確認なしにファイルの中の全ての置換対象文字列を置換します。全ての置換対象文字列を確認しながら置換するには2番目の例のようにcフラグも指定します。このようにすればファイルの中の全ての置換対象文字列を1つずつ置換するかどうか確認しながら実行することができます。
特定の行を置換対象にするには「開始行,終了行」の形式で指定します。
:3.7s/置換対象文字列/置換文字列/g
この例では3行目から7行目までが置換対象になります。ある1行だけを指定するには数字を1つ指定します。
:3s/置換対象文字列/置換文字列/g
これは3行目だけを置換対象にします。
ところで、置換対象文字列や置換文字列に/がある場合はどうすれば良いでしょうか?/は:sコマンドのそれぞれの要素を区切る区切り文字として使われていますのでそのままでは使えません。1つの方法は/の前にバックスラッシュを付けてエスケープしてあげることです。
:%s/\/some\/hoge/\/foo\/bar/g
:sコマンドの要素の区切り文字は、実際には他の文字も使えます。例えば;や,です。その他に使える文字についてはドキュメントを参照してください。
:%s;/some/hoge;/foo/bar;g
その他の便利な機能
読み込み専用モード
- vim -R、view file
- 読み込み専用モードでファイルを開く
- :w!
- 強制的に上書き保存する
- :wq!
- 強制的に上書き保存しviを終了する
- :q!
- 強制的に変更を破棄してviを終了する
ファイルをうっかり変更したくない場合は読み込み専用モードを使います。viを起動するときに読み込み専用モードでファイルを開くには次のように入力します。
vim -R file
Unix系のOSなら、次のコマンドも同じ意味になります。
view file
読み込み専用モードで:wなどで上書き保存しようとするとエラーメッセージが表示されて保存できません。iコマンドなどを使って変更しようとしても警告メッセージが表示されます。しかし、変更することはできます。読み込み専用モードは変更を全く禁止するのではなく、あくまでも間違ってファイルを変更してしまうことを防ぐためのものだからです。
ただし、変更しても:wや:wqで上書き保存はできません。これを上書き保存するには次のように!を付けて強制保存します。
:w! :wq!
テキスト変更した場合に変更を破棄して終了するには通常通り:q!で行います。つまり!は本当に上書きする意思があるか、あるいは変更を破棄する意思があるか、うっかりではないかを確認するためです。
ビジュアルモード
- v
- ビジュアルモードへ移行する
- V
- ビジュアルモードへ移行して、行を選択する
- <Esc>
- ノーマルモードへ戻る
操作する範囲が単純ではなく、コマンドの組み合わせで実行できない場合はビジュアルモードを使います。
ビジュアルモードに入るにはvを押します。そしてカーソルを動かして変更したい領域を選択します。選択中はその領域が強調表示されます。最後にオペレータコマンドを入力します。例えば、選択した範囲を削除するには範囲を選択した後にdをタイプします。
ビジュアルモードを終了し、ノーマルモードへ戻るにはいつものように<Esc>をタイプします。
行全体を選択したい場合はVコマンドを使うと簡単です。Vコマンドはビジュアルモードに入って行全体を選択します。複数行を選択したい場合は続けて上下に移動します。すると、行単位で選択範囲が拡張されます。
行番号の表示と非表示
- :set number
- 行番号を表示する
- :set nonumber
- 行番号を非表示する
- CTRL-G
- 現在の位置を表示する。
行番号があると編集している場所が分かり易いことがあるでしょう。次のようにタイプして行番号を表示させることができます。
:set number
行番号を非表示にするには次のようにタイプします。
:set nonumber
カーソルがある場所を一時的にしりたい場合はCTRL-Gをタイプします。すると次のようなメッセージが表示されます。
"httpd.conf" line 339 of 1019 --33%-- col 11
左から編集中のファイル名、カーソル位置の行番号、ファイル全体の行数、ファイル全体に対する現在の位置の割合、カラム数がそれぞれ表示されます。
カーソル行の文字を検索する
次のコマンドはカーソルのある行で特定の文字を検索し、そこへカーソルを移動します。
- f<文字>
- 現在の行で<文字>を前方に検索し、見つかった文字にカーソルを移動する
- F<文字>
- 現在の行で<文字>を後方へ検索し、見つかった文字にカーソルを移動する
- t<文字>
- 現在の行で<文字>を前方検索し、見つかった文字の直前にカーソルを移動する
- T<文字>
- 現在の行で<文字>を後方検索し、見つかった文字の直前にカーソルを移動する
- ;
- 操作を繰り返す
- ,
- 操作を反対方向に繰り返す
f(findの意)に続けて文字を入力すると、現在のカーソル位置から最初に見つかった文字へカーソルを移動します。
Fはfと反対の方向へ検索を実行します。t(toの意)は見つかった文字の直前にカーソルを移動し、Tはtと反対の方向に検索します。;や,コマンドで操作を繰り返すのも同じです。
同じ文字を続けて検索を繰り返すには;コマンドを使います。;コマンドを繰り返して同じ文字を次々と検索することができます。目的の文字を通り過ぎてしまった場合は、,コマンドを入力します。,コマンドは同じ文字の検索を;とは反対方向へ繰り返します。
変更の繰り返し
- .
- 直前の変更操作を繰り返す
.コマンドは直前の変更操作を繰り返し実行します。
例えば、HTMLファイルの<B>タグを削除するとしましょう。手順は次の通りです。
- <を検索する(f<)
- >までを削除する(df>)
- 次の<を検索する(f<)
- df>を繰り返す(.)
- 同様の手順を繰り返す
この手順で.コマンドが繰り返すのはdf>というコマンドです。これで開始タグと終了タグのどちらの削除でも対応できます。ここで肝要なのは手順を繰り返し実行できるようにviのコマンドを組み立てることです。ここでは開始タグでも終了タグでも削除できるように繰り返すコマンドにdf>を選んでいます。
.コマンドはほとんどの変更を繰り返すことができますが、u(アンドゥ)、CTRL-R(リドゥ)、:で始まるコマンドは繰り返すことができません。