* パート1 [#zf62d021]
** ファイルの中を見る [#wbba8b59]
viエディタは、vi, view, exのコマンドを提供しています。
最初は、読込専用のviewを使ってファイルの中身を覗いてみましょう。

/etc/protocolsファイルの内容を見てみましょう。
端末ソフトから以下のコマンドを入力して下さい。
((最初の$ は、プロンプトで入力しません。))

#pre{{
$ view  /etc/protocols
}}

&ref(th_Fig1.jpg);


画面の一番下には、ファイル名、"[readonly]"、行数、文字数が表示されます(図1参照)。
viewコマンドを使うことでファイルが読み込み専用として扱われていることがこれで分かります。

*** 画面スクロール [#b24c3752]
矢印キーでカーソルを動かし、画面をスクロールさせることも可能ですが、
スクロールコマンドを使うと素速くスクロールさせることができます。
順方向のスクロールにはコントロールキーとfキーを同時に押す
(以降Ctrl-F形式で表し、慣例でコントロールキーの後のキーは大文字で表記します。)
ことで、最後の2行が重なるようにスクロールします。
逆方向の複ロールは、Ctrl-Bです。

プログラムを追いかけるときには、1画面ではなく、ページの半分を動かしたくなりますが、
このような場合には、Ctrl-D(順方向半画面スクロール)とCtrl-U(逆方向半画面スクロール)
を使います。

viでは、通常コマンドの前に数値を入力するとその回数分繰り返すとか行数を指定する意味に
解釈されます。
2Ctrl-Fと2画面分順方向にスクロールし、20Ctrl-Dとすると20行分順方向にスクロールします。
色々試してみて下さい。

表示画面が一部でファイルの終わりになった場合には、残りの行にはチルダ−(~)が表示されます(図2参照)。

&ref(th_Fig2.jpg);

また、行が長くてすべてを表示できない場合には、表示できない行を@で表示します(図3参照)。
((/etc/protocolsには、長い行はないので、少し加工して表示しています))


&ref(th_Fig3.jpg);




*** 指定した行を表示 [#n5470c6f]
コンパイルエラー等で表示したい行数が分かっている場合には、行番号に続けてGを入力します。
行番号も一緒に表示するには、:set numberまたは省略して:set nuと改行を入力します(図4参照)。
((:を入力すると画面の最下部にカーソルが移動し、ラインエディタモード(exモードと記す)になり、exコマンドの機能を使うことができます。))


&ref(th_Fig4.jpg);

行番号表示では、行番号の列と内容が重ならないように表示されます(図5参照)。
((Mac OSXのviでは、行番号が色分けして表示されます))

&ref(th_Fig5.jpg);

行番号表示を解除して、元に戻すには、:set nonumberまたは省略してset nonuと入力します。


Gコマンドで行番号を指定しないと最後の行にカーソルが移動します。また、exモードで
:行番号と改行を入力することもできます。


*** タブを見る [#z80e5c2e]
タブ区切りのデータファイルやMakefileでは、タブキーが重要な役割をしますが、
通常の画面表示では、タブの場所が確認できません。


:set listと改行を入力するとリスト表示に切り替わります。
タブキー等のコントロールコードは、^+コントロールコード形式で表示され、
タブの場合、^Iと表示されます。また、行の終わりには$が追加されます(図6参照)。

&ref(th_Fig6.jpg);



リスト表示から通常の表示に戻すには、:set nolistと改行を入力します。

*** 文字列の検索 [#tf78fe5a]
ファイルの中身を見るときによく使うのが、文字列検索です。

viエディタでは、/の後に検索する文字列を入力して改行を押すことで、
文字列検索ができます。
また、ファイルの先頭に方向に向かって検索する場合には、?の後に検索する文字列を入力します。

早速、/etc/protocolsファイルで試してみましょう。
/protocol改行と入力すると2行目のprotocolsの先頭にカーソルが移動します。

同じ検察文字列を続けてサーチするには、nを押します。検索したときと逆方向に
サーチするには、Nを押します。

検索文字がファイルの終わりに達したら、またファイルの先頭から検索します。
その時、以下のメッセージを表示します。

#pre{{
search hit BOTTOM, continuing at TOP
}}

/etc/protocolsでprotocolという文字列は多く現れていますので、検索の練習によいでしょう。

*** エディタの終了 [#na4e44cf]
これまで、viewを使ってファイルの中身を見てきましたが、エディタを終了には:qと改行を入力します。

viでは、ファイルの内容を変更した後に、保存しないで終了しようとすると図7の様な警告が表示されます。
#pre{{
E37: No write since last chage (add ! to override)
}}

ファイルへの変更を保存しないで、強制的に終了する場合には、:q!改行のようにコマンドの後に!を付けます。

&ref(th_Fig7.jpg);



*** 複数のファイルを扱う [#a46ae85c]
viewを含めviエディタでは複数のファイルを扱うことができます。

例として、/etc/apache2でhttpd関連の設定ファイルの中身を見てみましょう。

端末ソフトで以下の様に入力してください。MacOSXの場合、最初に/etc/apache2/httpd.conf
が表示されました。
#pre{{
$ view /etc/apache2/httpd*.conf
}}

