Vi
viは空のファイルを編集中。チルド記号はファイル中に行がないことを示す。
開発元ビル・ジョイ
種別テキストエディタ
表・話・編・歴
vi(ヴィーアイ)は、Emacsと共にUNIX環境で人気があるテキストエディタ。ビル・ジョイによって開発された。名の由来はVIsual editorの略。Linuxなどに搭載されているのは上位互換のVimやnviであることが多い。(viコマンドでvimやnviが起動する。)
目次
1 創始
2 特徴
2.1 他のテキストエディタと異なる点
2.2 設計思想
2.3 入力とマクロ
2.4 exコマンド
2.5 設計思想の補足
2.6 その他の特徴
3 vi互換エディタ
4 参考文献
5 関連項目
6 外部リンク
//
BSDの創始者であるビル・ジョイが、最初のBSDを公開するにあたり開発していたPascalコンパイラを快適に作成するために開発されたのが始まりである。当初はそのPascalのソースコードに同封され、その奥底に埋もれていたため、単体のソフトウェアとしての提供は認知されていなかった。この段階ではexと呼ばれるラインエディタであり、まだ現在のようなヴィジュアルエディタではなかった。
後にカリフォルニア大学バークレイ校にadm3a端末が導入されたのを機に、ビル・ジョイ自身により更なる改良を加えられたものが、現在のviと呼ばれるエディタである。
他のテキストエディタと異なる点
マウスが使えない(viの開発当時、マウスは発明されていたが普及していなかった)
カーソルキーが使えない(Lear Siegler ADM3A端末装置にカーソルキーが無かったためと言われている)
命令を覚える必要がある(画面上に命令表示領域が無い)
このような特徴は一見欠点にも見えるが、一度コマンドを覚えてしまえばGUIのエディタに比べ格段に速くカーソルの移動ができ、作業効率が上がる。 UNIXの真髄を知ろうというユーザーはviの基本的操作を習得しておいた方が良い。 UNIXのパスワードファイル編集用テキストエディタとしてvipwが、またsudoの設定ファイル編集にもvisudoが用意されており、操作方法は一般に[1]viと同じ。^ visudoコマンドが、必ずしもviを起動するわけではないことに注意。Ubuntu 8.04等の一部のディストリビューションでは、viではなくnanoが起動するようになっており、しばしばユーザを困惑させる。
viはラインエディタのexを祖先に持ち、多くの特徴を受け継いでいる。
ラインエディタでは、目的の行を抽出、編集、更新というサイクルで編集を行う。現在主流のスクリーンエディタと異なり、内容の閲覧/編集はそれぞれ独立した機能であり、インタラクト(対話的)に動作しない。しかしそれだけでは利用が困難なので、exでは「特定のパターンにマッチする行内で内容を置換」「外部コマンドによるフィルタ」などのプログラムインタプリタ的な支援機能が充実している(sedは同様の背景をルールマッチ型に解釈したフィルタ記述インタプリタである)。
viはexのスーパーセットであり、閲覧・抽出に相当する部分をフルスクリーン/インタラクトに拡張して独立の移動コマンド体系を与えたものである。従って分類上はスクリーンエディタに含まれるが、設計思想はビュワーを伴うラインエディタに近い。
そのような背景から、viには初めて触れるユーザーに戸惑いを与えるユニークさが多い。有名なのは、初期状態で、打鍵した文字がテキストとして入力されるのではなく、編集コマンドとして解釈される点である。この理由で「viはモードを持つエディタ」と呼ばれる場合が多い。
しかし上記の背景から言えば:
テキストを編集するためにはその位置を指定しなければならず
その後明示的に入力状態に入る
ほうが機能体系上自然である。ここで入力はパターン置換などと直交する、編集上の一形態と位置づけられる。(例えば他のエディタで置換を行う場合、ダイアログで対話的処理を行うなどの特殊モードを導入するケースがほとんどであろう。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