Daily ASCII Linux

All ASCII Linux Issue / Linux Magazine 2000年5月号

覚えておきたい必須コマンド30―その6・vi、最初の一歩

UNIX界でもっともベーシックなエディタvi。これを覚えれば設定ファイルももう恐くない。


2001年7月13日

はじめに

Linux magazine logo


Linux magazine 5月号表紙
本記事も収録 Linux magazine 2000年 5月号 1,390円
Linuxを触り始めると、まずやってみたくなるのが、さまざまな設定ファイルの書き換えだろう。そこで必要になるのがエディタだ。もちろん、ディストリビューションや、デスクトップ環境によっては、オリジナルのエディタが入っていたりすることもあるだろうが、Linux上で使われる代表的なエディタといえば、viとEmacsだ。
ここでは、そのうちのひとつ、viの使い方を説明する。



(山岸典将)


なぜviを使うのか

まず、Emacsはインストール時に選択されていないと導入されないこともあるが、viが入っていないシステムというのはまずない。また、最近のRed Hatなどでは、viは/binの下に入っていることもあり、/usrパーティションがマウントできないような緊急時にも使うことができるのだ(Emacsは/usr/binの下に入っている)。さらに、Emacsなどに比べると起動が速いので、ちょっと作業をしたくなったときなどに便利だ。

といっても、viは、メニューは出ないし、何か間違った操作をしても、最低限の警告しかしてくれない。もともとのUNIXの寡黙さを体現しているといってもよいエディタだ。しかし、実は慣れるとその独特の操作体系がとても使いやすく感じるようだ。

ただ、ここではviのすべてを紹介することはとてもできない。便利な使い方を追究するというよりも、最低限必要な操作方法を覚えるのが目的だ。

(山岸典将)


モードという概念

今までWindowsのエディタを使ってきた人の多くが、viは非常にとっつきにくいエディタだと感じるようだ。それはviにはモードの概念があるからだろう。viには文字を入力するための「入力モード」と、編集コマンドをタイプするための「コマンドモード」がある。入力モードでは、単に文字を打ち込んでいくこと以外はできず、カーソルの移動、文字の消去といった作業は、コマンドモードで行うことになる(正確には[Ctrl]-[h]で現在の入力モード内で入力した直前の文字だけは消去することができる)。

入力モードへ入るには[i]キーをタイプし、コマンドモードに戻るにはEscキーをタイプする(図1)。

図1
図1 入力モードとコマンドモード

それでは、早速viを立ち上げてみよう。

(山岸典将)


起動と終了

viの起動方法は、想像通り、コマンドラインでviのあとに編集するファイル名をタイプするだけだ。


$ vi foo.txt

すると、画面1のような状態で立ち上がる。

画面1
画面1 立ち上げ直後のvi

立ち上げてすぐの状態は、コマンドモードになっている。そこでまず、[i]をタイプして入力モードに入り適当な文字をタイプしてみよう。気をつけてほしいのは、viはコマンドの大文字と小文字を区別するということ。つまり[i]と[I]は別のコマンドになってしまうということだ。

入力モードの時は最下行に、“INSERT”の文字が表示される(画面2)。もっとも、これは本来のviの機能ではない。実はこのviはVIMというviクローンで、モードの表示はVIMの拡張機能だ。Red Hat Linux 6.0、LASER5 Linux 6.0 Rel.2、TurboLinux 4.5などではこのVIMをviとして使っている。もし使っているviがVIMでない場合、モードの表示はされない。

画面2
画面2 入力モードのときは最下行に[INSERT]と表示される

では、できあがったファイルを保存しよう。今は入力モードなので、Escキーをタイプしてコマンドモードに戻る。そし て保存するには、[:w]とタイプしよう(画面3)。

画面3

保存したら、続きを打ち込むことにしよう。[i]とタイプして、なにか1文字タイプしてみると、最後の1文字の前にタイプした文字が挿入されてしまう。実は、ここで続きをタイプするのに[i]コマンドは使えない。

先ほど説明した[i]コマンドは“insert”の略で、カーソルのある部分に文字を挿入するコマンドなのだ。それでは、文章の最後に文字を追加するにはどうすればよいのだろう。追加は“append”、そう、コマンドモードで[a]をタイプすればカーソルの後に文字を追加できる(図2)。

図2
図2 [i]コマンドはカーソル位置に挿入、[a]コマンドはカーソル位置のうしろに追加する

では、まず今間違って入力してしまった文字を消そう。まだ、入力モードにいるなら、[Ctrl]-[h]をタイプすると直前にタイプした文字を消すことができるが、ここでEscキーをタイプして、コマンドモードに移ってしまった場合は、どうするか。カーソル位置にある文字を消すには[x]をタイプすればよい。

間違った文字を消したら、コマンドモードで[a]を押して、続きを打ち込もう。

さて、なにか打ち込んだら、今度は、いったん終了する。まず、コマンドモードに戻る。そして今まで編集したファイルをセーブして終了するなら[:wq]+Enter、編集結果を破棄するなら[:q!]+Enterとタイプすればよい。もし、なにも編集していなければ[:q]+Enterだけで終了する。

(山岸典将)


カーソルの移動

さて、起動と終了方法がわかったら、次は、カーソルの移動方法だ。コマンドモードで[h][j][k][l]の4つのキーを押すと、それぞれ「左」「下」「上」「右」への移動になる(図3)。これは、頭で覚えようとしてはいけない。実際にキーボードを触ってみれば、この4つのキーが並んでいて、すぐに覚えられるはずだ。ただし、やってみればわかるが、この移動は行頭、行末を越えて移動することはない。行頭で、いくら[h]をタイプしても、カーソル位置はそのままだ。