どんなファイルを表示しようとしたかは、:argsと改行で知ることができます。
[]で括られたファイルが現在表示しているファイルです。改行を押すと元の画面に戻ります。

&ref(th_Fig8.jpg);



次のファイルに切り替えるには、:nと改行を入力し、一つ前のファイルに切り替える場合には:Nと改行を入力します。


他のviコマンドと同様にnやNの前に数値を入力するn個後のファイルやn個前のファイルに切り替えることができます。
試しに、上記の状態で:3nと改行を入力してみます。
ファイルが3つ後のhttpd_corecollaboration_webauth.confに切り替わりました。
:argsと改行を入力すると、httpd_corecollaboration_webauth.confが[]で囲まれています。

#pre{{
httpd.conf httpd_ACSServer.conf httpd_corecollaboration_required.conf [httpd_cor
ecollaboration_webauth.conf] httpd_corecollaboration_webcal.conf httpd_deviceman
agement.conf httpd_mailman.conf httpd_passwordreset_required.conf httpd_podcastl
ibrary.conf httpd_webdavsharing.conf httpd_webdavsharing_sharepoints.conf httpd_
webdavsharing_template.conf httpd_webmailserver.conf
Press ENTER or type command to continue

}}

また、最初のファイルから見直す場合には、:rewまたは:rewindと改行を入力します。

複数ファイルを表示している途中(最後のファイルを表示する前)で終了しようとすると、
以下のエラメッセージを表示します。 この場合、:q!と改行で終了できます。

#pre{{
E173: xx more fiels to edit
}}

