WINDOW(1)

名称
window - ウィンドウ環境を実現します

書式
window [-t] [-f] [-d] [-e escape-char] [-c command]

解説
window ユーティリティは、 ASCII 端末上でのウィンドウ環境を実装したものです。

ウィンドウとは物理的な端末スクリーンの中の部分的な長方形部分を指し、 ここをプロセスの集合が利用します。 その大きさと位置はユーザがいつでも 変更できます。プロセスは通常に端末と通信するのと同じ方法、つまり 標準入力、標準出力、標準エラー出力を通して、 そのウィンドウと通信します。 ウィンドウプログラムはそのウィンドウに対する入力と出力のリダイレクトに関する 細かい処理を行います。 どんな時でも、 一つのウィンドウだけがキーボードからの 入力を受けることが出来ますが、全てのウィンドウが同時にディスプレイへの出力を 送ることが可能です。

window が立ち上がった時、ユーザのホームディレクトリにある .windowrc 内のコマンドが実行されます (以下のロングコマンドを参照)。 もしこのファイルが存在しない時は、 デフォルトとして同じ大きさのウィンドウが二つ作成されます。

コマンドラインオプションには以下のものがあります。

-t  terse モードをオンにします (以下の terse コマンドを参照)。

-f  高速モードです。スタートアップ動作は何もしません。

-d  .windowrc を無視する代わりに二つのデフォルトウィンドウを作成します。

-e escape-char
    エスケープ文字を escape-char にします。 escape-char は文字一つか、もしくは ^X (control-X ) のような形式です (X はどんな文字でも構いません)。

-c command
    command をロングコマンド (以下参照) として最初に実行します。

ウィンドウはオーバラップ可能で、枠が必要です。 各ウィンドウには、``1'' から ``9'' の数字のうちの一つの名前が 付いています。 この一文字の識別子は、ユーザが定義できるラベル文字と 同じように、ウィンドウのフレームの上の辺に表示されます。 ウィンドウは フォアグラウンド にあるように設計されています。フォアグラウンドウィンドウは、 普通の他のフォアグラウンドではないウィンドウよりもつねに上にあります。 このウィンドウより上になるのは、他のフォアグラウンドウィンドウだけです。 ウィンドウは、端末画面の辺内に完全に入っている必要はありません。 したがって、(画面よりも大きくても良い) 大きいウィンドウは、その全画面の 一部分だけが表示されるでしょう。

各ウィンドウは、カーソルと制御機能を持っています。 インテリジェント端末の大抵の動作、 すなわち行や文字の消去や挿入が提供されています。 下線を引いたり反転表示等の ディスプレイモードは、端末によって提供されている場合には、利用可能です。 更に、複数ページ分のメモリがある端末と同じように、各ウィンドウは ウィンドウ画面に表示されるよりも多くの行を保持できるテキストバッファを 持っています。

  プロセス環境
新しく作成されたウィンドウでは、 呼び出されたウィンドウからプロセス環境を引き継いで、 シェルプログラムが実行されます。 標準入力・出力・エラー出力は、仮想端末 ((pty) 4 参照) または、 UNIX ドメインのソケット ((socketpair) 2 参照)と結びつけられます。 仮想端末が使われている場合、特別な文字やモード ((stty) 1 参照) は、物理端末から複製されます。 このウィンドウに対する termcap(5) のエントリが作成されて、環境として ((environ) 7 参照) 変数 TERMCAP に渡されます。 termcap エントリには、下線・反転表示・その他の表示モード・ 可能であれば端末のファンクションキーによって生み出されるコード等の 物理端末からの情報と同じように、ウィンドウの大きさや特徴が含まれています。 更に、仮想端末のウィンドウサイズ属性は、ウィンドウの大きさを反映するように 設定され、その大きさが変更された場合はその情報が更新されます。 特に、エディタ vi(1) は、この情報を画面を再表示するために利用します。

  操作