図3
図3 [h][j][k][l]キーによるカーソル移動

なお、viの行とは、ワープロなどとは違い、改行位置までを1行としている。表示が2行でも、その間に改行が入っていなければ1行ということだ。

とりあえず適当なファイルを作って練習してみよう。


$ ls -l / > root.txt
$ vi root.txt

もっとも、これだけしか知らないと、移動の距離が長いときにはキーを連打しなくてはならなくなってしまう。そんなときは移動コマンドを使おう。移動コマンドの前にどれだけ移動したいかを指定できるので便利だ。たとえば、[10h]とタイプすれば、10文字分左に移動する。このコマンドの前の数字の指定は、[10x]とタイプすると10文字消去されるといったように、移動以外のコマンドにも有効だ。

(山岸典将)


残った必修コマンド

さて、カーソルの移動方法がわかれば、あとは[i][a]で文字を追加し、[x]で消去していけば、ある程度の編集ができるはずだ。しかし、今まで覚えたコマンドではどうしてもできないことが、いくつかある。

まず、2つの行をつなぐコマンドだ。ほかのエディタでは、カーソルが行末の文字がない部分に移動するので、そこを削除すれば、次の行がつながってくれるが、viではカーソルをそこに移動することはできない。

そこで、使われるのが大文字の[J]コマンド(join)だ。[J]をタイプすると改行が削除され、次の行が行末にくっつくことになる。この時注意してほしいのは、今いる行と、追加された行の間にはスペースが1つ入るということだ。このスペースは適宜[x]で削除しよう。

さらに、日常的にエディタを使ううえでは、カット&ペーストも必修項目だろう。

行を削除する場合は、[dd]コマンドを使う。そして[dd]コマンドをタイプすると、削除された行はviの内部に保存される(Windowsのカット、[Ctrl]-[x]と同じだ)。その行を別のところに貼り付けたいならば、その場所にカーソルを移動して大文字の[P]をタイプすると、カーソルのある行に削除した行が挿入される。ここで[P]の代わりに小文字の[p]を使うと、カーソルのある行の下に挿入されることになる。

もし、もとの行を削除せずにコピーしたい場合は、[yy]コマンドを使う。コピーしたい行で[yy]をタイプし、貼り付けは同じく[P]か[p]を使う(図4)。

図4
図4 カット/コピー&ペースト

これら[dd][yy]のコマンドも、コマンドの前に削除、コピーしたい行数を指定することができる。そして複数の行が削除されれば、もちろん[P]/[p]コマンドで複数の行が貼り付けられる。

なお、[P]/[p]コマンドでは[x]で削除した文字を貼り付けることもできる。この場合、[P]コマンドではカーソル位置に、[p]コマンドではカーソル位置の後に貼り付けられることになる。

(山岸典将)


アンドゥと繰り返し

ここまでで覚えた操作を組み合わせれば、自由自在にとまではいかないだろうが、なんとか必要なファイルを編集することはできるはずだ。といっても、これだけではとても効率的に編集はできない。

次に覚えたいのが、アンドゥと繰り返しコマンドだ。

[u]コマンド(undo)を使うと直前の操作を取り消すことができる。[u]が有効なのは今まで出てきた中では、[x]、[J]、[dd]、[y]、[P]、[p]コマンド、そして直前の入力モードでの入力だ。さらにある行を編集していて、その行から別の行に移動していない場合は、[U]コマンドでその行に対して行った変更のすべてを取り消すことができる。

アンドゥがあれば、繰り返しコマンドもある。[.]をタイプすると直前に行った操作を繰り返すことができる。[.]コマンドが効く操作も[u]コマンドと同じだ。「12345」と入力し、コマンドモードに戻って、[.]を4回タイプすれば「12345123451234512345」と入力される。

(山岸典将)


検索

設定ファイルなどを編集していると、設定項目の文字列を検索したくなることは多い。

viの検索コマンドは[/]だ。[/]をタイプすると最下行に“/”が表示されるので、それに続けて検索したい文字列とEnterキーをタイプする(画面4)。もし、文字列が存在しない場合は“Not found”と表示される。同じ文字列を続けて検索したい場合は[n]をタイプする。逆方向に検索したい場合は[N]をタイプすればよい。最初から逆方向に検索したい場合には[?]をタイプして、検索したい文字列そしてEnterキーをタイプする。

画面4
画面4 [/]で“home”という文字列を検索する

文字列の置換は、[:]、置換開始行番号、置換終了行番号、検索する文字列、置換する文字列の指定、オプションの指定で行う。図5のコマンドではファイル中のすべての“foo”に対して“bar”への問い合わせ置換を行う。

図5
図5 問い合わせ置換のコマンド例

(山岸典将)


高度な移動

大きく移動したいときには数字のあとに移動コマンドをタイプする、と書いた。が、実際にはファイルの内容を眺めながらスクロールさせていきたい、という場面も多い。スクロールさせるためのコマンドは、Ctrlキーとアルファベットを組み合わせたもので、そのスクロール量に応じていくつかある。図6を見てほしい。

図6
図6 スクロールコマンド

移動したい行番号がわかっているときには、[G]コマンドで移動できる。10行目に行きたいなら[10G]とタイプすればよい。単に[G]とだけタイプすると、ファイルの最終行にジャンプする。そして、その行の番号を知りたい場合には、[Ctrl]-[g]をタイプする。

さて、以上駆け足だったが基礎的なviの使い方を紹介した。これらは、viの機能のほんのさわりだけだ。しかし、ここで書いたことを覚えていれば、ちょっとしたファイルの編集をするには十分だろう。

(山岸典将)




[通常ページに戻る]
ASCII24 http://ascii24.com/
Copyright (C)1999-2006 ASCII Corporation. All rights reserved.