ex コマンド w、q、wq、x。
これらのコマンドは、編集中のバッファの内容を書き出したり、vi 自体を終了したり、その 2 つのの動作をひとまとめに行ったりする。バッファの内容を書き出すことと vi を終了することには、本質的には強い関連性はないのだけど、実践的なコマンドの使用頻度を鑑みたのか、ex コマンドの体系では結び付けられている。
基本となるのは w(write) コマンドと q(quit) コマンド。
write
[addresses]w[rite][!][>>][file]
w コマンドはバッファの内容をファイルに書き出す。
通常、addresses を明示せずに ex コマンドを実行した場合、対象となる行は単にカレント行であるが、write コマンドは global や v コマンドとともに規定値がバッファ全行になっている。
ファイルへの書き込み
w コマンドのコマンド名に空白文字が後続していない、または file が文字 ! で始まっていない場合は、書き込みはファイルに対して行われる。
- 引数 >> が指定されており、かつ file がすでに存在している場合、バッファの内容はそのファイルの内容を置き換えるのではなく、追記される。>> が指定されているにもかかわらず file が存在していない場合、>> が指定されなかったものとして振る舞うか、書き込みが失敗するかは未定義である。
- readonly オプションがセットされている場合、書き込みは失敗する。
- file が指定されているが、それがバッファに結び付けられたファイル名ではなく、かつ file が存在する場合、書き込みは失敗する。
- file が指定されなければ、バッファに結び付けられたファイル名が用いられる。バッファにファイル名が結び付けられていなければ、コマンドは失敗する。
- バッファに結び付けられたファイル名が用いられ、かつそのファイル名は file または read コマンドによって変更されたものであり、かつそのファイルが存在する場合、書き込みは失敗する。一旦書き込みが成功した後は、後続する書き込みはこの理由で失敗してはならない(再びファイル名が変更されない限り)。
- バッファ全体を書き出せず、かつ書き込み先ファイルが存在する場合、書き込みは失敗したとみなす。
コマンド名に ! が続いている場合、ルール 1.、2.、3.、5. において書き込みは強制的に行われる。
writeany オプションがセットされている場合、ルール 2.、3.、5. において書き込みは強制的に行われる。
この他の実装依存の条件判定により書き込みが失敗することもある。
バッファが空である場合、空の内容で書き込みが行われる。
書き込まれた行数とバイト数の情報がメッセージとして表示される必要がある。
プログラムへの書き込み
コマンド名の後に 1 文字以上の空白が続き、かつ file の先頭が文字 ! である場合、文字 ! の後の残りの文字列は、文字 %、#、! について展開が行われる(展開の詳細は省略)。
ex/vi は shell オプションで指定されるプログラムを起動し、2 つの引数を渡す。1 つめは -c である。2 つめは write コマンドへの引数(展開済み)が単一の引数として渡される。バッファ内の指定された行は起動したプログラムの標準入力へ書き込まれる。プログラムからの標準エラーや標準出力があれば、print コマンドの出力のように表示される。出力の最後の文字が改行でなければ、改行が出力される。
write コマンドに続く文字 ! はバックスラッシュによって効果を打ち消すことができる。
で。
この仕様は、当然ながら、vi が伝統的なファイルシステムにアクセスできる前提のものなので、wasavi にはあまり当てはめられない。wasavi の場合、まず textarea なり input[type=text] があり、それにアタッチする形で起動するので、バッファとファイル名が割り当てられていない状態が存在しない。ファイル(というかアタッチ対象の要素)への追記というのは実装はできるが、それが役立つシーンが思い浮かばない。
ファイルではなくプログラムの標準入力への接続は……どうかな。プログラムというのを wasavi が管理するプラグインのような形態にして、たとえば
:w !twitter
みたいなことはありうるかもしれない。ないかもしれない。
とりあえず、いちおう仕様どおりの書式は受け付けるものの、単に w と入力した場合の動作のみ有効にしておこう。他は not implemented yet.