viの使い方
Linuxの設定はすべてテキストファイルで保存されている。Windowsではレジストリというバイナリファイルに設定を保存するのが基本であり、中身を見たり、編集したりするには、専用のレジストリエディタが必要だ。しかし、Linuxはすべてテキストファイルで記述されているから、テキストファイルを扱えるエディタであれば何でも閲覧や編集に使える。
サーバーの各種設定を行うためには欠かすことができないエディタだが、Linuxには「vi」という名前のエディタが備わっている。ほかにもMuleやEmacsなどのエディタがあるけれど、どのシステムにでもインストールされているわけではない。だが、viならどんなシステムにも入っているため、いつでも同じようにテキストファイルの編集ができる。
viというエディタはなかなかクセがあって、Windowsのメモ帳などとは使い方が大きく異なっている。操作になれるまでは大変かもしれないが、これからずっと付き合っていかなければならない存在だ。viを使えないことにはサーバーの設定もできない。使い方をしっかりおぼえよう。
[vi入門編]入力モードとコマンドモード
viを起動するには「vi ファイル名」として「Enter」キーを押す。すると右上の写真のようにviが起動するはずだ。
viには「入力モード」と「コマンドモード」という2つのモードがある。入力モードというのは文字通り文字を入力するモード、コマンドモードというのはコピーや削除といった編集操作を行うモードだ。viを起動した状態ではコマンドモードになっているので、編集したい位置にカーソルを移動してから入力モードに切り替えなければならない。
コマンドモードのまま文字を入力しようとキーボードを叩いてはいけない。コマンドモードでは文字キーに各種コマンドが割り当てられているので、文字入力のつもりでキーを押すと文字が消えたり移動したり、予測不能なことが次々に起きる。viになれたボクでもこの失敗はよくやる。だが、ファイルを保存しない限りは画面上で文字が消えても大丈夫なのであせらないように。ちなみにコマンドモードで「u」キーを押すと前の操作を取り消せる。何度も押せばどんどん前に戻っていく。
コマンドモードから入力モードへ切り替えるには「i」キーを押し、入力モードからコマンドモードへ切り替えるには「Esc」キーを押す。まずはこの2つのキーを頭にたたき込もう。
いったん入力モードになれば、使い方はWindowsのエディタなどとそう違いはない。カーソルキーでカーソルを移動させ、文字を入力したり、「BackSpace」キーでいらない文字を消したりできる。
だが、どのviでもこういう操作ができるわけではない。もともとのviは入力モードでカーソルを動かしたり、「BackSpace」キーで文字を消したりはできなかった。「i」キーで入力モードにうつっても、文字を入力できるのはその場所だけ。ほかの場所に文字を入力するには、「Esc」キーでコマンドモードに戻らなければならない。今でもそういう仕様のviもあるが、Vine Linuxのviは入力モードの自由度が高いためにそう戸惑うことはないはずだ。実はVine Linuxについてくるのはviではなくvim(vi improved)である(viで起動することはできるが)。
入門編でほかに覚えておきたいのは、保存と終了の方法である。コマンドモードで「:w」と入力して「Enter」キーを押すと編集中のファイルを保存でき、「:q」のあとに「Enter」キーを押すとviを終了できる。また、保存せずにviを終了するには「:q!」で「Enter」キーを押す。もし変な操作をして、しまった!と思ったら、「Esc」キーでコマンドモードに戻って、「:q!」でviを終了してしまえばいい。
とりあえずこれだけの操作を覚えておけばviでのテキスト編集はできるはずだ。
| 「i」キー | 入力モードに切り替える |
| 「Esc」キー | コマンドモードに切り替える |
| 「:w」のあとに「Enter」 | 編集中のファイルを保存する |
| 「:q」のあとに「Enter」 | viを終了する |
| 「:q!」のあとに「Enter」 | 変更を破棄してviを終了する |
[vi初級編]カーソル移動に使うキー
システムやアプリケーションの設定ファイルには長いものが多い。Apacheの「httpd.conf」やPostfixの「main.cf」など数百行から一千行もの長さになる。こんな長いファイルの最後の方を編集しようとして、カーソルキーで移動していたのでは日が暮れて夜が明けてしまう。ならばページ単位で移動しようとしても「PageUp」キーや「PageDown」キーはきかない。
また、WindowsからSSHでLinuxにログインしているとき、思わず編集した場所をマウスでクリックしてしまう。viでマウスは使えないので、こんなことをしても何の反応もない。すべてキーボードで操作しなければならない。そこで覚えておきたいのがカーソル移動に使うキーである。
ボクがよく使うのは「:0」と「:$」だ。「:0」と入力して「Enter」キーを押すとカーソルがファイルの先頭に飛び、「:$」「Enter」でファイルの末尾に飛ぶ。数十行のファイルなら先頭か末尾にジャンプして、そこからカーソルキーで目的地に向かうのがはやい。また、この2つと関連して覚えたいのが「:」のあとに数字を入力するもの。指定した行番号にカーソルが移動してくれる。たとえば「:100」に「Enter」で100行目にジャンプする。
言うまでもないことだが、カーソル移動のコマンドはコマンドモードで行うこと。入力モードで「:0」とキーを叩いても、ファイルに「:0」と追加されるだけだ。
次はページ単位の移動だ。1画面下への移動が「Ctrl」+「f」キー、1画面上への移動が「Ctrl」+「b」キーである。fというのは「forward」、bというのは「backward」の意味だろう。長いファイルをさくさくと見ていきたいときに活用できる。
1文字単位のカーソル移動にも文字キーが割り当てられている。上が「k」、下が「j」、左が「h」、右が「l」だ。世の中にはカーソルキーのないキーボードもあるから、文字キーでカーソルを移動できるようにする必要があったのだろう。
だが、Linuxの達人はカーソルキー付きのキーボードであっても文字キーでカーソルを動かしている。これは文字キーであればホームポジションから指を動かさずにすむためだ。確かになれればカーソルキーを使うよりも快適かもしれないが、最初の段階であえて覚える必要もないだろう。
| :0「Enter」 | ファイルの先頭にジャンプ |
| :$「Enter」 | ファイルの末尾にジャンプ |
| :××「Enter」 | 指定した行にジャンプ |
| 「Ctrl」+f | 1画面下へ移動 |
| 「Ctrl」+b | 1画面上へ移動 |
[vi中級編]検索機能を使いこなす
viでは検索機能が大活躍する。長い長い設定ファイルの中である項目を変更したいとき、上から順に探していったのでは目が疲れ、肩がこり、頭が痛くなってくる。そんなとき検索をかければ、一瞬のうちに目的の場所を探し出せる。
検索は「/」のあとにキーワードを入力する。たとえば、「Hostname」というキーワードで検索したいなら、コマンドモードで「/Hostname」と入力して、「Enter」キーを押す。カーソルのある位置から後ろへと検索をはじめ、見つかった場所にカーソルを移動してくれる。もしそこがお目当ての場所でなければ、「n」キーを押す。さらに後ろへと検索を続け、次にHostnameがある場所に移動する。言葉で書けば長ったらしいが、検索は一瞬で終わるので、「n」キーを叩き続ければカーソルがポンポンと移動していく。
もし「行きすぎた!」となったときは、「Shift」キーを押しながら「n」キーを押す。つまり、「N」を入力すると前のキーワードの場所に戻ってくれる。
viのコマンドモードでは大文字と小文字とで別の機能を表すことが少なくない。たとえば、入力モードに切り替える「i」ではカーソルの左に文字を挿入するが、大文字の「I」ではカーソルが行頭にジャンプして、行頭に文字を挿入する意味になる。同様に文字を削除するコマンドでは「x」がカーソル位置の文字を切り取るのに対し、「X」がカーソル位置の左にある文字を切り取る。
注意したいのが「CapsLock」キーの状態だ。CapsLockを押した状態ではすべて大文字で入力されるため、知らずにいると思いもしない操作をしてしまう。たとえば、「i」キーで入力モードに切り替えたとき、いきなりカーソルが行頭にジャンプすることになる。何かおかしいと思ったときはCapsLockの状態を確認しよう。
| /キーワード 「Enter」 | キーワードのある場所にカーソルを移動 |
| n | 下に向かって次を探す |
| N | 上に向かって次を探す |
[vi上級編]カット&ペーストもできる
設定ファイルを編集するさいに、ある部分をほかの場所にコピーするという場面がしばしばでてくる。たとえば、Apacheでバーチャルホストの設定をするときに、コメントされているテンプレートをコピーして書き換えてやる。また、Sambaで共有フォルダを作成するときも、テンプレートのコピーを書き換えると間違いをおかさずにすむ。
Windowsのエディタならコピーしたい部分をマウスでドラッグして選択し、メニューからコピーや貼り付けを選べばいい。だが、viではマウスを使えないのですべてキーボードで操作をすることになる。なれないうちはコピーはやりにくい。ちょうどMS-DOSのワープロでコピーをするのと同じ要領だといえば、分かる人には分かるだろうか? もうそんな昔のことは覚えていない?
例を出せば分かりやすい。
下のようなファイルで赤字の部分をいちばん下にコピーしてみよう。
コピーする部分をまずバッファに取り込むのだが、コマンドモードで「yy」とキーを叩くとカーソル行がバッファに入る。次に挿入したい部分へカーソルを移動し「p」を押す。ちなみにyというのはyank(ぐいっとひっぱる)からきたもので、pはpaste(はりつける)からきたものだ。
だが、赤字の部分は7行もあるから、「yy」→「カーソル移動」→「p」という操作を7回も繰り返さなければならない。これはけっこうたいへん。複数の行をまとめてコピーするには「数字yy」とすればいい。つまり、「7yy」と順にキーを押せば、カーソル行から7行分がバッファに取り込まれる。そして、いちばん下までカーソルを移動して、「p」を押せばバッファの内容が貼り付けられる。
#
# If you want to use name-based virtual hosts you need to define at
# least one IP address (and port number) for them.
#
#NameVirtualHost 12.34.56.78:80
#NameVirtualHost 12.34.56.78
#
# VirtualHost example:
# Almost any Apache directive may go into a VirtualHost container.
#
#<VirtualHost ip.address.of.host.some_domain.com>
# ServerAdmin webmaster@host.some_domain.com
# DocumentRoot /www/docs/host.some_domain.com
# ServerName host.some_domain.com
# ErrorLog logs/host.some_domain.com-error_log
# CustomLog logs/host.some_domain.com-access_log common
#</VirtualHost>
#<VirtualHost _default_:*>
#</VirtualHost>
NameVirtualHost *
コピー系のコマンドはほかにもある。「v」を押すと範囲選択のモードになるので、カーソルキーを使ってコピーしたい範囲を反転させよう。そこで「y」を押すと反転した部分がバッファに入り、「p」で貼り付けることができる。「yy」では行単位にコピーだったが、「v」を使うと文字単位でのコピーができる。
また、カットも似たコマンドでできる。「dd」を押すとカーソル行が削除されてバッファに入る。「v」を押して範囲選択をしてから「d」を押すと反転した部分が削除されてバッファに入る。どちらも「p」を押せばバッファの内容を貼り付けられる。
| yy | カーソル行をバッファにコピー |
| 数字yy | 指定した行数分だけバッファにコピー |
| p | カーソル位置にバッファを挿入 |
| v | 範囲選択を開始する |
| dd | カーソル行をカットしてバッファにコピー |
| 数字dd | 指定した行数分だけカットしてバッファにコピー |
ここまでviの代表的なコマンドを紹介してきたが、これだけ覚えれば困ることはない。viにはほかにも数多くのコマンドがあるが、そのすべてを覚えるのは無理というもの。まずは基本をしっかりと身につけ、余裕が出てきたら少しずつ新しいコマンドを覚えていけばいいだろう。
viの代表的なコマンド
| 保存・終了 | :q | 終了 |
| :wq | 保存して終了 | |
| :q! | 保存せずに終了 | |
| ZZ | 終了(変更時は保存してから) | |
| :w | 上書き保存 | |
| :w ファイル名 | 別名で保存 | |
| 入力・挿入 | i | カーソルの左に挿入 |
| I | 行頭に挿入 | |
| a | カーソルの右に挿入 | |
| A | 行末に挿入 | |
| o | 下に1行挿入 | |
| O | 上に1行挿入 | |
| 削除・切り取り | x | カーソル位置を1文字切り取り |
| 数字x | カーソル位置から指定文字切り取り | |
| X | カーソルの左を1文字切り取り | |
| 数字X | カーソルの左を指定文字切り取り | |
| dd | カーソル行を切り取り | |
| 数字dd | カーソル行から指定行切り取り | |
| d^ | カーソル位置から行頭まで切り取り | |
| d$ | カーソル位置から行末まで切り取り | |
| コピー | yy | カーソル行をコピー |
| 数字yy | カーソル行から指定行コピー | |
| v | 範囲選択を開始 | |
| y | 選択部分をコピー | |
| 貼り付け | p | カーソル行の下に貼り付け |
| P | カーソル行の上に貼り付け | |
| カーソル移動 | h | 1文字左へ |
| l | 1文字右へ | |
| j | 1文字下へ | |
| k | 1文字上へ | |
| 0 | 行頭へ | |
| $ | 行末へ | |
| Ctrl+d | 半画面下へ | |
| Ctrl+u | 半画面上へ | |
| Ctrl+f | 1画面下へ | |
| Ctrl+b | 1画面上へ | |
| :$ | ファイル末尾へ | |
| :0 | ファイル先頭へ | |
| :数字 | 指定行へ | |
| 検索 | /文字列 | 文字列を後方へ検索 |
| ?文字列 | 文字列を前方へ検索 | |
| n | 後方の次の候補 | |
| N | 前方の次の候補 | |
| 置換 | :%s/文字列1/文字列2/g | すべての文字列1を文字列2に置換 |
| :%s/文字列1/文字列2/gc | すべての文字列1を文字列2に置換(確認あり) | |
| 取り消し | u | 直前の操作を取り消し |
| U | 現在行に加えられたすべての操作を取り消し | |
| そのほか | . | 直前の操作を繰り返し |
| m文字 | カーソル位置をマーク(文字はaからzまで) | |
| '文字 | マークした行へカーソルを移動(文字はaからzまで) | |
| :h | ヘルプを表示 |