普通の実行中には、 window は、二つの状態の内の一つの状態にあります。 この二つの状態は、会話モードとコマンドモードです。 会話モードでは、端末の実際のカーソルは、特定のウィンドウのカーソル位置 に位置します。 この特定のウィンドウはカレントウィンドウと呼ばれます。 そして、キーボードからの入力は、そのウィンドウにあるプロセスに 送られます。 カレントウィンドウは、他のウィンドウがフォアグラウンドに ある時を除いて、いつも他のウィンドウよりも上にあります。 更に、その識別子とラベルは反転表示で強調されています。

window のエスケープ文字 (通常は、 ^P です) を入力することで、会話モードからコマンドモードへ移行します。 コマンドモードでは、端末画面の一番上の行は コマンドプロンプトウィンドウに変わり、 window はキーボードからの入力をウィンドウを操作するコマンドであると解釈します。

二つの種類のコマンドがあります。ショートコマンドは普通一文字ないし二文字 から構成されます。ロングコマンドはコマンドウィンドウ (以下の “”: コマンドを参照) で入力される文字列もしくは、ファイル (以下の source 参照) から読み込まれます。

  ショートコマンド
以下では、 # は、ウィンドウ 1 から 9 に結びつけられた、 数字の ``1'' から ``9'' の一つを表現します。 ^X は、 control-X を意味します。 ここで、 X は任意の文字です。 特に、 ^^ は、 control-^ です。 escape はエスケープキーもしくは、 ^[ です。

#   ウィンドウ # をカレントウィンドウとして選択し、会話モードに戻ります。

%#  ウィンドウ # を選択しますが、コマンドモードのままです。

^^  一つ前のウィンドウを選択し、会話モードに戻ります。 これは、二つのウィンドウの間を交互に移動する時に便利です。

escape
    会話モードに戻ります。

^P  会話モードに戻り、現在のウィンドウに ^P を書き込みます。 したがって、会話モード中で二つの ^P を入力することで、一つを現在のウィンドウに送ることができます。 window のエスケープを別の文字に変更している場合には、その文字がここでいう ^P と同じ動作をします。

?   コマンドの短いまとめを表示します。

^L  画面を再描画します。

q   window を終了します。 確認が行われます。

^Z  window を中断します。

w   新しいウィンドウを作成します。 ユーザはウィンドウの左上の場所と 右下の場所を指定します。 カーソルが画面上に表示され、 ``h'', ``j'', ``k'', ``l'' キーでカーソルをそれぞれ左、下、上、右 に移動します。 ``H'', ``J'', ``K'', ``L'' キーでは、カーソルはそれぞれの方向の 画面の限界まで移動します。 移動キーの前に数字を入力することで、 移動を数字の回数だけ繰り返します。 リターンでカーソル位置をウィンドウの 左上の位置として入力します。 右下の角も同じような方法で入力します。 この手続き中には、新しいウィンドウの位置は画面に表示される長方形の 箱として示されます。 この枠が、新しいウィンドウが表示される枠です。 エスケープキーを入力することで、どの時点でも、このコマンドを キャンセルします。

    このウィンドウはカレントウィンドウになります。 そして、最初に利用可能な ID が与えられます。 また、デフォルトのバッファサイズが使われます (以下の default_nline コマンドを参照)。

    完全に見ることのできるウィンドウだけがこの方法で作成できます。

c#  ウィンドウ # を閉じます。 ウィンドウ中のプロセスには、ハングアップシグナル ( kill(1) 参照) が送られます。 csh(1) は、このシグナルを正しく扱うべきで、そうであれば問題は起こりません。

m#  ウィンドウ # を別の位置に移動します。 ウィンドウの形をした箱が新しい位置を示すために画面に表示され、 w コマンドで使われたのと同じようなキーで箱の位置を指定できます。 ウィンドウは一部が画面の外にでても構いません。

M#  ウィンドウ # を以前の位置に動かします。

