IT pass HikiWiki - [Exp2010]エディタ vi Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

((<"スケジュール表・各回資料 (05/07)"|[Exp2010]スケジュール表・各回資料#05-2F07>))

{{toc}}


= vi とは

vi (VIsual editor) は多くのUNIX系OSの標準エディタです. つまり大抵の UNIX マシンではじめから vi は用意されています. システムアカウントの変更を vi を元としたツール, vipw や vigr 等でおこなうのは, 確実に使えるエディタが vi であるためです. 「もしも」のトラブル時に利用できる可能性がもっとも高いエディタは vi であり, 特に管理者となる人は必ず習得すべきツールといえます.

一方で vi の操作体系は, 直感的ではありません. そのため UNIX でファイルを編集するためのツールが, 他に数多く用意されています. vi の独特な操作方法を嫌う初心者ユーザーも少なくありません.

vi の特長は次の通りです.

* "軽い" (動作が高速な) エディタである.
* 少ないキー操作で効率的にテキスト編集がおこなえる.
* UNIX のコマンドを自由に呼び出せ, テキストの作成のツールとして活用できる.
  vi を実行中にコンパイルやプログラムの実行も可能.

vi の根本思想は「ひたすら速く」です. vi には親切なメニュー画面はありません. しかし, それは vi がユーザーインターフェイスを軽視しているという意味ではありません. 実際, vi ほどインターフェイスに神経を使っているエディターは他にないでしょう. 最少の労力で最大の成果をもたらすよう計算し尽くされています. そのことは vi を使い込むほど実感できるはずです.

ここでは, そんな vi の使用法を学習していきましょう.

= ◎ ファイルオープン/クローズ

vi はどんなテキストファイルを編集したいときにも使えます. 他のエディタ同様, 編集するファイルをバッファ(メモリ内の一時的な領域) にコピーし, そのバッファの内容を編集することになります. ファイルに変更を反映させるにはバッファの編集内容をファイルにセーブしなくてはなりません.
※以下, 本ドキュメントでは特別な場合を除きこのバッファへの編集作業を"ファイルの編集"と記述しています.

== ファイルオープン

vi を使うには, 次のように入力します.

$ vi [ファイル名]

引数のファイル名は既に存在するファイル名, あるいはこれから作りたい新規のファイル名を入力します. ファイル名を省略した場合, バッファのみが準備され, 保存時にそのファイル名を決定することになります.

== ファイルクローズ

ファイルの編集内容を保存し作業を終了するには, コマンドモード
(詳しくは((<vi の基礎 - 状態遷移|URL:#◎ vi の基礎 - 状態遷移>))
を参照) であることを確認し
(ESC キーを押せばよい), 以下の文字を入力します.

   
  :wq

ファイルの編集作業を保存したり, 終了してコマンドプロンプトに戻るには幾つかの方法があります.

  # RT
  :q, vi を終了する
  :q!, バッファでの編集内容を破棄し vi を強制的に終了する
  :w, バッファの内容をファイルに保存
  :w ファイル名, バッファの内容を指定したファイル名で保存
  :w!, バッファの内容を強制的にファイルに保存
  :wq, バッファの内容をファイルに保存し vi を終了する.
  ZZ, バッファの内容をファイルに保存し vi を終了する.

※ q:quit, w:write, !:強制的 という意味の組合せになっている

= ◎ vi の基礎 - 状態遷移

vi の起動, 終了を覚えたので, 最低限のファイル編集の方法を見ていくことにします.

vi では, キーボードのキーは2つの役割をはたします. 例えば「a」というキーは, 「a」という文字をテキスト画面に表示するために押されますが, 別の場合には, もっと違った意味を持つ命令 (コマンド) と解釈されます.

キーがどちらの働きをするかは, vi の「モード」(状態)が決定します. これらの vi の「モード」は, 「挿入モード」と「コマンドモード」と呼ばれます. vi を使う時に最も大切なことは, この2つのモードをきちんと区別することです.

* コマンドモード:
  各キーはテキストを操作する命令と解釈される.
* 挿入モード:
  押されたキーの文字は, そのまま入力される.

vi を起動させた直後は「コマンドモード」になっています. 「コマンドモード」では vi の終了, 編集中のファイルの更新, 文字の削除, 検索と置換, 行番号の表示設定や, 他のプログラムの実行などを行うことができます.

文字を入力する場合は「挿入モード」へ切り替えなければなりません. 「挿入モード」へ切り替えるには, a, A, i, I, o, O のいずれかを押します(それぞれ切り替わった後の動作が異なります). 「挿入モード」では, 純粋に文字を入力します. それ以外の動作を行うためには ESC キー(エスケープ・キー)を押して, 「コマンドモード」へ切り替えなければなりません.
(※1.2 で覚えたviの終了やファイルの保存は「コマンドモード」での操作でしたね.)

vi で初心者ユーザーが陥る混乱の原因は, この状態遷移を把握しきれてないことが殆どです. 「わけわかんなくなったら ESC キー!」 と覚えておきましょう. vi の状態が「コマンドモード」であることが保証されます.

((*vi の状態遷移図*))

((<URL:http://epa.scitec.kobe-u.ac.jp/~itpass/exp/fy2008/080509/practice/hiki-images/vi-mode.png>))

http://www.ep.sci.hokudai.ac.jp/~inex/y2007/1026/jitsugi/images/vi-mode.gif
より引用


= ◎ 実践!訓練

それでは実際に vi を使ってみましょう. 以下の
((<URL:#[練習1]>)), ((<URL:#[練習2]>)) をやってみてください.
ここで必要となるコマンドモード,
挿入モードのコマンドは次節からの
((<URL:#vi の基礎 - コマンドモード>)),
((<URL:#vi の基礎 - 挿入モード>)) を参照してください.

== [練習1]

適当な文章を書き込んだファイルを vi をつかって実際に作り, rensyu.txt というファイル名で保存してみましょう.

* With a screen editor you can scroll the page,
  move the cursor, delete lines,
  and more, while seeing the result of your edits as make them.

$ vi rensyu.txt    <-- rensyu.txt という名前の新規ファイルを viで開く
i                  <-- 挿入モードへ移る(現在いるカーソルの左側に挿入)
     ...            <-- 編集
     ...


以下のコマンドで書き込んだ内容が表示されましたか? 表示されれば OK です.

$ cat rensyu.txt

== [練習2]

先ほど編集したファイルを vi で開いて, 文字の削除, 行の挿入・削除などを行い, 別名(rensyu2.txt)で保存してみましょう. 一文字削除や一行削除はコマンドモードからできます。(以下はその例)

* We will modify this file ! と1行目の上の行に挿入.
* you を削除し we に変える.
* 2行目を削除.
* etc...

$ vi rensyu.txt     <-- [練習1] で作成した rensyu.txt を viで開く
     ...             <-- 適宜, 操作・編集してみましょう
     ...

以下のコマンドで変更した内容が表示されましたか? 表示されれば OK です.

$ cat rensyu2.txt

どうですか? うまく作成できましたか?

初歩的な vi の使い方はなんとなく理解できたでしょうか?
実際にはもっといろいろな使い方があるのですが 一度に覚える必要はありません.
実際にファイルの編集をしながら, "かゆい"ところがあったらその都度新しい命令,
機能を調べてゆけば良いです. 最低限, ファイルのオープンクローズ,
挿入モードとコマンドモード間の移り方 ("a,i,o"コマンドと ESC キー),
1文字削除 ("x"), コマンドモードでのカーソルの動かし方がわかっていれば,
なんとかなります.
もう少し高度な使い方をしたい人は ((<URL:#付録 [vi の応用]>))
を参照してみてください.
では, 次は >>((<シェルスクリプト|[Exp2008]シェルスクリプト>))
を vi を使って作成してみましょう.


= vi の基礎 - コマンドモード

「コマンドモード」で実行する基本的なコマンドは次の通りです.

== エディタの終了/ファイルの書き出し(1.2.2 参照)



== カーソルの移動

  # RT
  h, 1文字左にカーソル移動(十字キーの「←」でも良い)
  j, 1文字下にカーソル移動(十字キーの「↓」でも良い)
  k, 1文字上にカーソル移動(十字キーの「↑」でも良い)
  l, 1文字右にカーソル移動(十字キーの「→」でも良い)

※ "hjkl" は右手のマウントポジション(ブラインドタッチでの静位置)にあります.

== 文字入力(挿入モードへの移行)

  # RT
  a, 現在いるカーソルの右側に挿入(追加:append)
  A, 現在いるカーソルの行末に挿入
  i, 現在いるカーソルの左側に挿入(挿入:insert)
  I, 現在いるカーソルの行頭に挿入
  o, 現在いるカーソルの下の行に挿入 (行を開ける:open)
  O, 現在いるカーソルの上の行に挿入

== 文字削除

  # RT
  x, カーソル位置の文字を1文字削除
  dd, カーソルのある行を1行削除

== アンドゥ(取り消し)

  # RT
  u, 直前の変更を取り消す

== 検索

   # RT
   delimiter = %

   /文字% 指定された文字を, 次の行より下へ検索.
   ?文字% 指定された文字を, 前の行より上へ検索.
   n% 検索コマンドで指定された文字を, 順方向へ検索 ("/"では下へ, "?"では上へ)
   N% 検索コマンドで指定された文字を, 逆方向へ検索 ("/"では上へ, "?"では下へ)

== 別ファイルの読込

  # RT
  :r ファイル名, カーソル行の下にファイルを読み込んで挿入

= vi の基礎 - 挿入モード

「挿入モード」で実行する基本的なコマンドは次の通りです.

  # RT
  ESC キー, コマンドモードへ移行
  DEL キー, 左1文字削除(「コマンドモード」では利用できません)

= 付録 [vi の応用]

上で紹介したのは, vi を使用する上での基本的な事項だけです. 以下の内容は授業では説明しませんが, より便利に vi を使う参考として時間と興味のある方は御一読を.

※以下は断りのない限り「コマンドモード」で使用するコマンドです.

== コマンドラインにおける vi

※いきなりですが, これは「コマンドモード」とは関係ありません.

  # RT
  delimiter = %

  $ vi +18 [ファイル名]% ファイルをオープンし, 行18に位置づける
  $ vi +/"mustard greens" [ファイル名]% ファイルをオープンし, 最初の"mustard greens"にカーソルを移動
  $ vi -r [ファイル名]% クラッシュしたファイルを回復し読み込む
  $ view [ファイル名]%読むだけのためにファイルを読み込む

== カーソルの移動

  # RT
  w, 右へ1単語分移動
  W, 右へ1単語分移動(区切り文字を越える)
  b, 左へ1単語分移動
  B, 左へ1単語分移動(区切り文字を越える)
  Enter キー, 下の行へ移動
  Backspace キー, 左へ 1 文字分移動
  スペース キー, 右へ 1 文字分移動
  H, 画面上端へ移動
  M, 画面中段へ移動
  L, 画面下端へ移動
  Ctrl-F, 1 画面前へスクロール
  Ctrl-D, 半画面前へスクロール
  Ctrl-B, 1 画面後ろへスクロール
  Ctrl-U, 半画面後ろへスクロール
  G, ファイルの最終行へ移動
  21G, 行21へ移動

== 文字削除

  # RT
  delimiter = %

  D% 行のカーソルから右の部分の削除
  :5, 10 d% 5 行から 10 行までを削除

== テキストの複写と移動

  # RT
  delimiter = %

  yy% 行の取り込みまたはコピー
  Y% 行の取り込みまたはコピー
  dd% 行の削除
  P% 取り込みまたは削除された行を現在行の上に挿入
  p% 取り込みまたは削除された行を現在行の下に挿入
  :1,2 co 3% 行1から行2までを行3の下へコピー
  :4,5 m 6% 行4から行5までを行6の下へ移動

== 情報の表示

  # RT
  delimiter = %

  :set nu% 行番号の表示
  :set nonu% 行番号の非表示
  :set ruler% ルーラーの表示
  :set noruler% ルーラーの非表示
  :set showmode% 入力モードの表示
  :set noshowmode% 入力モードの非表示
  Ctrl-G% ファイル名, 行数, 位置の表示

== 画面の更新

  # RT
  Ctrl-L, 画面の再描画


= 参考資料

このページは
((<"北海道大学 理学院 情報実験 (INEX)"|URL:http://www.ep.sci.hokudai.ac.jp/~inex>))

((<"最低限 UNIX / Linux [III] 最低限 vi (2007 年度資料)"|URL:http://www.ep.sci.hokudai.ac.jp/~inex/y2007/1026/jitsugi/vi.html>))
を基に作成しました.

((<"スケジュール表・各回資料 (05/07)"|[Exp2010]スケジュール表・各回資料#05-2F07>))