vi

出典: フリー百科事典『ウィキペディア(Wikipedia)』

vi
Vi-splash.png
viで空のファイルを編集中の画面。(チルド記号はファイル中に行がないことを示す。)
開発元 ビル・ジョイ
種別 テキストエディタ
  

vi(ヴィーアイ)は、Emacsと共にUNIX環境で人気があるテキストエディタビル・ジョイによって開発された。名の由来はVIsual editorないしVisual Interfaceとされる[1][2]。後発のUnix系OSに搭載されているviは、上位互換のVimnviであることが多い(viコマンドでvimやnviが起動する)。

目次

[編集] 創始

BSDの創始者であるビル・ジョイが、最初のBSDを公開するにあたり開発していたPascalコンパイラを快適に作成するために開発したのが始まりである。当初はそのPascalのソースコードに同封され、その奥底に埋もれていたため、単体のソフトウェアとしての提供は認知されていなかった。この段階ではexと呼ばれるラインエディタであり、まだ現在のようなスクリーンエディタではなかった。

後にカリフォルニア大学バークレイ校にadm3a端末が導入されたのを機に、ビル・ジョイ自身により更なる改良を加えられたものが、現在のviと呼ばれるエディタである。

[編集] 特徴

[編集] 他のテキストエディタと異なる点

  • マウスが使えない(viの開発当時、マウスは発明されていたが普及していなかった)
  • カーソルキーが使えない(開発端末であるLear Siegler ADM3A端末装置には、専用のカーソルキーが設けられていなかった[3]
  • 命令を覚える必要がある(画面上に命令表示領域が無い)

このような特徴は一見欠点にも見えるが、一度コマンドを覚えてしまえばGUIのエディタに比べ格段に速くカーソルの移動ができ、作業効率が上がる。 UNIXの真髄を知ろうというユーザーはviの基本的操作を習得しておいた方が良い。

[編集] 設計思想

viはラインエディタのexを祖先に持ち、多くの特徴を受け継いでいる。

ラインエディタでは、目的の行を抽出、編集、更新というサイクルで編集を行う。現在主流のスクリーンエディタと異なり、内容の閲覧/編集はそれぞれ独立した機能であり、インタラクト(対話的)に動作しない。しかしそれだけでは利用が困難なので、exでは「特定のパターンにマッチする行内で内容を置換」「外部コマンドによるフィルタ」などのプログラムインタプリタ的な支援機能が充実している(sedは同様の背景をルールマッチ型に解釈したフィルタ記述インタプリタである)。

viはexのスーパーセットであり、閲覧・抽出に相当する部分をフルスクリーン/インタラクトに拡張して独立の移動コマンド体系を与えたものである。従って分類上はスクリーンエディタに含まれるが、設計思想はビュワーを伴うラインエディタに近い。

そのような背景から、viには初めて触れるユーザーに戸惑いを与えるユニークさが多い。有名なのは、初期状態で、打鍵した文字がテキストとして入力されるのではなく、編集コマンドとして解釈される点である。この理由で「viはモードを持つエディタ」と呼ばれる場合が多い。

しかし上記の背景から言えば:

  1. テキストを編集するためにはその位置を指定しなければならず
  2. その後明示的に入力状態に入る

ほうが機能体系上自然である。ここで入力はパターン置換などと直交する、編集上の一形態と位置づけられる。(例えば他のエディタで置換を行う場合、ダイアログで対話的処理を行うなどの特殊モードを導入するケースがほとんどであろう。viでは後述のマクロの存在により両者が実質的に同等となる)

従って機能の意味論から言えば、

viにおけるテキスト入力とは
たまたま、ある編集コマンドがユーザーの入力を要求し、それを表面上インタラクトにキーボードから処理できるもの

という解釈が成り立ちうる。しかし現実的にはviの主要な操作は、入力と、移動+入力への移行とで事実上二分でき、それぞれインサートモード、コマンドモードと呼ばれている(マニュアルにもそう書かれている)。

では上記の解釈がviの実装をよく説明しているという理由はなにか。 それは次節のマクロ機能の存在である。

[編集] 入力とマクロ

まずここでviの入力について述べる。

上記の通りviの起動状態はコマンドモードであり、全てのキーはテキスト入力ではなくコマンドと解釈される。この内 i (insert)や a (append)などがインサートモードへの移行を表し、次にESCが入力されるまで、ユーザーの入力が(普通の意味での)入力と見なされる。例えばキー入力が

iTEXT[ESC]     ([ESC]はエスケープキー。以下同じ)

の時、

TEXT

という出力が得られる。

第一の問題は @ コマンドの存在である。これは指定したyankバッファ(いわゆるクリップボード)の内容を「ユーザーからの入力と解釈してコマンドモードで実行する」というものである。例えばバッファaの内容が上と同じ

iTEXT[ESC]

であったなら(このエスケープはエスケープシーケンスとして埋め込まれたもの)、コマンド

@a

からは

TEXT

がその場に挿入され(て、コマンドモードにもど)る。エスケープまでを含む全ての文字列をコマンド入力シーケンスと同一視できる以上、文字列をコマンドの一部と解釈した方が自然であろう。

さらにexコマンド(後述)のabbr機能がその逆を実現する。これは単語の略記形を登録しておくと、インサートモードでテキストを自動的に置き換えるというもので、例えばコマンドモードから

:abbr US United States

と入力しておくと、インサート中、単語としてUSが出現した瞬間にUnited Statesへと変換される。これは「入力されるテキストもまたコマンド処理過程を経ている」事を意味している。

以上二つの理由から、viの「モード」は便宜上のもので同一物の別側面であることが分かる。

(なおviではこれに加え「コマンドシーケンスを別のコマンドシーケンスにマップする」というコマンド map が存在する)

[編集] exコマンド

viはexのスーパーセットなので、exの編集機能はすべてviでも使用できる。これをexコマンドと呼び、コマンドモードで :に続いて入力されるものが当たる。

例えばファイルを保存する :wやエディタを終了する :q など、編集のメタレベルに関わるもの、特定の行番号や正規表現にマッチする行アドレスに対して編集を行うもの、上記のマクロ機能などが含まれる。

(厳密にはiやaなどのインサートモードへ移行するコマンドもexコマンドの略記と見なされる)

[編集] 設計思想の補足

以上のような解釈に基づけばvi はモードを持っていないことになるが、一般的にはviはモードを持つエディタと考えられている。

他のエディタでviのような明確なモード分けを持つケースは少ない(Emacsのように自由にモードを定義できるケースはあるが)。最初にviに触れるときに感じるであろう奇異さを考えれば、テキストエディタにとってモードが自然とは言えない事は明らかである。

ではわざわざモードを持つ事により得られる利点はなんだろうか。

最も大きな理由は入力コストである。修飾キーなしにコマンドを入力できるため、慣れると非常に素早く目的の動作を実現できる。特に、上下左右の移動にhjklの四つのホームポジションQWERTY配列)が対応する事はviの大きな特徴である。また、cw(単語を変更)や d} (段落の終わりまで削除)のような複雑な編集も簡単なキー操作でできるようになる。この利点はエディタが多機能になればなるほど強調される。