s#  ウィンドウ # の大きさを変更します。 ウィンドウの新しい右下の角を指定する必要があります。 新しいウィンドウの大きさを示すために、箱が書かれます。 w や m コマンドで使われたのと同じキーが位置を入力するために使われます。

S#  ウィンドウ # を以前の大きさに変更します。

^Y  カレントウィンドウを一行上にスクロールします。

^E  カレントウィンドウを一行下にスクロールします。

^U  カレントウィンドウを画面の半分上にスクロールします。

^D  カレントウィンドウを画面の半分下にスクロールします。

^B  カレントウィンドウを一画面分、上にスクロールします。

^F  カレントウィンドウを一画面分、下にスクロールします。

h   カレントウィンドウのカーソルを一カラム左に動かします。

j   カレントウィンドウのカーソルを一行下に動かします。

k   カレントウィンドウのカーソルを一行上に動かします。

l   カレントウィンドウのカーソルを一カラム右に動かします。

y   ヤンクします。ユーザはカレントウィンドウの二点を指定します。 この二点で示される内容がヤンクバッファに保存されます。

p   プットです。 ヤンクバッファの内容を、現在のウィンドウに入力として 書き込みます。

^S  カレントウィンドウの出力を停止します。

^Q  カレントウィンドウの出力を開始します。

:   ロングコマンドとして実行する行を入力します。 通常の行編集文字 (エスケープ文字、単語の消去、行の消去) が提供されます。

  ロングコマンド
ロングコマンドはプログラム言語の様に解釈される文の列です。 この文法は C 言語に似ています。数字や文字列の表現や変数が、 条件分岐と同じように提供されています。

二つのデータ型があります。文字列と数字です。 文字列は、レターで始まる、レターや数字の列です。 ``_'' と ``.'' はレターと みなします。別の方法として、アルファベットや数字に含まれない文字を ``"''で括るか、``\''でエスケープすることで、文字列に含めることもできます。 更に、 C言語で提供されている ``\'' シーケンスがクォートの内外で 利用可能です (例えば、 ``\n'' は改行を、``\r'' はキャリッジリターンを表現します)。 以下の例は規則にあった文字列です。 abcde01234, "&#$^*&#", ab"$#"cd, ab\$\#cd, "/usr/ucb/window"

数字は、以下の三つの形式のうちの一つの整数値です。 10 進数・``0'' に続いて表現される 8 進数・``0x'' もしくは ``0X'' に続いて 表現される 16 進数です。機械にとって自然な整数サイズが使われます (つまり、 Cコンパイラの符号付き整数型です)。 C 言語と同じように、 非 0 の表現が論理的な真をあらわします。

文字 ``#'' は、行末までのコメントの始まりを表現します。

文は条件式もしくは式です。式文は改行 もしくは ``;'' で終りになります。式を次の行に継続するためには、 最初の行を ``\'' で終らせます。

  条件文
window ユーティリティは、単一の制御構造を持ちます: それは完全にまとめられた if 文で、以下の形式です

    if <expr> then
    	<statement>
    	...
    elsif <expr> then
    	<statement>
    	...
    else
    	<statement>
    	...
    endif

else や elsif 部分はオプションです。 elsif は、必要なだけ繰り返して利用することができます。 <expr> は数値である必要が有ります。

  式
window における式は、C 言語中のものと似ており、ほとんどの C の演算子が 数値オペランドとして提供されています。 更に、いくつかの演算子は、 文字列を操作するために拡張されています。

ある式が文として使われている時、その値は評価の後で 捨てられます。したがって、(代入や関数呼び出しの様な) 副作用を持った式のみが文として有用です。

(配列でない) 一つの値の変数が、数値と文字列に対して提供されています。 いくつかの変数は、あらかじめ定義されています。 これらは後に示してあります。

