Web Analytics
Privacy Policy Cookie Policy Terms and Conditions Vi - Wikipedia

Vi

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

この項目の本来の表記は「vi」です。MediaWikiの技術的制限から先頭の小文字が大文字になっています。
Disambiguationこの項目ではテキストエディタについて説明しています。VI, viの他の意味についてはVIをご覧ください。

vi(ヴィーアイ)は、Emacsと共にUNIX環境で人気があるテキストエディタビル・ジョイによって開発された。名の由来はVIsual editorの略。

目次

[編集] 創始

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

後にカリフォルニア大学バークレイ校にadm3a端末が導入されたのを機に、ビル・ジョイ自身により更なる改良を加えられたものが、現在の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のキーボードにカーソルキーがなかったためだと考えられる。

[編集] vi互換エディタ

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

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

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

[編集] 外部リンク

THIS WEB:

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - be - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - closed_zh_tw - co - cr - cs - csb - cu - cv - cy - da - de - diq - dv - dz - ee - el - eml - en - eo - es - et - eu - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gd - gl - glk - gn - got - gu - gv - ha - haw - he - hi - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mg - mh - mi - mk - ml - mn - mo - mr - ms - mt - mus - my - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - rm - rmy - rn - ro - roa_rup - roa_tara - ru - ru_sib - rw - sa - sc - scn - sco - sd - se - searchcom - sg - sh - si - simple - sk - sl - sm - sn - so - sq - sr - ss - st - su - sv - sw - ta - te - test - tet - tg - th - ti - tk - tl - tlh - tn - to - tokipona - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu

Static Wikipedia 2008 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2007:

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - be - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - closed_zh_tw - co - cr - cs - csb - cu - cv - cy - da - de - diq - dv - dz - ee - el - eml - en - eo - es - et - eu - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gd - gl - glk - gn - got - gu - gv - ha - haw - he - hi - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mg - mh - mi - mk - ml - mn - mo - mr - ms - mt - mus - my - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - rm - rmy - rn - ro - roa_rup - roa_tara - ru - ru_sib - rw - sa - sc - scn - sco - sd - se - searchcom - sg - sh - si - simple - sk - sl - sm - sn - so - sq - sr - ss - st - su - sv - sw - ta - te - test - tet - tg - th - ti - tk - tl - tlh - tn - to - tokipona - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu

Static Wikipedia 2006:

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - be - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - closed_zh_tw - co - cr - cs - csb - cu - cv - cy - da - de - diq - dv - dz - ee - el - eml - en - eo - es - et - eu - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gd - gl - glk - gn - got - gu - gv - ha - haw - he - hi - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mg - mh - mi - mk - ml - mn - mo - mr - ms - mt - mus - my - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - rm - rmy - rn - ro - roa_rup - roa_tara - ru - ru_sib - rw - sa - sc - scn - sco - sd - se - searchcom - sg - sh - si - simple - sk - sl - sm - sn - so - sq - sr - ss - st - su - sv - sw - ta - te - test - tet - tg - th - ti - tk - tl - tlh - tn - to - tokipona - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu