この記事では、ほとんどすべての Linux または UNIX システムで使用できる vi エディターの基本的な使用方法を説明します。この記事で説明する内容は以下のとおりです。
- vi を使用して文書をナビゲートする方法
- 基本 vi モードを使用する方法
- テキストを挿入、編集、削除、コピー、および検索する方法
この記事は、Linux Professional Institute の Junior Level Administration (LPIC-1) 101 試験の主題 103 の 103.8 の試験対策となります。この目標の重要度は 3 です。
この連載の記事を最大限に活用するには、Linux の基礎知識と、記事に記載されたコマンドを演習できる実際の Linux システムが必要です。プログラムのバージョンによって出力のフォーマットに違いが出てくる場合もあるため、コマンドの実行結果は必ずしもここに記載するリストや図とまったく同じであるとは限りません。
vi エディターは、すべての Linux および UNIX システムに備わっていると言っても過言ではないほどです。実際、システムに 1 つのエディターしかないとしたら、そのエディターはおそらく vi のはずです。そのため、vi を使いこなす方法を知っておくことには価値があります。この記事では vi の基本的な編集コマンドを紹介しますが、vi エディターの詳細については、チュートリアル「vi intro -- the cheat sheet method」 または man ページ、あるいは数多くの優れた書籍などを参照してください。
ほとんどの Linux ディストリビューションには、従来の vi ではなく、Vim (Vi IMproved) エディターが同梱されています。Vim は vi と上位互換になっており、グラフィカル・モード (gvim) を使用できるだけでなく、標準 vi テキスト・モード・インターフェースも備えています。さらに、大抵の vi コマンドは、Vim では別名コマンドか、シンボリック・リンクになっています。Vim には、tiny、small、normal、big、huge といったバージョンがありますが、どのバージョンを実行しているのか、そしてどの機能が含まれているのかは、以下のコマンドで調べることができます。
vi --version |
連載の以前の記事「Linux の 101 試験対策: プロセス実行の優先度」で取り上げた優先度の変更に関するセクションを思い出してください。あのセクションでは、実行中の count1.sh シェル・スクリプトを変更するという前提でしたが、これを自分で試してみると、コマンドの実行速度が速すぎて renice で優先度を変更するには時間が足りないことがわかったはずです。そこで今回は、vi エディターを使ってファイルの先頭に 20 秒間のスリープを設定する行を追加することにします。それによって、優先度を変更する余裕を設けようというわけです。
count1.sh プログラムを残していない場合は、ホーム・ディレクトリーでターミナル・ウィンドウを開いて、リスト 1 に記載するコマンドを貼り付けてください。これによって、lpi103-8 という名前のディレクトリーに count1.sh が作成され、カレント・ディレクトリーがこのディレクトリーに変更されます。
リスト 1. CPU を駆使するスクリプト - count1.sh
mkdir -p lpi103-8 & cd lpi103-8 & {
echo 'x="$1"'>count1.sh
echo 'echo "$2" $(date)'>count1.sh
echo 'while [ $x -gt 0 ]; do x=$(( x-1 ));done'>count1.sh
echo 'echo "$2" $(date)'>count1.sh
} |
既存のファイルを編集するには vi コマンドを使用し、パラメーターとしてファイル名を指定します。使用できる数多くのオプションについての詳細は、man ページまたは「参考文献」を参照してください。ここでは以下のようにオプションを使わずに、このコマンドを実行します。
vi count1.sh
上記のコマンドを実行すると count1.sh ファイルが開き、リスト 2 のような内容が表示されるはずです。Vim を使用している場合には、いくつかの単語や文字がカラーで表示されていることでしょう。Vim には構文の強調表示モード (元の vi エディターにはありません) があり、システムではデフォルトで、このモードがオンに設定されます。
リスト 2. vi による count1.sh の編集
x="$1" echo "$2" $(date) while [ $x -gt 0 ]; do x=$(( x-1 ));done echo "$2" $(date) ~ ~ ~ ~ "count1.sh" 4L, 84C 1,1 All |
vi エディターの起源は、すべての端末キーボードにカーソル・キーが備わっているわけではない時代に遡ります。そのため vi で実行できる操作はすべて、標準タイプライターに通常備わっているキーと、Esc や Insert などの少数のキーを使って実行することができます。その他のキーを使用できる場合には、vi が追加のキーを使用するように構成することも可能です。キーボードのほとんどのキーは、vi で何かしらの役に立ちます。vi ではカーソル・キーがない時代の遺産を引き継いでおり、また初期の端末では接続に時間がかかったことを考えると、vi が非常に短い暗号のようなコマンドを使用するという評判も納得できるはずです。そこで、まずはファイルをナビゲートするためのキーストロークから検討してみます。
ファイル内でカーソルを移動するには、以下のコマンドが役立ちます。
- h
- 1 文字左に移動します。
- j
- 次の行に移動します。
- k
- 前の行に移動します。
- l
- 1 文字右に移動します。
- w
- 次の単語の先頭 (もしくは句読点) に移動します。
- e
- 現在カーソルがある単語の末尾に移動します (カーソルが単語の末尾にある場合や、単語以外の位置にある場合は、次の単語の末尾に移動します)。
- b
- 現在カーソルがある単語の先頭に移動します (カーソルが単語の先頭にある場合や、単語以外の位置にある場合は、1 つ前の単語の先頭に移動します)。
- Ctrl-f
- 次のページにスクロールします。
- Ctrl-b
- 前のページにスクロールします。
上記のコマンドのいずれにしても、コマンドの前に数字を入力すると、その数字の回数だけコマンドが実行されます。この回数は、繰り返しカウント、または単にカウントと呼ばれます。例えば 5h と入力すると、5 文字左に移動します。繰り返しカウントは多くの vi コマンドで使用することができます。
ファイル内の特定の行にカーソルを移動するには、以下のコマンドが役立ちます。
- G
- ファイル内の特定の行に移動します。例えば 3G とすると、3 行目に移動します。パラメーターを指定しないで G を実行すると、ファイルの最終行に移動します。
- H
- 画面上の先頭行に移動します。例えば 3H は、画面上の先頭行から 3 番目の行に移動します。
- L
- H が画面上の先頭行を基準にしていたのに対し、L は画面上の最終行を基準に移動します。したがって 2L は、画面上の最終行から 2 番目の行に移動することになります。
ファイル内を自由に移動できるようになるまで、これらのコマンドを練習してください。カーソルが思った通りに動かなくなり、どうにもならない場合には、この先を読むとファイルから抜け出す方法を学べます。
新しいエディターについて学ぶときに最も役立つ知識の 1 つは、例えば重要な構成ファイルを壊してしまうといったような、してはいけないことをする前に、エディターを終了する方法です。vi を終了するときには、変更を保存することも破棄することも、あるいは最初からやり直すこともできます。以下に記載するコマンドが機能しないようであれば、挿入モードになっている可能性があります。このモードについては後で説明しますが、どのモードになっているか確かでない場合には、Esc を押すと挿入モードが終了してコマンド・モードに戻るので、コマンドが機能するようになるはずです。
- :q!
- ファイルの編集を終了し、すべての変更を破棄します。問題から抜け出るには、このコマンドが最も一般的な方法です。
- :w!
- これはファイルが変更されているかどうかに関わらずファイルに書き込みを行うコマンドで、既存のファイルや読み取り専用のファイル、またはその他の書き込み不可能なファイルの上書きを試行します。ファイル名をパラメーターとして指定すると、書き込み操作は開いているファイルではなく、指定したファイルに対して行われます。通常は、自分が何をしているのか自覚していない限り、「!」は省いたほうが安全です。
- ZZ
- ファイルが変更されている場合、ファイルの書き込みを行ってから終了します。通常の vi の終了方法としては、このコマンドが最も一般的です。
- :e!
- 現在開いているファイルの編集をやり直します。これによってファイルのリロードが行われ、ファイルでこれまでに行った変更内容は破棄されます。このコマンドは、保存されているファイルが何らかの理由で変更されたために最新のバージョンを開く必要がある場合にも使用できます。
- :!
- シェル・コマンドを実行します。コマンドを入力して Enter を押してください。コマンドの実行が完了すると、出力が表示され、vi 編集に戻るようにプロンプトが表示されます。
注:
- コロン (:) を入力すると、カーソルが画面の一番下にある、コマンドやパラメーターを入力できる行に移動します。
- 上記のコマンドの感嘆符 (!) を省略すると、変更が保存されていないというエラー・メッセージや、ファイルに書き込むことができないというエラー・メッセージ (例えば読み取り専用ファイルを編集している場合など) を受け取ることがあります。
- : コマンドには正式なフォーム (:quit、:write、:edit) がありますが、これらのフォームが使われることはほとんどありません。
vi エディターには以下の 2 つの操作モードがあります。
- コマンド・モード
- コマンド・モードでは、ファイル内を移動して、テキストの検索、テキストの削除、テキストの変更などの編集操作を行います。vi を起動すると、通常はコマンド・モードになっています。
- 挿入モード
- 挿入モードでは、ファイル内の該当する挿入箇所に新しいテキストを入力します。コマンド・モードに戻るには Esc (Escape) キーを押します。
この 2 つのモードのそれぞれによって、エディターの動作方法が変わってきます。挿入モードで入力した内容はすべて、ファイルに挿入されるテキストだと見なされます。コマンドを入力しようとしているのに何も起こらない場合、または文字がカーソルの下に現れる場合には、Esc キーを押し忘れて挿入モードのままになっている可能性があります。
vi でファイルを開いてファイル内を移動する方法、vi を終了する方法がわかったので、今度はファイルでテキストを編集する方法を説明します。
以下は、テキストの挿入、削除、または変更が必要なときに使用するコマンドです。これらのコマンドの一部には、小文字のコマンドと似たような操作を行う大文字のコマンドがあります。以下の説明を読んでください。
- i
- 挿入モードに移り、現在カーソルが置かれている文字の前に挿入します。テキストを入力して Esc キーを押すと、コマンド・モードに戻ります。現在カーソルが置かれている行の先頭に挿入するには I を使用します。
- a
- 挿入モードに移り、現在カーソルが置かれている文字の後に挿入します。テキストを入力して Esc キーを押すと、コマンド・モードに戻ります。現在カーソルが置かれている行の末尾に挿入するには A を使用します。
- c
- c コマンドを使用すると、挿入モードに移り、現在カーソルが置かれている文字を、入力した文字で置換することができます。
- o
- テキストを挿入する新しい行を現在カーソルが置かれている行の下に開きます。現在の行の上に行を開くには、O を使用します。
- cw
- 現在カーソルが置かれている位置から単語の末尾までを削除し、挿入モードに移って置換します。繰り返しカウントを使用することで、複数の単語を置換することができます。行の末尾まで削除して置換するには、c$ を使用します。
- dw
- 上記のcw (および c$) と同じですが、挿入モードには移りません。
- dd
- 現在カーソルが置かれている行を削除します。繰り返しカウントを使用することで、複数の行を削除することができます。
- x
- カーソルが置かれている文字を削除します。繰り返しカウントを使用することで、複数の文字を削除することができます。
- p
- 最後に削除したテキストを現在カーソルが置かれている文字の後に貼り付けます。現在の文字の前に貼り付けるには P を使用します。
- xp
- x と p の組み合わせは便利な慣用法です。この組み合わせは、カーソルが置かれている文字と、その右側にある文字を入れ替えます。
正規表現を使用して、ファイル内のテキストを検索することができます。
- /
- ファイル内で順方向に検索するには、/ の後に正規表現を続けます。
- ?
- ファイル内で逆方向に検索するには、? の後に正規表現を続けます。
- n
- n を使用すると、最後の検索を順方向または逆方向で繰り返します。
上記の検索コマンドの場合はいずれも、コマンドの前に繰り返しカウントを表す数字を付けることができます。したがって、/x の後に 2n を実行する代わりに、3/x を使用すれば、現在のカーソル位置から 3 番目に出現する x を検索することができます。同様に、2/^e とすると、現在のカーソル位置から 2 番目にある e で始まる行を検索します。
検索は、ファイルの終わりに達すると、ファイルの先頭に戻ることに注意してください。
vi で役立つコマンドには、ヘルプ・コマンドもあります。:help と入力すると、このコマンドが呼び出されます。ヘルプは vi の内部で開くので、ヘルプを終了して作業に戻るには :q コマンドを使用します。特定のトピックに関するヘルプを表示するには、:help の後に該当する単語を続けてみてください。例えば行の折り返しに関するヘルプを表示する場合は、:help wrap と入力します。
記事の初めでは、count1.sh ファイルに行を追加する必要があるという設定になっていました。元のファイルを保持し、変更後のファイルに count2.sh という名前を付けて保存するには、このファイルを vi で開いた後、以下の vi コマンドを使用することができます。注意する点として、ここでの <Esc> は、Esc キーを押すことを意味します。
リスト 3. count1.sh に行を追加するためのエディター・コマンド
1G O sleep 20<Esc> :w! count2.sh :q |
これらのコマンドが実行する内容は以下のとおりです。
- 1G
- ファイルの先頭行に移動します。
- O
- 移動した行の上に新しい行を開き、挿入モードに移ります。
- sleep 20
- これが、追加する新しいテキストです。
- <Esc>
- Esc キーを押してコマンド・モードに戻ります。
- :w! count2.sh
- 変更後のファイルをディスクに書き込みます。
- :q
- vi を閉じます。
以上のとおり、方法がわかれば簡単なことです。
101 試験の主題 103: GNU および UNIX コマンドに関する記事は、今回が最後です。連載の他の記事についての説明とリンクについては、連載のロードマップを参照してください。
学ぶために
- 2009年4月時点での目標に基づく LPIC-1 認定に備えるために必要な developerWorks の記事を見つけるには、developerWorks の LPIC-1 ロードマップを利用してください。
- LPIC Program サイトで、Linux Professional Institute の 3 つの Linux システム管理資格認定レベルについて、詳しい目標、タスクのリスト、そして出題例を調べてください。特に、2009年4月時点での LPI 101 試験および LPI 102 試験の目標は要チェックです。最新の目標については、必ず LPIC Program サイトを参照してください。
- developerWorks の連載「LPI exam prep」をすべて読んで、Linux の基礎を学び、2009年4月以前の LPI 試験の目標に基づくシステム管理者認定試験に備えてください。
- vi の使い方についてのチュートリアル、「vi intro -- the cheat sheet method」(developerWorks、2000年12月) では、Daniel Robbins が vi エディターを使用したテキストの編集方法、挿入モードの使用方法、コピー・アンド・ペーストの方法と併せ、ビジュアル・モードやマルチウィンドウ編集などの重要な Vim 拡張機能の使用方法を説明しています。
- Vim エディターのスクリプトの作成 エディターのスクリプト作成に関する詳細を学ぶには、まずは「Vim エディターのスクリプトの作成: 第 1 回 変数、値、式」(developerWorks、2009年5月) を読んでください。
- 「Basic tasks for new Linux developers」(developerWorks、2005年3月) を読んで、ターミナル・ウィンドウやシェル・プロンプトの開き方をはじめ、さまざまなタスクを行う方法を学んでください。
- The Linux Documentation Project には、HOWTO 文書をはじめ、各種の有益な文書が豊富に揃っています。
- developerWorks Linux ゾーンに豊富に揃った Linux 開発者向けの資料を調べてください。記事とチュートリアルの人気ランキングも要チェックです。
- developerWorks に掲載されているすべての「Linux のヒント」シリーズの記事と Linux チュートリアルを参照してください。
- developerWorks の Technical events and webcasts で最新情報を入手してください。
- Twitter で developerWorks をフォローしてください。
製品や技術を入手するために
- developerWorks から直接ダウンロードできる IBM ソフトウェアの試用版を使用して、Linux で次の開発プロジェクトを構築してください。
議論するために
- ディスカッション・フォーラムに参加してください。
- My developerWorks コミュニティーに加わってください。ここでは他の developerWorks ユーザーとのつながりを持てる他、開発者が主導するブログ、フォーラム、グループ、ウィキを調べることができます。

Ian Shields は、developerWorks Linux ゾーンの様々な Linux プロジェクトに関わっています。彼はノースキャロライナ州 Research Triangle Park にある IBM のシニア・プログラマーです。1973年にオーストラリアのキャンベラでシステム・エンジニアとして IBM に入社して以来、カナダのモントリオールやノースキャロライナ州 Research Triangle Park で、コミュニケーション・システムやパーベイシブ・コンピューティングに携わってきました。彼はいくつかの特許を保持しています。Australian National University にて純粋数学および哲学で学位を取得し、また North Carolina State University にてコンピューター・サイエンスで修士号と博士号を取得しています。