優先順序が増加していくように、演算子を以下に示します。

    <expr1> = <expr2> 代入です。 名前が <expr1> で文字列を値として持つ変数に、 <expr2> の結果が代入されます。 <expr2> の値を返します。

    <expr1>? <expr2>: <expr3> <expr1> の評価値が真 (非 0 数値) である時、 <expr2> の値を返します。そうでない場合は、 <expr3> の値を返します。 <expr2> と <expr3> のどちらか一方だけが、評価されます。 <expr1> は数値表現でなくてはなりません。

    <expr1> || <expr2> 論理的和 (or) です。 数値だけが使えます。 短絡評価が提供されています (つまり、 <expr1> が評価されて真である場合は、 <expr2> は評価されません)。

    <expr1> && <expr2> 短絡評価付きの論理的積 (and) です。 数値だけが使えます。

    <expr1> | <expr2> ビット毎の論理和 (or) です。 数値だけが使えます。

    <expr1> ^ <expr2> ビット毎の排他的論理和 (xor) です。 数値だけが使えます。

    <expr1> & <expr2> ビット毎の論理積 (and) です。 数値だけが使えます。

    <expr1> == <expr2>, <expr1>!= <expr2> (それぞれ、等価と非等価の) 比較です。 ブール値の結果 (1 か 0 のどちらか) が比較の結果として返されます。 オペランドは、数値もしくは文字列です。 片一方が文字列の場合、 他のオペランドも必要であれば変換されます。

    <expr1> < <expr2>, <expr1> > <expr2>, <expr1> <= <expr2>, <expr1> >= <expr2> それぞれ、より小さい・より大きい・以下・以上をあらわします。 数値と文字列の両方が利用可能です。 上で述べたように、自動的な変換が行われます。

    <expr1> << <expr2>, <expr1> >> <expr2> 両方のオペランドが数値である場合、 <expr1> は、左 (もしくは、右) に <expr2> ビットシフトされます。 <expr1> が文字列で、最初 (もしくは、最後) の <expr2> 文字が返されます ( <expr2> も文字列の場合、その長さがその値として利用されます)。

    <expr1> + <expr2>, <expr1> - <expr2> 数値においては、加算と減算です。 ``+'' に対して、片方が文字列の場合、他方は文字列に変換され、 結果は二つの文字列の結合となります。

    <expr1> * <expr2>, <expr1> / <expr2>, <expr1> % <expr2> かけ算・割算・モジュロ演算 (余りの計算) です。 数字だけが利用可能です。

    -<expr>, ~<expr>, !<expr>, $<expr>, $?<expr> 最初の 三つは、単項演算子のマイナス・ビット毎の補をとる (ビットの反転) ・論理的な否定であり、数値だけを取ります。 演算子 ``$'' は <expr> を取り、その名前の変数の値を返します。 <expr> が値 n を持った数値で、それが (後述の) 別名マクロ中に現れた場合、 別名呼び出しの n 番目の引数を参照します。 ``$?'' は変数 <expr> の存在を調べ、存在する場合は 1 を、それ以外では 0 を返します。

    <expr>(<arglist>) 関数呼び出しです。 <expr> は文字列でなくてはならず、 window の組み込み関数名の区別できる範囲でのプレフィックスであるか、 ユーザ定義の別名マクロの完全な名前でなくてはなりません。 組み込み関数の場合、 <arglist> は以下の 二つの形式のどちらか一方です。

        <expr1>, <expr2>, ...
        argname1 = <expr1>, argname2 = <expr2>, ...

    実際、両方の形式はお互い混ぜて使うことができますが、その結果は 予想できません。 ほとんどの引数は省略可能です。 デフォルトの値が それらに対しては適用されます。 argnames は、引数名を区別できる範囲でのプレフィックスとすることができます。 引数を分離するコンマは、曖昧さを避けるためだけに用いられ、 通常は省略できます。

    最初の引数の形式は、ユーザ定義別名のために有効です。 別名は、 alias 組み込み関数を使うことで定義されます(以下参照)。 引数は、変数機能の変種を使ってアクセスされます (前述の ``$'' 演算子を参照)。

    ほとんどの関数は値を返しますが、いくつかは副作用のためだけに 使われるため文として使われなければなりません。 関数や別名が文として使われた時、引数リストを囲むカッコは 省略可能です。 別名は値を返しません。

  組み込み関数