*** ファイルの中身を見るのに使ったコマンド一覧 [#b68c4715]
これまで、使ってきたviewのコマンドを表1にまとめて示します。

| コマンドの機能 | 呼び出し形式 | 使用例 |h
| viewの起動 | view ファイル名... | view /etc/protocols: /etc/protocolsを読込専用で表示 |
| 順方向1画面スクロール | [n]Ctrl-F | Ctrl-F: 1画面順方向にスクロール、 3Ctrl-F: 3画面分順方向にスクロール |
| 逆方向1画面スクロール | [n]Ctrl-B | Ctrl-B: 1画面逆方向にスクロール、 2Ctrl-B: 2画面分方向にスクロール |
| 順方向半画面スクロール | [n]Ctrl-D | Ctrl-D: 半画面順方向にスクロール、20Ctrl-D: 20行順方向にスクロール |
| 逆方向半画面スクロール | [n]Ctrl-U | Ctrl-U: 半画面逆方向にスクロール、40Ctrl-D: 40行逆方向にスクロール |
| 指定行を表示 | [n]Gまたは:n改行 | n行目が画面の中央に来るように表示、Gとすると最後の行を表示する |
| 行番号を表示 | :set nu改行または:set number改行 | :set nuで画面左端に行番号を付加して表示 |
| リスト表示 | :set list改行 | :set listでタブは、^Iで行の終わりはで表示 |
| 順方向文字列検索 | /検索文字列改行 | /protocol: ファイルのprotocolという文字列を順方向に検索 |
| 逆方向文字列検索 | ?検索文字列改行 | ?http: ファイルのhttpという文字列を現在位置から逆方向に検索 |
| 前の検索文字列と同じ方向に検索 | n | /protocol改行の後にnを入力すると次のnにカーソルを移動 |
| 前の検索文字列と逆方向に検索 | N | /protocol改行の後にNを入力すると前のprotocolnにカーソルを移動 |
| 引数で与えたファイル一覧を表示 | :args改行 | :args: 現在表示中のファイルを[]で囲んで引数の一覧を表示 |
| 次のファイルに切替 | :[n]n改行 | :n改行 : 次のファイルを表示、:2n改行 : 2つ後のファイルを表示 |
| 前のファイルに切替 | :[n]N改行 | :N改行 : 一つ前のファイルを表示 |
| 引数の先頭に切替 | :rew改行または:rewind改行 | :rew改行 : 先頭のファイルを表示 |
| コマンドの終了 | :q [!] | :q改行 : コマンドの終了、:q!改行 : 強制終了 |



*** コラム(3つの顔をもつエディタ) [#d9b76f7b]

vi, view, exは同じプログラムで、呼び名によって振る舞いを変えています。
- viで起動された場合には、通常のviエディタとして機能
- viewで起動された場合には、読込専用のビューアとして機能
- exで起動された場合には、ラインエディタとして機能

このように、unixのコマンドにはargv[0]の文字列で処理を変える物が存在します。

更にMac OSXのvi, view, exを調べるとvimコマンドへのリンクになっています。
((時代の流れを感じますね。))

#pre{{
$ ls -l /usr/bin/{vi,ex,view}
lrwxr-xr-x  1 root  wheel  3  4 10  2012 /usr/bin/ex -> vim
lrwxr-xr-x  1 root  wheel  3  4 10  2012 /usr/bin/vi -> vim
lrwxr-xr-x  1 root  wheel  3  4 10  2012 /usr/bin/view -> vim

}}