反面学習コストはやや高く、使用するまでに訓練を要する事も事実である。

[編集] その他の特徴

viはコンパクトで負荷が小さいため、作業中にテキストファイルの一部を書き換えたり、通信速度の遅いネットワークの先にあるマシンで編集したりといった作業に向いている。

viは熱狂的なファンを持つエディタである。その理由としては、機能体系の簡潔さや、俊敏な動作、コマンドを打つときの気持ちよさなどが考えられる。実際、コマンドをいくつか組み合わることにより2、3キータイプするだけで複雑な編集をなしとげたときなど、「脳内麻薬が出る」と表現される喜びを感じる人が多い。

つい最近まで、viはインサートモード中に方向キー(カーソルキー)を使って自由にカーソル位置を変える事はできなかった。そういう操作を望む一部のユーザーがキーマクロを使ってそれらしく実現していたのである。この理由としては、そもそもビル・ジョイがvi製作時に使っていたマシンADM3Aのキーボードに専用のカーソルキーがなかったためだと考えられる。実際、カーソル移動コマンドである、h、j、k、lのキーについて、ADM3Aのこれらのキーの上にはカーソルを示す刻印が設けられており[3]、Ctrl-h、Ctrl-j、Ctrl-k、Ctrl-lの操作でカーソル移動を行うことが可能であった。

[編集] vi互換エディタ

PC-UNIXに於いては現在はオリジナルのviが使われることはあまり一般的ではなく、模倣して作られたvi互換エディタ(クローン)の利用が一般的である。一般的なディストリビューションではviのシンボリックリンクがviの本来のパスに置かれ、互換エディタにリンクしている。また、MS-DOSWindows上で実行可能な互換エディタも存在する。

  • nvi: nex/nviは、4.4BSDにおいてex/viの代替としてカリフォルニア大学バークレー校がオリジナルに配布した。BSDライセンスで提供され本家viの動作とのバグも含めた互換度に定評がある。
  • Vim: 高度にさまざまな設定が可能な、viを改善したエディタ。完全なIDEとみなせ、しばしば「プログラマのエディタ」と呼ばれるが、テキスト編集全般を完璧にこなせる。
  • elvis: Steve Kirkendall により書かれた強力なex/viクローン。
  • ViVi: vi コマンドをサポートするWindows用エディタ

なお作者のビル・ジョイ自身はviについて「このように広く普及するのであれば、もっとちゃんとした設計を施すべきだった」という旨の内容を述べている。本来はウィンドウ分割やプログラマブルな機能を盛り込む考えだったが、開発中にディスクがクラッシュし、開発継続を断念したのだという。viは作者本人にとっても非常にhackな存在ということである。

[編集] 参考文献

[編集] 関連項目

[編集] 脚注

[ヘルプ]
  1. ^ 大木敦雄監修 小島範幸・北浦訓行著 『はじめてのvi&Vim』 技術評論社、2009年、23頁。「viの名前の由来は、VIsual Editorです。」
  2. ^ "Jargon file vi". 2009-11-27 閲覧。 - ジャーゴンファイルのviの項で [from ‘Visual Interface’] と明記されている。
  3. ^ a b "ADM3Aの全景". 2009-05-24 閲覧。"ADM3Aのキーボード部分". 2009-05-31 閲覧。 および キーボードレイアウト図 - ADM3Aのキーh、j、k、lの上に、カーソルを示す刻印が設けられている。

[編集] 外部リンク