引数は自然な順番で名前で並べられます。 オプション引数は、四角カッコ ‘[]’ で囲みます。名前の無い引数は、山カッコ ‘<>’ 内に書きます。 ブール値のフラグを意味する引数 (しばしば flag という名前を付けられます) は、意味が明らかである on, off, yes, no, true, false, の内の一つの値をもつか、数値表現においては非 0 の値が真となります。

alias(
    [<string>], [<string-list>]) 引数が与えられない場合は、全ての現在定義されている別名マクロが 表示されます。そうでない場合、 <string> が表現 <string-list> の別名として定義されます。 もし存在すれば、以前の <string> の定義が返されます。デフォルトでは、 <string-list> は変更されません。

close(<window-list>)
    <window-list> で指定されたウィンドウを閉じます。 <window-list> が単語 all の場合、全てのウィンドウが閉じられます。 値は返しません。

cursormodes([modes])
    ウィンドウカーソルを modes に設定します。 modes は、変数 m_ul (下線)、 m_rev (反転表示)、 m_blk (点滅)、 m_grp (グラフィック、端末依存です) で示される モードビットのビット毎の論理和です。 以前のモードの値が返されます。 引数に何も指定しないと変更を行いません。 例えば、 cursor($m_rev$m_blk) は、ウィンドウカーソルを点滅する反転表示に設定します。

default_nline([nline])
    デフォルトバッファサイズを nline に設定します。 初期設定では、48 行になっています。 古いデフォルトバッファサイズが 返されます。引数に何も指定しないと変更は行いません。 とても大きなバッファを 使うと、プログラムの速度が低下します。

default_shell([<string-list>])
    デフォルトのウィンドウシェルプログラムを <string-list> に設定します。 最初の文字列として古いシェル設定が返されます。 引数に何も指定しないと変更を行いません。 初期設定では、デフォルトシェルは環境変数 SHELL から取られます。

default_smooth([flag])
    コマンド window (以下参照) への smooth 引数のデフォルトの値を設定します。 引数はブール値フラグ (上記の on, off, yes, no, true, false または数字のうちの一つ) です。引数に何も指定しないと変更を行いません。 古い値が (数字として) 返されます。 初期値は 1 (true) です。

    echo([window], [<string-list>]) 文字列のリスト <string-list> を、空白で分割し最後に改行を付けて window へ書き出します。 文字列はウィンドウにだけ表示され、ウィンドウ中のプロセスには 影響を与えません (以下の write を参照)。 値は返されません。デフォルトはカレントウィンドウです。

escape([escapec])
    エスケープ文字を escape-char に設定します。 古いエスケープ文字を一文字の文字列として返します。 引数に何も指定しないと変更を行いません。 escapec は、一文字の文字列か、 control-X を意味する -^X という形式です。

    foreground([window], [flag]) window をフォアグラウンドに動かしたり、フォアグラウンドから外したりします。 flag はブール値です。 古いフォアグラウンドフラグが返されます。 window に対するデフォルトはカレントウィンドウで、 flag に対するデフォルトは無変更です。

    label([window], [label]) window のラベルを label に設定します。 古いラベル文字列が返されます。 window に対するデフォルトはカレントウィンドウで、 label に対するデフォルトは無変更です。 ラベルを無くすためには、 空文字列 ("") を設定します。

list()
    引数はありません。 全てのウィンドウの ID と ラベルが表示されます。 値は返されません。

select([window])
    window をカレントウィンドウとします。 以前のカレントウィンドウが返されます。 引数を指定しないと変更を行いません。

source(filename)
    filename 内のロングコマンドを読み込み、実行します。 ファイルが読み込めない場合には -1 を返し、それ以外では 0 を返します。

terse([flag])
    簡素 (terse) モードを flag に設定します。 簡素モードでは、コマンドウィンドウはコマンドモード中 でさえ隠されたままで、エラーは端末のベルをならすことで報告されます。 flag は、上記の foreground 中の値と同じです。 古い簡素フラグが返されます。 引数を指定しないと変更は行いません。

unalias(alias)
    別名定義 alias を消去します。 別名がない場合には -1 を返します。 それ以外の場合は 0 を返します。

unset(variable)
    variable 変数の定義を消去します。 variable が存在しない場合には -1 を返します。 それ以外の場合は 0 を返します。

variables()
    引数はありません。 全ての変数を表示します。値は返されません。

    window([row], [column], [nrow], [ncol], [nline], [label], [pty], [frame], [mapnl], [keepopen], [smooth], [shell]). 左上の角が row, column で、大きさが nrow, ncol のウィンドウを開きます。 nline が指定された場合、テキストバッファにその行数が割り当てられます。 そうでない場合は、デフォルトのバッファサイズが使われます。 row, column, nrow, ncol に対するデフォルトの値は、それぞれ画面の一番上、一番左、一番下、一番右 になります。 label は、ウィンドウのラベル文字列です。 frame, pty, mapnl は、(上記の) foreground への引数と同じ方法で解釈されるフラグの値です。 これはそれぞれ、このウィンドウの周りに枠を付けるか (デフォルトでは真)、 ウィンドウのためにソケットペアではなく仮想端末を割り当てるか (デフォルトでは真)、改行文字をこのウィンドウでは 復帰と行送りに マップするか (デフォルトではソケットペアの場合は真、それ以外は偽) です。 一般に、ウィンドウは、プロセスが終了した時に、自動的に閉じられます。 keepopen を真に設定する (デフォルトでは偽) ことでこの動作は妨げられます。 smooth が真である時、より端末らしい振舞いを実現するために、 画面は (このウィンドウに対して) より頻繁に更新されます。 smooth のデフォルトの値は、(上記) default_smooth コマンドで設定します。 shell は、このウィンドウ内でシェルプログラムとして使われる文字列のリストです (デフォルトは、上記 default_shell で指定されたプログラムです)。 作成されたウィンドウの ID が数字で 返されます。

    write([window], [<string-list>]) window に空白で分割されているが最後に改行の無い文字列リスト <string-list> を送ります。 文字列は、実際にウィンドウの入力として使われます。 値は返しません。 デフォルトはカレントウィンドウです。

  定義済み変数
これらの変数は、情報のためだけにあります。 これらを再定義しても、 window の内部操作には影響ありません。

baud
    50 から 38400の間のボーレートです。

modes
    物理端末で提供されている (反転表示・下線・点滅・グラフィック等の) 表示モードです。 modes の値は、1 ビット値 m_blk, m_grp, m_rev, m_ul (以下参照) のビット毎の論理和になっています。 これらの値は、ウィンドウのカーソルモードを設定する時に便利です (上の cursormodes 参照)。

m_blk
    点滅モードのビットです。

m_grp
    グラフィックモードのビットです (それほど有用ではありません)。

m_rev
    反転表示モードのビットです。

m_ul
    下線モードのビットです。

ncol
    物理端末の列数です。

nrow
    物理端末の行数です。

term
    端末の形式です。 端末の TERMCAP エントリの 2 番目のフィールドに書かれている標準名が使われます。

環境変数
window ユーティリティは、以下のような環境変数を利用します。 HOME, SHELL, TERM, TERMCAP, WINDOW_ID

関連ファイル
~/.windowrc
    スタートアップコマンドファイル
/dev/[pt]ty[pq]?
    仮想端末デバイス

歴史
window コマンドは、 4.3BSD から導入されました。

診断
自己説明的な診断メッセージになっています。