* パート2 [#m5350ee8]
** viコマンドを使ってみる [#z934edab]
viewコマンドでファイルの中をみることができるようになったので、viコマンドでファイルの編集をしてみましょう。


*** カーソル移動 [#gce8b67d]
カーソルの移動は、カーソルキー(←、↓、↑、→)も使えますが、viに割り当てられたキー(h、j、k、l)を使うと
キーボードのホームポジションで楽にカーソルを移動することができます。
((vi操作の基本は、ホームポジションを維持しながら、編集することです。そうすることで編集時の目の疲れが軽減され、間違いも少なくなります。))

これから説明するviのカーソル移動キーを図9に示します。

&ref(Fig9.png);


カーソルキーもキーの前に数値を入力すると、数値分繰り返したように移動します。
3jと入力すると3行下に移動します。


*** カーソル移動の練習 [#u1da5e3f]
以下の様なRougeの迷路の図があります(ローグ Wikipediaから引用)。画面から目を離さずに、h, j, k, lだけを使って上部の囲みの%から廊下#に沿って下部の囲みの^まで机上でカーソルを動かしてみて下さい。((素速く動かさないとモンスターHに襲われますよ))


&ref(rouge.png);

*** 単語単位の移動 [#be7f9ca7]
viでの単語は、C言語で扱い安いようにアルファベットと数字、アンダーライン(_)が続いて部分をword(以下小ワード単位と記す)として移動します。

図10を使ってカーソル移動を説明します。変数g_var0のgの位置にカーソルがあり、wを続けて入力することで、
カーソルが=, 1, ;に移動します(図11-a, 11-b, 11-c参照)。
今度は、;の位置でbを入力すると1, =, gとword単位逆方向に移動します。

これに対して、スペース、タブ、改行などの空白類で区切られた単位をWord(以下大ワード単位と記す)と
して移動するコマンドがWとBです。図10のg_var0のgの位置でWを続けて入力することで、
カーソルがifの先頭のi、(、!と空白類単位で移動します(図12-a, 12-b, 12-c参照)。
逆にBを入力すると(、i、gと最初の位置に戻ります。

また、小ワードの終わりに移動するにはe、大ワードの終わりに移動するにはEを使います。g_var0でeと入力
すると、0の位置にカーソルが移動し、gの位置からEを入力すると;に移動します(図13-a, 13-b参照)


図10

&ref(th_Fig10.jpg);

図11(a, b, c)

&ref(Fig11-a.png); &ref(Fig11-b.png); &ref(Fig11-c.png);



図12(a, b, c)

&ref(Fig12-a.png); &ref(Fig12-b.png); &ref(Fig12-c.png);



図13(a, b)


&ref(Fig13-a.png); &ref(Fig13-b.png);




*** 行内文字サーチ [#qdfa5819]
カーソル位置から行末方向に文字を検索するコマンドがfで、f=のようにfの後に検索したい文字を入力します。
g_var0のgの位置でf=と入力すると=にカーソルが移動します(図14-a, 14-b参照)。

図14(a, b)

&ref(Fig14-a.png); &ref(Fig14-b.png);



文字列サーチと同様に文字検索も前に検索した文字を記憶しており、同じ文字を検索するには、;を入力します。
次の行のifのiにカーソルを移動して、;と入力すると!=の=にカーソルが移動します。
もう一度;を入力してみてください。警告音が鳴ってカーソルは移動しません。
行内文字サーチなのでカーソル位置の後に検索文字がそれ以上見つからないと警告音で知らせます。

逆方向に文字検索するには、,を使います。
g_var0の行末;にカーソルを移動して、,と入力するとg_var0の後の=にカーソルが移動します。

fとは逆に行頭方向に文字を検索するには、Fを使います。

時には、検索文字の前にカーソルを移動したい場合があります。((後で説明する置換や削除コマンドと一緒に使います))
それにはtとTをfとFの代わりに使用します。g_var0のgの位置からt=と入力すると=の直前の0にカーソルが移動します(図15-a, 15-b参照)。

図15(a, b)


&ref(Fig15-a.png); &ref(Fig15-b.png);



行内文字検索機能はディスプレイを見ながら目的の場所に素速くカーソルを移動する時にとても便利です。


*** 画面の先頭・中央・末尾への移動 [#r76da29b]
タブや空白以外の行の先頭文字に移動する場合は^を使い、物理的な行の先頭に移動する場合には0を使います。
この逆に行の終わりに移動するには$を使います(図16-a, 16-b, 16-c参照)。


図16(a, b, c)


&ref(Fig16-a.png); &ref(Fig16-b.png); &ref(Fig16-c.png);







画面の中央の行頭に移動するにはMと使い、画面上部先頭に移動するにはH、下部先頭に移動するはLを使います。
もちろん2Hと入力すると画面上から2行目行頭に移動し、2Lとすれば画面下部から上に2行目の行頭に移動します。

*** ちょっと便利なカーソル移動 [#c18dcbe3]
これまでのカーソル移動キーを使えば、画面を見ながら自分の思ったところにカーソルが移動できるように
なります。

ここからカーソル移動の小技として、以下の2つを紹介します。
- カッコの対に移動
- マーク機能

最初にカッコの対に移動するには、%を入力します。
(), [], {}などの括弧にカーソルを移動し、%を入力すると対応する括弧の位置にカーソルが移動します。
((カーソル位置に括弧存在しない場合、カーソルが属している範囲の先頭の括弧に移動します))


この機能は、Cやjava言語などのプログラミンで役に立ちます。
例として、図10のmain()の後の{にカーソルを移動し、%を入力するとファイルの終わりの}にカーソルが移動します。
更に、一つ上の}に移動して%を入力するとif文の最後の{にカーソルが移動します(図17-a, 17-b参照)。是非自分で試して見てください

図17(a, b)

&ref(Fig17-a.png); &ref(Fig17-b.png);

次の小技は、マーク機能です。前に編集していた場所に移動するには、''と'を続けて2回入力します。
g_var0のgの位置から文字検索機能(/})で画面下から2番目の}に移動した後に''を入力すると、元のg_var0のgの位置に
カーソルが戻ります。

'はマーク参照コマンドでマークコマンドmでマークされた場所にカーソルを移動するのに使います。
試しに3行目のint g_var0のiにカーソルを移動し、maと入力します。これでiの場所がaというマーク名で記憶されます。
((マーク名には、aからzのアルファベットを使用します))

一度記憶された場所は、どこからでも参照できます。Lで行の最後に移動して'aと入力してみてください。
ここで'aと入力すると、カーソルは3行目先頭のiの位置に移動します。
((マーク機能はexモードで、編集範囲を指定する場合にも利用できます))


*** カーソル移動コマンド一覧 [#a0fc6150]
カーソル移動コマンドを表2にまとめました。図9と一緒に見ながら、コマンドの使い方を確認してみてください。


| コマンドの機能 | 呼び出し形式 | 使用例 |h
| 左へ移動 | [n]h | h: 1文字左へ移動、3h: 3文字左へ移動 |
| 右へ移動 | [n]l | l: 1文字右へ移動、2l: 2文字右へ移動 |
| 上へ移動 | [n]k | k: 1行上へ移動、3l: 3行上へ移動 |
| 下へ移動 | [n]j | j: 1行下へ移動、2j: 2行下へ移動 |
| 次の小ワードへ移動 | [n]w | w: 次の小ワードへ移動、3w: 3つ次の小ワードへ移動 |
| 前の小ワードへ移動 | [n]b | b: 前の小ワードへ移動、2b: 2つ前の小ワードへ移動 |
| 次の大ワードへ移動 | [n]W | W: 次の大ワードへ移動、3W: 3つ次の大ワードへ移動 |
| 前の大ワードへ移動 | [n]B | B: 前の大ワードへ移動、2B: 2つ前の大ワードへ移動 |
| 小ワードの終わりへ移動 | [n]e | e: 小ワードの終わりへ移動、3e: 3つ目の小ワードの終わりへ移動 |
| 大ワードの終わりへ移動 | [n]E | E: 大ワードの終わりへ移動、2E: 2つ目の大ワードの終わりへ移動 |
| 順方向行内文字検索 | [n]fc | f=: 行内の次の=に移動、3f,: 行内の3つ目の,に移動 |
| 逆方向行内文字検索 | [n]Fc | Fg: 行内の前のgに移動、2F0: 行内の2つ前の0に移動 |
| 前の文字検索を繰り返す | ; | ;: 前回のfやFの行内文字検索を繰り返す |
| 前の文字検索と逆方向に行内検索 | , | ,: 前回のfやFとは逆の方向に行内文字検索をする |
| 行の非空白先頭へ移動 | ^ | ^: タブや空白以外の行の先頭へ移動 |
| 行の物理的先頭へ移動 | 0 | 0: 行の物理的な先頭へ移動 |
| 行の終わりへ移動 | $ | $: 行の終わりへ移動 |
| 画面の中央の行頭へ移動 | M | M: 画面の中央の行頭へ移動 |
| 画面上部行頭へ移動 | [n]H | H: 画面上部行頭へ移動、2H: 画面上から2行目行頭へ移動 |
| 画面下部行頭へ移動 | [n]L | L: 画面下部行頭へ移動、3L: 画面下部から上に3行目の行頭へ移動 |
| 対の括弧へ移動 | % | %: カレント位置にある括弧の対の括弧へ移動 |
| カレント位置マーク | mc | ma: カレント位置をマークaとして登録 |
| マーク位置へ移動 | 'c | 'a: マークaへ移動、'': 前のカーソル位置へ移動 |



** 編集者のコメント [#a503d979]
内容についての感想をお聞かせ下さい。

スパム防止に画像の文字列も入力してください。
#comment_kcaptcha

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc