スポンサーリンク

TERMINFO

名称
書式
解説
拡張
関連ファイル
関連項目
作者

名称

terminfo − 端末ケーパビリティのデータベース

書式

/usr/share/misc/terminfo/*/*

解説

terminfo は端末の特性を記述するデータベースであり、 nvi(1), rogue(1) な どの画面を活用したプログラムや curses(3X) などのライブラリによって使 用 さ れます。 terminfo は、端末が持つケーパビリティの集合を与え、画面操作 をどのようにして行うかを指定し、必要なパディングや初期化シーケンスを 指 定することで、端末の特性を記述します。

terminfo の エ ントリは、‘,’ で区切られたフィールドの列からなります ( フィールド内のコンマはバックスラッシュでエスケープするか、\072 と書きま す)。 ‘,’ セパレータの後の空白は無視されます。各端末を表す最初のエント リは、端末を表すものとして知られている名前を指定します。名前を複数指 定 するときは ‘|’ で区切ります。最初の名前は、その端末のものとして最もよく 知られた省略形を与えます。最後の名前には、その端末を識別できるだけの 長 い 名前を指定するべきです。それら以外の名前は、同じ端末を指す別名と見な されます。最後のもの以外の名前は、すべて英小文字からなり、空白が含ま れ て いてはいけません。最後の名前には、読みやすくするために大文字や空白を 含めても構いません。

端末名 (最後の冗長なものは除く) は、以下の約束にしたがって付けてくだ さ い。 名前の基本部分を、端末を構成するハードウェアの特徴的部分から名付け ます (‘‘hp2621’’ のように)。この名前にはハイフンを含めてはいけませ ん。 モー ドや、ユーザの設定が現れる部分については、基本名の後に、ハイフンと モードの接尾辞つけて表してください。例えば、vt100 の 132 桁 モー ド は vt100-w のようになります。使えるところがあれば、以下の接尾辞を使ってく ださい。

端末の命名規則についてさらに知りたいときは term(7) のマニュアルを参照し てください。

ケーパビリティ

以下は terminfo の記述ブロックに含まれ、terminfo を使うコードが使用でき るケーパビリティの完全な表です。表の各行の意味は次の通りです。

variable は (terminfo レベルの) プログラマがケーパビリティを使用する と きに用いる名前です。

capname は、データベースのテキストの中で用いる短縮名で、データベースを 更新する人間が用いる名前です。可能な 場 合 は 常 に、capname は ANSI X3.64-1979 標準規格 (現在 ECMA-48 に取って代わられていますが、そこでも 同一のもしくは非常に良く似た名前を使っています) と同一もしくは類似の も の を選んであります。その意味も、その規格での規定に合致するようにしてあ ります。

termcap code は古典的な termcap ケーパビリティの名前です (いく つ か の ケーパビリティは新しいもので、その名前は termcap に由来しません)。

ケー パビリティの名前の長さには、決まった上限はありません。ただし、名前 を短くし、ソースファイルにタブを使って cap をきれいに並べられるように、 非公式ながら上限 5 文字の制限が既に採用されています。

最 後に、説明ではケーパビリティの意味を伝えようとします。説明の中には以 下のようなコードがある場合があります。

(P)

パディングが指定可能であることを表します。

#[1-9]

説明の中では、文字列が (#i) として与えられる引数とし て tparm を介して渡されることを示します。

(P*)

影響を受ける行数にパディングが比例することを表します。

(#i)

i 番目のパラメータを表します。

以下はブール値ケーパビリティです :

以下は数値ケーパビリティです :

以下の数値ケーパビリティは、SVr4.0 の term 構造体に存在していますが、マ ニュ アルには未だに説明がありません。 SVr4 でプリンタに対応するために採 り入れられました。

以下は文字列ケーパビリティです :

以下の文字列ケーパビリティは、SVr4.0 の term 構造体に存在していますが、 マニュアルで未だに説明がなされていません。

XSI Curses 規格では以下のものが追加されています。 それらは、例えば、 Solaris 2.5 や IRIX 6.x など、4.1 以降のバージョンの System V の、 curses のものです。それらの ncurses termcap 名はでっちあげました。XSI Curses 規格に従うと、 termcap 名はありません。 コ ン パ イ ル さ れ た terminfo エ ン ト リ が これらを使っていれば、SVr4.1 以降の System V terminfo エントリとはバイナリ互換ではないかも知れません。用心してく だ さい!

エントリの例

以 下 の エ ントリは、ANSI 規格端末を記述したものですが、現代的な端末の terminfo エントリが典型的にはどのようであるかを表しています。

ansi|ansi/pc-term compatible with color,
      mc5i,
      colors#8, ncv#3, pairs#64,
      cub=\E[%p1%dD, cud=\E[%p1%dB, cuf=\E[%p1%dC,
      cuu=\E[%p1%dA, dch=\E[%p1%dP, dl=\E[%p1%dM,
      ech=\E[%p1%dX, el1=\E[1K, hpa=\E[%p1%dG, ht=\E[I,
      ich=\E[%p1%d@, il=\E[%p1%dL, indn=\E[%p1%dS, .indn=\E[%p1%dT,
      kbs=^H, kcbt=\E[Z, kcub1=\E[D, kcud1=\E[B,
      kcuf1=\E[C, kcuu1=\E[A, kf1=\E[M, kf10=\E[V,
      kf11=\E[W, kf12=\E[X, kf2=\E[N, kf3=\E[O, kf4=\E[P,
      kf5=\E[Q, kf6=\E[R, kf7=\E[S, kf8=\E[T, kf9=\E[U,
      kich1=\E[L, mc4=\E[4i, mc5=\E[5i, nel=\r\E[S,
      op=\E[37;40m, rep=%p1%c\E[%p2%{1}%-%db,
      rin=\E[%p1%dT, s0ds=\E(B, s1ds=\E)B, s2ds=\E*B,
      s3ds=\E+B, setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
      setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,
      setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,
      sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;%?%p7%t;8%;%?%p8%t;11%;%?%p9%t;12%;m,
      sgr0=\E[0;10m, tbc=\E[2g, u6=\E[%d;%dR, u7=\E[6n,
      u8=\E[?%[;0123456789]c, u9=\E[c, vpa=\E[%p1%dd,

2 行目以後の行先頭に空白類文字を置くことで、エントリを複数行に分けて 継 続して書くことができます。行先頭に ‘‘#’’ を置くことでコメントを含めるこ とができます。 terminfo のケーパビリティには、3 つの型があります。 ブー ル 値 ケー パビリティは、その端末がある特性を有しているかどうかを表しま す。数値ケーパビリティは、その端末の大きさや、遅延の大きさを指 定 し ま す。 文字列ケーパビリティは、端末のある機能を実行させる際に用いるシーケ ンスを指定します。

ケーパビリティの型

すべてのケーパビリティには名前があります。例えば、ANSI 標準端末が 自 動 マー ジン (つまり、行の端に到達すれば自動的に復帰改行がなされること) を 有することはケーパビリティ am で表されます。よって ansi の記述は am を 含みます。数値ケーパビリティの後には文字 ‘#’ が続き、そして正の値が続き ます。 cols は、その端末の桁数を表しており、ansi では、この値は ‘80’ で あることを示します。数値ケーパビリティの値は、プログラミング言語 C の規 約を使って 10 進数、 8 進数、16 進数で与えることが で き ま す ( 例 え ば、255、0377、0xff、0xFF)。

最 後に、文字列ケーパビリティは、el (行末まで消去するシーケンス) などの ように、2 文字のコードと、‘=’ と、その先の ‘,’ までの間の文字列とで表さ れます。

文 字列ケーパビリティの中で、文字のエンコードを簡単にするために、いくつ かのエスケープシーケンスが利用できます。 \E\e はともに、 ESCAPE 文字 に マップされます。 ^x は任意の適切な x に関して control-x にマップされ ます。 \n \l \r \t \b \f \s はそれぞれ、改行、ラインフィード、復帰、 タ ブ、 バッ ク ス ペー ス、フォームフィード、空白にマップされます。その他 に、\^^ に、 \\\ に、 \, はコンマに、 \:: に、 \0 はヌル 文 字にマップされます。 (\0 は \200 を生成します。これは文字列を終端しませ んが、ほとんどの端末では CS7 が指定されているので、ヌル文字と同様の挙動 を 示すからです。stty(1) を参照してください) 最後に、\ の後に 8 進 3 桁 の数を指定して文字を表すこともできます。

ミリ秒単位の遅延は、el=\EK$<5> のように、文字列ケーパビリティのどの場所 でも $<..> のブラケットで囲んで置くことができます。この遅延を与えるため のパディングは、関数 tputs が行います。遅延は 1/10 の精度の数である必要 が あ り ま す。 接尾辞 ‘*’、’/’ またはその両方がついているかもしれませ ん。‘*’ はパディングをその処理で影響を受ける行の行数に比例させる必要 が あること、そしてその総計は影響を受ける 1 単位あたりの必要パディングによ り決まることを表します。 (文字挿入の場合、乗数は影響を受ける 行の 数 で す) 通常、デバイスに xon ケーパビリティがあれば、パディングは勧告的なも のです。コスト計算には使われますが遅延を引き起こしません。 ‘/’ 接尾辞は パディングが必須のものであることを示し、フロー制御を示す xon があるデバ イスに対しても指定されたミリ秒単位の遅延を強制します。

あるケーパビリティをコメントアウトせねばならない場合があります。そう い う場合は、ケーパビリティ名の前にピリオドを置いてください。上の例の 2 番 目の ind がその例です。

コンパイルされた記述の読み込み

環境変数 TERMINFO が設定されていれば、それは作業中の記述をコンパイル し た ものを含むディレクトリのパス名と解釈されます。そのディレクトリだけを 探します。

TERMINFO が設定されていなければ、ncurses 版の terminfo 読み込みコードは その代わりにディレクトリ $HOME/.terminfo からコンパイルされた記述を探し ます。そこで見つけるのに失敗し、環境変数 TERMINFO_DIRS が設定されていれ ば、 変数の内容をコロンで区切られた探すべきディレクトリのリストと解釈し ます (空のエントリは /usr/share/misc/terminfo を探すコマンドとして解 釈 さ れます)。 TERMINFO_DIRS ディレクトリのいずれにも記述が見つからなけれ ば、読み込みは失敗します。

TERMINFO も TERMINFO_DIRS も設定されていなければ、最後に試みられる場 所 はシステムの terminfo ディレクトリ /usr/share/misc/terminfo です。

($HOME/.terminfo 探 索 も TERMINFO_DIRS 拡 張 も 標 準 の System V terminfo/curses ではサポートされていません。)

端末記述の準備

ここでは、どのようにして端末の記述を準備するかの概略を説明します。 もっ と も効率的なやり方は、 terminfo の中にある類似の端末の記述をまねて作成 することです。 vi などのスクリーンエディタに書き掛けの記述を使わせて み て、 その記述が正しいかどうかをチェックしながら、記述を徐々に作り上げて ゆくことです。通常のものとあまりにもかけ離れた端末 の 場 合、 terminfo ファ イルの記述能力の欠陥、もしくはテストプログラムの画面操作のコードの バグが明らかになるかも知れないので、それには注意してください。

(端末メーカが文書に書いてくれていない場合に) 行の右挿入の際のパディング を 得るには、大きなファイルを 9600 ボーで編集し、画面の中ほどで 16 行程 度を削除してから、 ‘u’ キーを数度すばやく連打するという厳しいテストを行 う と よ いでしょう。端末がぐちゃぐちゃになるのなら、普通は、もう少しパ ディングが必要だということです。文字挿入についても似たようなテストを 行 うことができます。

基本的なケーパビリティ

端末の各行の桁数は数値型ケーパビリティ cols で指定します。端末が CRT の 場合、画面の行数はケーパビリティ lines で指定します。カーソルが右マージ ン に達したときに次の行の左端に回り込む場合、ケーパビリティ am を指定す る必要があります。端末が、画面消去後カーソルをホームポジションにもっ て ゆ く ことができる場合、その機能は文字列ケーパビリティ clear で指定しま す。端末が (ある文字を上に出力した時にその場所を消去するのではなく) 重 ね 打 ち する場合、ケーパビリティ os を指定する必要があります。印字端末 で、ソフトコピー装置を持たない場合、 hcos とを指定します。 (os は、 ハードコピー端末や、APL 端末だけでなく、 TEKTRONIX 4010 シリーズのような ストレージスコープ管端末にも適用されます。) 現在の行の左端にカーソル を 移 動させるコードが存在する場合、それを cr で指定します。 (通常、これは 復帰文字、つまり control M になります。) 可聴シグナル (ベル、ビープ音な ど) を生成するコードがある場合、それを bel で指定します。

カー ソルを (バックスペースのように) 1 ポジションだけ左へ移動させるコー ドがある場合、それは cub1 で指定します。同様に、右への移動、上 へ の 移 動、 下への移動はそれぞれ、 cuf1, cuu1, cud1 で指定します。これらの局所 的カーソル移動機能は、通過する場所のテキストを変更するものであっては な り ません。たとえば、空白文字はその下のテキストを消去してしまうため、普 通は ‘cuf1= ’ とは指定しません。

ここで極めて重要なこととして、 terminfo にエンコードされた局所的カー ソ ル 移動は、 CRT 端末の左端および上端では定義されないということです。プロ グラムは、 bw の指定がない限り、左端でバックスペースを出力しようとし て は いけません。また、画面上端で、上に移動しようとしてはいけません。テキ ストを上にスクロールするためには、プログラムは画面左下隅にカーソルを 移 動させて、 ind (index) 文字列を送出してください。

テ キストを下にスクロールするには、プログラムは画面左上隅にカーソルを移 動させて、 ri (reverse index) 文字列を送出してください。文字列 indri の挙動は、それぞれ先に述べた画面隅にカーソルがない場合には定義されて いません。

スクロールシーケンスのパラメータ付きバージョンは、 indnrin で、これ ら は、 スクロールする行数を指定するパラメータを 1 つ取ることを除いては indri と、同じ挙動を示します。これらも、カーソルが適切な画面端に 存 在しない場合の挙動は定義されません。

ケー パビリティ am は、右端でテキストが出力されてもカーソルが右端に留ま り続けるかどうかを示します。ただし、この挙動は最終桁での cuf1 の挙動 に は 必 ずしも適用されません。左端からの局所的移動で定義されたものは、 bw が指定されている場合に、左端からの cub1 が 1 つ前の行の右端に移動すると い う こ とだけです。 bw が指定されていない場合、この効果は定義されませ ん。これは、例えば、画面の端に沿って箱を描くときに便利なものです。端 末 が 自動マージン機能を切り替え可能な場合、 terminfo ファイルでは、通常は その機能はオン状態、つまり am であると想定します。端末が次の行の先頭 桁 に移動するコマンドを持つ場合、そのコマンドを nel (newline) で指定するこ とができます。このコマンドが、現在行の残りの部分を消去するかどうかは 関 係 ありません。ですから、端末が、 crlf を持たない場合でも、動作する nel を作ることは可能でしょう。

これまで紹介したケーパビリティで、ハードコピー端末や、“ガラスの tty” 端 末を記述するには十分です。ここで、model 33 teletype は、

33|tty33|tty|model 33 teletype,
bel=^G, cols#72, cr=^M, cud1=^J, hc, ind=^J, os,

と記述されます。一方、Lear Siegler 社の ADM−3 は、

adm3|3|lsi adm3,
am, bel=^G, clear=^Z, cols#80, cr=^M, cub1=^H, cud1=^J,
ind=^J, lines#24,

と記述されます。

パラメータ化された文字列

カー ソル位置設定など、パラメータを必要とする文字列は、 printf(3S) 風の エスケープ %x を含むパラメータ化文字列ケーパビリティを用いて記 述 し ま す。例えば、カーソル位置を指定する cup ケーパビリティは、移動先の行と桁 を指定する 2 つのパラメータを与える必要があります。 (行と桁は 0 から 数 え、 ユーザに見える物理画面を参照します。目に見えないメモリ部分は参照し ません。) 端末がメモリ相対のカーソル位置指定機能を持つ 場 合、 こ れ は mrcup で表します。

パラメータ渡し機構では、スタックと、それを操作する特別の % コードを用い ます。通常は、シーケンスはパラメータを 1 つスタックにプッシュし、それを ある形式で出力します。もっと複雑な操作が必要なこともしばしばあります。

% コードには以下の意味があります。

     %%        ‘%’ を出力する

%[[:]flags][width[.precision]][doxXs]

printf でのように、フラグは [-+#] とスペース

%c

printf() の %c のように、pop() を表示する

%s

printf() の %s のように、pop() を表示する

%p[1-9]

i 番目のパラメータをプッシュする

%P[a-z]

pop() を動的変数 [a-z] に設定する

%g[a-z]

動的変数 [a-z] をプッシュする

%P[A-Z]

pop() を静的変数 [a-z] に設定する

%g[A-Z]

静的変数 [a-z] をプッシュする

%’c

文字定数 c

%{nn}

整数定数 nn

%l

strlen(pop) をプッシュする

%+ %- %* %/ %m

算術演算 (%m は剰余): push(pop() op pop())

%& %| %^

ビット演算: push(pop() op pop())

%= %> %<

論理演算: push(pop() op pop())

%A, %O

論理 and 操作と論理 or 操作 (条件節用)

%! %~

単項演算 push(op pop())

%i

最初の 2 パラメータに 1 を足す (ANSI 端末用)

%? expr %t thenpart %e elsepart %;

if-then-else, %e elsepart はオプション。

else-if は Algol 68 風に指定可能:

%? c1 %t b1 %e c2 %t b2 %e c3 %t b3 %e c4 %t b4 %e %;

ci は条件節、bi は本体。

二 項演算は、通常の順序で並べたオペランドに対して後置形式で指定します。 例えば、x-5 を得るには、"%gx%{5}%-" を指定します。エスケープされた文 字 列を評価する間 %P 変数と %g 変数は存続します。

HP2645 の 例 を 考えてみましょう。これで 3 行 12 桁に移動させるには、 \E&a12c03Y に 6 ミリ秒のパディングを送出する必要があります。ここで行 と 桁とが逆になっていることと、行、桁とも 2 桁で出力されていることに注意し てください。この端末の cup ケーパビリ ティ は、“cup=6\E&%p2%2dc%p1%2dY” となります。

Microterm ACT-IV は、^T の後に現在の行と桁を、どちらも単にバイナリ値で 送る必要がありますが、 “cup=^T%p1%c%p2%c” となります。 “%c” を使う端 末 は、カーソルを前方に戻すこと (cub1) と画面上で 1 行上にカーソルを移動さ せること (cuu1) ができる必要があります。これは、システムが変更したり 握 り つぶしたりする可能性があるため、 \n, ^D, \r を確実に送信できるとは限 らないからです。 (terminfo を扱うライブラリルーチンは、タブが決して展開 さ れ な いように端末モードを設定します。ですから \t は確実に送信できま す。これは Ann Arbor 4080 では重要なことが分っています。)

最後の例は LSI ADM -3a です。これは行と桁を空白文字からのオフセットで 表 します。ですから、“cup=\E=%p1%’ ’%+%c%p2%’ ’%+%c” となります。 ‘\E=’ を 送出した後、最初のパラメータをプッシュし、空白文字の ASCII 値 (32) を プッシュし、それらを加えて (以前の 2 つの値の代わりにその和をスタックに プッシュし) 得た値を文字として出力します。その後、2 番目のパラメータ に つ いても同様の処理を行います。スタックを使うことで、さらに複雑な計算も 可能です。

カーソル移動

カーソルを高速にホームポジション (画面の左上隅) に移動させる方法を持 つ 端 末の場合、これを home で指定することができます。同様に、高速に左下隅 に移動させる方法を持つ場合も ll で指定することができます。端末によっ て は、 ホームポジションから cuu1 を使って上に移動することでこの動作が可能 な場合もありますが、プログラムは (llでそう指定しない限り) 自分からそ う し てはならないことになっています。これは、ホームポジションから上に移動 した場合の動作について、プログラムは一切想定できないからです。ホーム ポ ジ ションは位置指定 (0,0)、つまり、メモリではなく、画面の左上隅と等しい ことに注意してください。 (ですから、HP 端末の \EH のシーケンス は home として使用できません。)

端 末が行や桁の絶対カーソル位置指定機能を持つ場合、単一パラメータを取る ケーパビリティ hpa (水平絶対位置) と vpa (垂直絶対位置) で指定しま す。 (hp2645 のような) 一般的な 2 パラメータのシーケンスよりもこれらの方が短 くなる場合がときどきあり、その場合、 cup よりもそれらを使う可能性があり ます。パラメータ化された局所移動機能 (例えば、 n 桁右へ移動する) が存在 する場合、これらは、いくつ移動するかを指定するパラメータを 1 つ 持 つ cud, cub, cuf, cuu を 使っ て 指 定 することができます。これらは主 に、 TEKTRONIX 4025 のように端末が cup を持たない場合に有益です。

これらのケーパビリティを使用するプログラムを実行する際に、端末を特殊 な モー ドにする必要がある場合、このモードに入るコードと出るコードをそれぞ れ smcuprmcup で指定することができます。こういう事態が生じる場合 と して、例えば Concept のように、複数ページのメモリを持つ端末があります。 画面相対指定を持たず、メモリ相対のカーソル位置指定機能しか持たないこ の 端末の場合、画面の大きさのウィンドウ 1 枚を端末に固定で割り付け、カーソ ル位置指定を適切にできるようにしなければなりません。このケーパビリ ティ は TEKTRONIX 4025 でも使用されています。こちらでは、 smcup で、terminfo で使用するコマンド文字を設定しています。 rmcup シーケンス が出力され た 後 に、smcup シーケンスが画面を (rmcup を出力する前の状態に) 回復しない ならば、nrrmc を指定してください。

領域消去

端末がカーソルを動かさずに、現在位置から行の末端まで消去可能で あ る 場 合、 これを el で指定すべきです。端末がカーソルを動かさずに、行の先頭か ら現在位置を含めて現在位置まで消去可能である場合、これを el1 で指定すべ き です。端末が現在位置から画面の終りまでを消去可能な場合、これを ed で 指定すべきです。 ed は行の第 1 桁から行う場合のみ定義されます。 (ですか ら、 まともな ed が利用できない場合でも、大量の行削除リクエストを使って シミュレート可能です。)

行の挿入/削除と垂直移動

カーソルのある行の前に空白行を新規につくることができる端末の場合、こ れ を il1 で指定すべきです。これは、行の先頭位置でのみ行われます。作成後、 カーソルは新しくできた空白行に置かれる必要があります。端末がカーソル の ある行を削除できる場合、これを dl1 で指定すべきです。この機能は削除され る行の先頭でのみ行われます。 il1dl1 の変種で、挿入/削除する行数を表 すパラメータを 1 つ取るものは、 ildl とで指定できます。

(vt100 のように) スクロール領域を設定可能な端末の場合、領域設定コマンド を csr ケーパビリティを用いて指定可能です。このケーパビリティは 2 つ の パ ラメータ、スクロール領域の先頭行と最終行、を取ります。困ったことに、 このコマンド実行後のカーソル位置は定義されません。

適切な領域に csr を用いることで行の挿入/削除の効果を得ることが 可 能 で す。 scrc (カーソルの保存と回復) コマンドは、合成した挿入/削除文字 列がカーソルを動かさないことを保証するには有用でしょ う。 (ncurses(3X) ラ イブラリは自動的にこの合成を行うので、 csr で挿入/削除文字列をエント リ用につくる必要はないことに注意してください。)

挿入と削除を構成するもう 1 つの方法は、(HP-700/90 シリーズには挿入/削除 は ありますが、このシリーズのような) いくつかの端末にあるメモリロック機 能と index を組み合わせて使うことです。

まともな行挿入/削除コマンドを持たない端末で、画面の最上端もしくは最下端 で行を挿入する場合、 ri もしくは ind を使って行うこともできます。まとも な行挿入/削除コマンドを持つ場合でも、これらを使う方が速い場合が多 い で す。

ス クロールする各ウィンドウが実質的に画面大のキャンバス上のビューポート であるなら、ブール値 non_dest_scroll_region を設定すべきです。この ケー パ ビリティをテストするためには、画面の中央にスクロール領域をつくり、最 下行に何かを書き、領域の一番上にカーソルを動かし、ri を行った後 dl1ind を行ってください。 ri で領域の下へとスクロールして消えたデータが、 再び現れるなら、スクロールは非破壊的です。System V Curses と XSI Curses は ind, ri, indn, rin が破壊的スクロールをシミュレーションすることを期 待します。これが本当でない限り csr を定義しないようにと文書には注意書き が あります。この curses の実装はより寛大で、ndstr が定義されていればス クロールの後に明示的に消去を行います。

メモリの一部に、すべてのコマンドが影響するウィンドウを定義することが で き る端末の場合、それは、パラメータ化文字列 wind で指定すべきです。メモ リ中での開始行、終了行、開始桁、終了桁を表す 4 パラメータは、この順番で 与えます。

上側の表示メモリを保持できる端末の場合、da ケーパビリティを指定すべきで す。下側の表示メモリを保持できる場合、db を指定すべきです。これらは、行 削 除 や スクロールにより、画面最下端に非空白行が上がってくること、およ び、ri による逆スクロールにより非空白行が下がってくることを表します。

文字の挿入/削除

terminfo で記述可能な文字の挿入/削除に関して、基本的には 2 種類のインテ リジェント端末があります。もっとも標準的な文字挿入/削除機能は、現在行の 文字のみが影響を受け、シフトした文字は一体となって移動し行端で消えて 行 くものです。その他の端末、例えば Concept 100 や Perkin Elmer Owl のよう なものの場合、表示出力された空白とそうでない空白との間に区別が あ り ま す。挿入/削除にともなうシフトは画面上の表示出力されていない空白に対して のみ適用され、それぞれ空白の消滅、もしくは表示出力されていない空白 2 つ に なります。自分が持っている端末がどちらのタイプかを調べるには、画面を 消去してから、カーソル移動を用いてテキストを 2 箇所に分けて 出 力 し ま す。“abc” と “def” の間に (空白文字でなく) 局所的カーソル移動を用いて “abc def” を出力してください。その後、カーソルを “abc” の前に移動 さ せ、 端末を挿入モードにします。文字を打ち込むと、行の残りが一体となって シフトして行の端で文字がこぼれおちてゆくならば、この端末は表示出力さ れ た 空白とそうでない空白を区別しません。 “abc” がシフトして “def” に当り その後はそれらが一緒に行の端まで進み、次の行まで進むならば、この端末 は 2 番目のタイプのもので “insert null” を表すケーパビリティ in を指定すべ きです。論理的には、これらは別の属性 (挿入モードが 1 行か複数行か、およ び、 表示出力されていない空白を特別扱いするか否か) ですが、挿入モードを この属性 1 つで記述できない端末に、今までお目にかかったことはあり ま せ ん。

terminfo では、挿入モードを持つ端末も、現在行の上で場所を空ける短いシー ケンスを送る端末も、両方とも記述することができます。挿入モード に 入 る シー ケ ン スは smir で指定してください。挿入モードから出るシーケンスは rmir で指定してください。挿入したい文字の直前に、あるシーケンスを送出す る 必要がある場合は ich1 で指定してください。まともな挿入モードを持つ端 末のほとんどでは、 ich1 を指定することはないでしょう。一方、画面上で 場 所を空けるシーケンスを送る端末の場合は、 ich1 を指定すべきです。

両 方 持 つ端末の場合、通常は ich1 よりも挿入モードの方が望ましいでしょ う。技術的には、実際に両方を組み合わせて使用する必要がある場合以外 は、 両 方同時に指定すべきではありません。よって、両方あると curses を使わな いアプリケーションの中には混乱するものがあります。その兆候は、 挿 入 を 使っ た更新の時に文字が二重になることです。この要求は現在では稀です。ほ とんどの ich シーケンスはその前に smir を必要とはせず、ほとんどの smir 挿入モードは各文字の前に ich1 を必要とはしません。よって、新しい curses は実際にこれが真実だと仮定し、 rmir/smirich/ich1 のどちらか一方 (両 方 ではありません) を適切なものとみなして利用します。もし、両方を必要と するほど古い端末のエントリを、新しい curses で使うために書く必要があ る なら、 ich1rmir/smir シーケンスを含めてください。

挿 入後のパディングが必要な場合、ip (文字列オプション) に必要なミリ秒の 数を指定してください。その他のシーケンスで文字 1 文字を挿入後に送出する 必 要 の あるものを、いっしょに ip で指定することもできます。「挿入モー ド」に入り、かつ挿入する文字ごとにあるコードを付けて送出する必要のあ る 端末の場合、 smir/rmirich1 とを両方とも指定してください。そうするこ とで、それらが使われるようになります。 ich ケーパビリティはパラメータ n 1 つをとり、これは ich1 の動作を n 回繰り返します。

挿 入モードでないとき、文字入力の間にパディングが必要なら、rmp にミリ秒 のパディングの数を指定してください。

挿入モードの途中で同じ行の文字を削除するために、カーソルを動かす必要 が ある場合があります (例えば、挿入位置の後にタブがある場合)。挿入モードに 入ったままでカーソルを移動させることができる場合、このような場合の挿 入 を 高 速に行うために、ケーパビリティ mir を指定することができます。 mir を省略しても、影響を受けるのは速度のみです。端末によって は ( 有 名 な Datamedia のアレとか) 挿入モードの動作方法の違いにより mir を指定しては いけないものがあります。

最後に、文字 1 文字の削除用として dch1 を、 n 文字削除用としてパラ メー タ n 1 つをとる dch を、そして smdcrmdc をそれぞれ削除モードに入る シーケンスとそこから出るシーケンスとして与えることで削除モード ( dch1 が 動作するために、端末が入っていなければならないモード) を指定すること ができます。

n 文字を削除する (カーソルを移動させずに空白を n 個出力することと同等の 処 理) ためのコマンドは、パラメータを 1 つとる ech を使って指定すること ができます。

ハイライト・下線・可視ベル

端末が 1 つまたはそれ以上の表示属性を持つ場合、これらを表す方法として異 なっ たやり方がいくつかあります。エラーメッセージや他の種類の注意を引く メッセージに適した、十分コントラストが高く目立つ形式から 1 つ、強調モー ド を選択すべきです。 (選ぶなら、反転表示に半輝度を加えたもの、もしくは 単に反転のみがよいでしょう。) 強調モードに入るシーケンス、出るシーケ ン スはそれぞれ smsormso で指定します。 TVI 912 や Teleray 1061 のよう に、強調モードへの出入りにより画面に空白が 1 つ 2 つ残る場合、xmc を 指 定して空白がいくつ残るかを教えるべきです。

下 線引きを開始するコード、終了するコードは、それぞれ smulrmul で指 定します。 Microterm Mime のように、現在位置の文字に下線を引き、空白 1 つ 分カーソルを右に移動するコードを持つ端末の場合、そのコードを uc で指 定することができます。

その他もろもろの強調モードに入るケーパビリティには、 blink (点滅) bold (太字もしくは更に明るい) dim (暗いもしくは半輝度) invis (空白もしくは見 えないテキスト) prot (保護状態) rev (反転表示) sgr0 ( すべての属性 モー ド をオフにする) smacs (別の文字セットモードに入る) and rmacs (別の文字 セットモードから出る) が含まれます。これらのモードのどれか 1 つをオンに し た場合に、他のモードがオフになる場合もありますし、ならない場合もあり ます。

モードの任意の組み合わせを設定するシーケンスが存在する場合、それを 9 つ の パラメータを持つ sgr (属性の設定) で指定します。パラメータのそれぞれ は、0 か非 0 の値を取り、対応する属性がオンかオフかを表します。 9 つ の パ ラ メー タとは、順に、強調、下線、反転表示、点滅、暗い表示、太字、空 白、保護、別の文字セットです。必ずしもすべてのモードが sgr によっ て サ ポー トされている必要はありません。独立した属性コマンドが存在するものだ けで構いません。

例えば、DEC vt220 は以下のモードのほとんどをサポートします。

各モードが動作中かどうかを素早く決める方法がないので、エスケープシー ケ ン スを動作中のモードをすべてオフにするもので始めます。強調は反転と太字 の組合せでできています。保護モードはホストの消去から画面の文字を保護 す る ので、sgr では普通は使われませんが、vt220 端末には保護モードがありま す。別の文字セットモードは、オフかオンかによって ^O または ^N である と い う点で異なります。全モードをオンにするシーケンスは \E[0;1;4;5;7;8m^N です。

いくつかのシーケンスは異なるモードに共通です。例えば、;7 は、p1 か p3 が真であるとき、すなわち強調か反転モードがオンのときに出力されます。

上 のシーケンスを依存関係とあわせて余すところなく書くと次のようになりま す。

これをすべて一緒に sgr シーケンスに詰め込むと次のようになります。

    sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;
        %?%p4%t;5%;%?%p7%t;8%;m%?%p9%t\016%e\017%;,

sgr を設定したら、sgr0 も設定する必要があることを忘れないでください。

「魔法のクッキー (magic cookie)」 (xmc) を持つ端末では、モード設定 シー ケ ン ス を受信すると特殊な「クッキー」とでも呼ぶべきゴミを画面に残しま す。この端末では、モード設定シーケンスは、各文字に余分なビットを持た せ るのではなく、表示アルゴリズムそのものに影響を与えます。 HP 2621 などの ような端末では、次の行へ移動したり、カーソルの位置指定をした際 に 強 調 モー ドから勝手に抜け出てしまいます。強調モードを用いるプログラムは、強 調モードでの移動が安全であることを示す msgr ケーパビリティの指定が無 い 場 合には、カーソルを移動させたり改行文字を送出する前に強調モードから脱 出すべきです。

エラー発生を無音で (ベルの代わりに) 通知するため、画面をフラッシュさ せ る 方 法が提供されている端末の場合、それを flash で指定できます。これは カーソルを移動させてはなりません。

カーソルが最下行にないときに通常の状態以上に見易くする (例えば、点滅し な い下線カーソルを、より見つけやすいブロックカーソルや点滅下線カーソル にする) 必要がある場合、そのシーケンスを cvvis で指定してください。カー ソルを完全に見えないようにする方法がある場合、それを civis で指定してく ださい。これらのモードの効果を打ち消すシーケンスとして、ケーパビリ ティ cnorm を指定すべきです。

たとえ重ね打ちでないとしても、(特殊なコードなしで) 下線文字を正しく生成 できる端末の場合、ケーパビリティ ul を指定すべきです。文字を別の文字 に 重 ね打ちすると両方の文字が画面に残るなら、ケーパビリティ os を指定して ください。重ね打ちが空白文字で消去可能な場合、eo を指定してそのことを明 らかにしておくべきです。

キーパッドとファンクションキー

キー を押すとコードを送出するキーパッドを持つ場合、そのキーパッドに関す る情報を指定することができます。注意すべき点として、キーパッド が 局 所 モードでしか動作しない端末 (例えば、シフト状態でない HP 2621 のキーがこ れに該当します) を扱うことはできないことがあります。送信状態か非送信 状 態 か を設定できるキーパッドの場合、それらのためのコードを smkxrmkx とで指定することができます。これらの指定がない場合、キーパッドは常に 送 信状態として扱われます。左矢印、右矢印、上矢印、下矢印キー、home キーが 送出するコードは、それぞれ kcub1, kcuf1, kcuu1, kcud1, khome で指定でき ま す。 f0, f1, ..., f10 のようなファンクションキーがある場合、これらが 送出するコードは kf0, kf1, ..., kf10 で指定できます。これらのキーが f0 か ら f10 までのデフォルトのラベル以外のラベルを持つ場合、このラベルを lf0, lf1, ..., lf10 で指定できます。他の特殊キーが送出するコードは、 以 下のように指定できます。 kll (ホームダウン (home down))、 kbs (バックス ペース (backspace))、 ktbc (全タブクリア (clear all tabs))、 kctab ( こ の 桁のタブストップをクリア)、 kclr (画面消去 (clear screen) キーまたは 抹消 (erase) キー)、 kdch1 (文字削除 (delete character))、 kdl1 (行削除 (delete line))、 krmir (挿入モードから抜ける (exit insert mode))、 kel (行末までクリア)、 ked (画面の終りまでクリア)、 kich1 (文字挿入 (insert character) または挿入モードに入る (enter insert mode))、 kil1 (行挿入 (insert line))、 knp (次のページ (next page))、 kpp ( 前 の ペー ジ (previous page))、 kind (前進スクロール (scroll forward) / 下降スクロー ル (scroll down))、 kri (後退スクロール (scroll backward) / 上 昇 ス ク ロール (scroll up))、 khts (この桁にタブストップを設定)。更に、キーパッ ドが 4 つの矢印を含む 3 × 3 のキー配列を持つ場合、他の 5 つ の キー を ka1, ka3, kb2, kc1, kc3. で指定します。 3 × 3 のカーソル移動キーパッド の効果が必要な場合、これらのキーが有用です。

ファンクションキーにプログラムする文字列は、 pfkey, pfloc, pfx で指定で きます。画面のラベルの文字列は pln で指定すべきです。これらの文字列は、 それぞれ 2 つの引数を取ります。プログラム対象のファンクションキー 番 号 (0 から 10 まで) と、そこにプログラムする文字列です。この範囲外のファン クションキー番号を使うと未定義のキーに対してプログラムしてしまうかも し れ ず、これは端末依存の動作となります。これらのケーパビリティの違いは以 下の通りです。 pfkey を指定すると、そのキーを押すことは、ユーザが指定し た文字列をタイプするのと同じことになります。 pfloc では、端末内部で局所 的にその文字列が実行されることになります。 pfx では、その文字列が コ ン ピュータに送出されることになります。

ケー パビリティ nlab, lw, lh はプログラム可能な画面のラベルの数、幅、高 さを定義します。ラベルをオン、オフするコマンドがあるなら、smlnrmln に指定してください。変更が見えるのを確実にするために、通常 smln は 1 つ 以上の pln シーケンスの後で出力されます。

タブと初期化

端末がハードウェアタブを持つ場合、次のタブストップまでカーソルを進め る コマンドを ht (通常は control I) で指定できます。前のタブストップまで左 方向に進める「後退タブ」コマンドは、 cbt で指定できます。端末が、タブが 端 末に送出されずにコンピュータ内部で空白に展開されるモードになっている 場合、プログラムは、たとえ htcbt が存在しても、それらを使用しないと い う約束になっています。これは、ユーザがタブストップを正しく設定してい ない可能性があるためです。電源投入時に、 n 個の空白ごとにハードウェアタ ブ が初期化されている端末の場合、数値パラメータ it を指定します。これは タブとして設定される空白数を表します。通常、これは tset コマ ン ド が、 ハー ドウェアタブ展開を使用するモード設定と、タブストップ設定とを行うか どうかを決定するために使用します。タブストップ設定を不揮発性メモリに 記 憶できる端末の場合、terminfo での記述の際に、タブストップは正しく設定さ れていることを想定して構いません。

他のケーパビリティとして、 is1, is2, is3 があり、これらは端末を初期化す る文字列を指定します。また、 iprog があり、これは端末初期化用として実行 するプログラムのパス名を指定します。また、if があり、これは初期化文字列 が 長 い 場合、それを含むファイルの名前を指定します。これらの文字列によ り、terminfo の残りの記述と矛盾なく動作するモードに端末が設定されること が 求 め られます。通常、ユーザがログインするたびに、 tput プログラムの init オプションがこれらの文字列を端末に対して送出します。送出は以下の順 序 で 行 わ れます。プログラム iprog を実行 ; is1 を出力 ; is2 を出力 ; mgc, smglsmgr でマージンを設定 ; tbchts でタブを設定 ; ファイル if を印字 ; 最後に is3 を出力。

初 期化のほとんどは is2 で行われます。共通のシーケンスを is2 に置き、特 殊な場合を is1is3 とに置くことで、文字列をそれぞれに複製して持た せ な くても、特殊な端末モードを設定することができます。まったくわけのわか らない状態から復帰するための、よりハード寄りのリセットを行うための シー ケンスの組も同様に、 rs1, rs2, rf, rs3 で指定することができます。これら は is2if と良く似たシーケンスです。端末がハマったときに使うプログラ ムである、 reset がこれらのシーケンスを出力します。コマンドを rs1, rs2, rs3, rf に置くのは、普通、そのコマンドが画面にユーザを混乱させる効果 を 産 み 出し、かつ、ログインの際には必要ない場合に限ります。例えば、vt100 を 80 桁モードに設定するコマンドは、普通なら is2 に含めるはずですが、こ の コマンドは画面に混乱させるゴミを作り出しますし、端末は既に 80 桁モー ドになっているのが普通ですので、このコマンドを含める必要ありません。

タブストップの設定、クリアを行うコマンドがある場合、それらを tbc (全 タ ブ ストップのクリア) と hts (各行の現在桁にタブストップを設定) に指定で きます。タブ設定に関して、ここで説明したものより複雑なシーケンスが必 要 な場合、そのシーケンスを is2if に置いても構いません。

遅延とパディング

ハードコピー端末と (例えば、DEC VT100 を含む) 非常に古い CRT を含む、多 くの古くて遅い端末は XON/XOFF ハンドシェークも DTR ハンドシェーク も サ ポー トしません。特定のカーソルの移動とスクリーンの変更の後には、パディ ング文字が必要かもしれません。

端末がフロー制御のための xon/xoff ハンドシェークを使用する場合 (すな わ ち、 入 力 バッファが一杯に近くなると、ホストに自動的に ^S を送り返す場 合)、 xon を指定してください。このケーパビリティはパディングの送出を 抑 え ます。実質的に速度に制限のないメモリマップト形式のコンソールデバイス に対しても指定できます。ルーチンが相対的なコストに関してよりよい見積 も り を立てることができるように、この場合でもパディング情報を指定すべきで す。しかし、実際はパディング文字は送信されません。

pb (パディングボーレート) を指定することで、ボーレートが pb の値より 低 い 場合、パディングが抑えられます。エントリにパディングボーレートがなけ れば、パディングが送出されるかされないかは xon により完全に制御さ れ ま す。

ヌ ル (0) 文字以外のパディング文字を必要とする端末の場合、それを pad で 指定できます。 pad 文字列の最初の文字のみが使用されます。

ステータス行

端末には、通常のソフトウェアでは使用されない (それゆえ、端 末 の lines ケー パビリティでは数に入らない) 余分な「ステータス行」を持つものもあり ます。

最も簡単な場合には、ステータス行はカーソル位置の指定は可能ですが、画 面 上 の ス クロール領域の一部ではないものです。初期化のときに 23 行のスク ロール領域のある 24 行の VT100 と同じように、 Heathkit H19 には、この種 のステータス行があります。この状況は hs ケーパビリティで指定します。

ス テータス行に入るには特別なシーケンスを必要とする端末もあります。これ はパラメータを 1 つとる文字列 tsl で表します。これはカーソルをステー タ ス行の与えられた 0 桁に移動します。ケーパビリティ fsl で最後の tsl の前 の主画面のカーソル位置に戻る必要があります。そのために tslfsl の 中 に sc (save cursor) と rc (restore cursor) の文字列の値を含める必要があ るかもしれません。

ステータス行は通常、端末の幅と同じ幅だと仮定されています。これが本当 で ないのなら、そのことを数値ケーパビリティ wsl で指定できます。

ステータス行を消去したり削除するコマンドは dsl で指定できます。

ブール値ケーパビリティ eslok は、ステータス行内でエスケープシーケンスや タブ等が通常通り働くことを示します。

ncurses の実装はこれらのケーパビリティのどれもまだ利用していません。 こ れらが重要になったらここに記述します。

線画

多 く の端末には図を描くのに役に立つ別の文字セットがあります。 terminfo と curses は VT100 でサポートされている図形文字と AT&T 4410v1 の文字 の い くつかをサポートします。この別の文字セットは acsc ケーパビリティで設 定されます。

新しいデバイスの図形セットを定義するのに一番よい方法は、この表のその 端 末 用のコピーに列を追加し、対応する図形のところに (smacs/rmacs スイッチ の間に送出される場合に) 送出される文字を与えることです。それから VT100 と その端末の文字を右から左に順に読み上げてください。これが ACSC 文字列 になります。

色の扱い

ほとんどのカラー端末は ‘Tektronix 風’ か ‘HP 風’ の ど ち ら か で す。Tektronix 風端末には、あらかじめ定義された N 色 (N は通常 8 です) の組があり、文字セル毎に独立に前景色と背景色を設定して、N * N の色ペ ア に できます。 HP 風端末では、色ペアをそれぞれ別々に設定する必要がありま す (前景と背景は独立には設定できません)。 2*M の異なった色からは M まで の色ペアができます。ANSI-互換端末は Tektronix 風です。

い くつかの基本的な色に関するケーパビリティは色の扱い方とは独立です。数 値ケーパビリティ colorspairs には、同時に表示できる色または色ペアの 最大数を指定します。op (original pair) 文字列は前景色と背景色を端末の規 定値にリセットします。oc 文字列はすべての色または色ペアを端末の規定値に リセットします。(多くの PC 端末エミュレータを含む) いくつかの端末では、 電源投入時の背景色ではなく、現在の背景色で画面領域を消去します。この 場 合にはブール値ケーパビリティ bce を指定すべきです。

Tektronix 型の端末で現在の前景色と背景色を変えるためには、 setaf (set ANSI foreground) と setab (set ANSI background) を 使 う か、setf (set foreground) と setb (set background) を使ってください。これらは 1 つの パラメータ、色番号をとります。SVr4 の文書には setaf/setab だけが書か れ ています。XPG4 の草案には、「端末が背景と前景を設定する ANSI エスケープ シーケンスをサポートするなら、それぞれ setafsetab で指定す べ き で す。 端末が背景と前景を設定する別のエスケープシーケンスをサポートするな ら、それぞれ setfsetb で指定すべきです。vidputs() 関数と refresh 関 数 は、定義されていれば setafsetab を使います。」と書かれています。

setaf/setabsetf/setb ケーパビリティはそれぞれ数値引数を 1 つとり ま す。引数値 0-7 は移植できるよう以下のように定義されています (中央の列は cursesncurses ライブラリ用にヘッダで利用できる記号 の #define で す)。 端 末 の ハー ド ウェアはこれを好きなようにマップするのは自由です が、RGB 値は色空間での通常の位置を示しています。

HP 風の端末では、どの色ペアが現在のものかを設定する色ペア番号パラメータ をともなった scp を使ってください。

Tektronix 風 の端末では、色が変更できることを示すためにケーパビリティ ccc があります。もしそうであれば、 initc ケーパビリティは色数 (0 か ら colors - 1) と色を記述する 3 つのパラメータをとります。この 3 つのパラ メータは、デフォルトでは RGB (Red, Green, Blue) 値と解釈されます。 ブー ル 値 ケー パ ビ リ ティ hls があれば、代わりに HLS (Hue, Lightness, Saturation) 指標になります。範囲は端末に依存します。

HP 風の端末では、initp が色ペア値を変更するケーパビリティを与えます。パ ラメータを 7 つとります。色ペア番号 (0 から max_pairs - 1 まで) と 3 つ の数の組が 2 つです。最初の組で背景色を、2 番目の組で前景色を記述 し ま す。 こ れ ら のパラメータは hls に依存して (Red, Green, Blue) か (Hue, Lightness, Saturation) である必要があります。

カラー端末のいくつかでは、色はハイライトと衝突します。この衝 突 を ncv ケー パビリティで登録できます。これは、色が利用可能なときに使うことがで きない属性のビットマスクです。 curses が理解する属性との対応は以下の 通 りです。

例 えば、多くの IBM PC コンソールで、下線の属性は前景色、青と衝突してし まい、カラーモードでは利用できません。これは、ncv ケーパビリティに 2 を 指定すべきです。

SVr4 curses は ncv では何もしませんが、 ncurses はそれを認識してカラー 用に出力を最適化します。

その他

ヌル (0) 文字以外のパディング文字を必要とする端末の場合、それを pad で 指 定 することができます。 pad 文字列の最初の文字のみが使用されます。パ ディング文字を持たない端末の場合、npc を指定してください。 ncurses は termcap 互換の PC 変数を実装していることに注意してください。アプリケー ションはこの値をナル以外のものに設定するかもしれませんが、 ncurses は最 初に npc をテストし、端末にパディング文字がなければ napms を使います。

端末が半行だけ上下移動できる場合、それを hu (半行上へ) と hd (半行下へ) とで指定できます。これは、主として、ハードコピー端末の上付き文字、下 付 き 文字のために役に立ちます。ハードコピー端末が用紙を排出し次のページに 行くこと (フォームフィード) ができる場合、それを ff (通常は control L) で指定します。

(同じ文字を極めて多数回繰り返し送信する際の時間節約のため) 指定した文字 を指定した回数だけ繰り返すコマンドが存在する場合、パラメータ化 文 字 列 rep を用いてそれを指定することができます。 1 番目のパラメータは繰り返さ れる文字で、2 番目のパ ラ メー タ は 繰 り 返 し 回 数 で す。 で す か ら、tparm(repeat_char, ’x’, 10) は ‘xxxxxxxxxx’ と同じことです。

TEKTRONIX 4025 のように、コマンド文字を設定可能な端末の場合、 cmdch を 用いてそれを表すことができます。すべてのケーパビリティで使用されるプ ロ トタイプコマンド文字を指定できます。この文字は cmdch ケーパビリティで指 定され、それが識別されます。いくつかの UNIX システムでは以下の約束に し た がって処理がなされます。すなわち、まず環境変数 CC を検査し、それが設 定されている場合は、ケーパビリティ中にあるプロトタイプ文字のすべてが そ の環境変数で指定された文字と置き換えられます。

switch, dialup, patch, network などのような、特定の端末の種類を表さない 端末記述には、プログラムがその端末とどう通信すればよいかが分からない と 表明できるようにするため、 gn (一般的) ケーパビリティを指定すべきです。 (このケーパビリティは、エスケープシーケンスがわかっている 仮想端末の 記 述には適用されません。)

端末が、シフトキーとして動作し、文字すべての 8 ビット目を立てて送出する 「メタキー」を持つ場合、このことを km により表すことができます。この 指 定 がない場合、ソフトウェアは、8 ビット目はパリティで、通常はクリアされ ていると想定します。この「メタモード」をオンオフする文字列が存在する 場 合、それを smmrmm とで指定できます。

端末が画面 1 枚分より多い行数のメモリを持つ場合、メモリの行数を lm で指 定できます。値 lm#0 は、行数は固定でないものの、1 画面分以上のメモリ を 持つことを表します。

端 末が UNIX の仮想端末プロトコルをサポートしている場合、その端末番号を vt で指定できます。

端末に接続された外部プリンタを制御するメディアコピー文字列は、次のよ う に 指 定 できます。すなわち、 mc0: 画面内容の印字、 mc4: プリンタオフ、 mc5: プリンタオンです。プリンタがオンのとき、端末に送出されたテキストは す べてプリンタに送られます。プリンタがオンの状態でもなお端末にテキスト が表示されるか否かは未定義です。変種である mc5p はパラメータを 1 つ 取 り、 そのパラメータの値だけの文字を送る間プリンタをオンにし続け、そのあ とオフにします。このパラメータは 255 を越えてはなりません。 mc4 を含 む すべてのテキストは、 mc5p が有効な間、透過的にプリンタに渡されます。

ゴミ機能、困った機能 (Glitches and Braindamage)

Hazeltine 端末は ‘~’ 文字を表示できません。これには hz を指定すべきで す。

Concept や vt100 のように am 直後の改行文字を無視する端末の場合、 xenl を指定すべきです。

強 調 表示を取り除くために (単に通常のテキストを上に書くだけでは済まず) el が必要な場合、 xhp を指定すべきです。

Teleray 端末は、タブでカーソル移動した下にあった文字をすべて空白にし て し まうので、この端末では xt (破壊的なタブ) を指定すべきです。注 : これ に対応する変数は、現在は ‘dest_tabs_magic_smso’ ですが、以前のバー ジョ ン では、teleray_glitch でした。このふざけた機能は、‘‘magic cookie’’(魔 法のクッキー) の先頭にカーソルを置けないことと、強調モードを消去する た めに、行削除と行挿入が必要であることも意味します。 ncurses の実装はこの glitch を無視します。

Beehive の Superbee 端末は、エスケープ文字や control C 文字を正しく送信 で き ません。これには xsb を指定し、f1 キーをエスケープとし、f2 キーを control C として使用することを表します。 (この問題が現れるのは 特 定 の Superbee に限られ、その ROM に依存します。) terminfo の古いバージョンで は、このケーパビリティは ‘beehive_glitch’ と呼ばれていましたが、現在 で は ‘no_esc_ctl_c’ と呼ばれていることに注意してください。

なにか特定の端末に固有の他の問題を解決したい場合、xx の形式で新しいケー パビリティを追加して使っても構いません。

よく似た端末

2 つの非常によく似た端末がある場合、いくつかの例外を除いて一方 (変型種) は 他方 (基本種) と似ているという定義を行うことができます。変型種の定義 においては、文字列ケーパビリティ use で、基本種の端末の名前を指定できま す。 use の指定より前に与えたケーパビリティは、 use により得られる基本 タイプの中のケーパビリティに優先します。複数の use ケーパビリティが存在 する場合、逆の順番でマージされます。すなわち、一番右側の use の参照先が 最初に処理され、次にその左が処理されるといった順番になります。エント リ 中で明示的に指定されたケーパビリティは、 use の参照先が与えるケーパビリ ティに優先します。

ケーパビリティ定義の左側に xx@ を置くことにより、そのケーパビリ ティ を キャ ンセルできます。ここで xx はそのケーパビリティです。例えば、エント リ

2621-nl, smkx@, rmkx@, use=2621,

smkxrmkx も持たない 2621-nl を定義します。それゆえ、この端末はビ ジュ アルモードではファンクションキーラベルをオンにしません。この機能は ある端末の種々の機能や、ユーザの種々の設定を表す際に有用です。

長いエントリの落とし穴

長い terminfo のエントリは問題になりそうにありません。現在まで terminfo の 文 字 列 表 の 最 大値 4K に達したエントリはないのです。不幸なことに termcap への翻訳はずっと厳しく制限されている (1K ま で) の で、 長 い terminfo エントリの termcap への翻訳は問題を引き起こすかも知れません。

4.3BSD お よ び、 よ り 古いバージョンの tgetent() のマニュアルには、 termcap エントリ用に 1K のバッファを割り当てるように書いてあります。 エ ントリは termcap ライブラリによりヌル文字で終了させられるので、 termcap エントリとして安全な最大の長さは 1k-1 (1023) バイトです。アプリケーショ ンと使用する termcap ライブラリが何をするか、また、tgetent() が探してい るタイプの端末が termcap ファイルのどこにあるかによって、悪いことがいく つか起こるかも知れません。

termcap ライブラリの中には、1023 バイトより長いエントリを見つけると警告 のメッセージを表示したり、終了したりするものもありますし、そうでない も の もあります。そうでないものはエントリを切捨てて 1023 バイトにしてしま います。アプリケーションプログラムの中には termcap エントリに推奨された 1K より多く割り当てるものもありますし、そうでないものもあります。

各 termcap エントリにはそれに関係する重要な大きさが 2 つあります。 "tc" 展開前と "tc" 展開後です。"tc" は、現在のエントリの最後に他 の termcap エ ン ト リ を 付 け 足し、そのケーパビリティを追加するケーパビリティで す。termcap エントリが "tc" ケーパビリティを使わないならば、もちろん 2 つの長さは同じです。

特殊な端末のユーザ以外にも影響するので、「tc 展開前」の長さは最も重要な ものです。これは /etc/termcap にあるエントリからバックスラッシュと改 行 の組を引いたものの長さです。バックスラッシュと改行の組は tgetent() が読 み込む間に取り除きます。 termcap ライブラリの中には最後の改行を取り除く ものもあります (GNU termcap は行いません)。次のように仮定します。

*

展開前の termcap エントリは 1023 バイト以上の長さです。

*

アプリケーションは 1k のバッファを割り当てただけです。

*

(BSD/OS 1.1 や GNU のもののように) termcap ライブラリは、それ が必要なエントリであれば、その長さに関わらず、読むためにエント リ をすべてバッファに読み込みます。

*

tgetent() は長いエントリの端末タイプか、長いエントリの後に termcap ファイルに現れる端末タイプか、ファイルには全く現れない ( そ の ため tgetent() は termcap ファイル全体を探す必要があります) 端末タイプを探しています。

すると、tgetent() はメモリ、おそらくはスタックに重ね書きし、たぶんプ ロ グラムをコアダンプさせるでしょう。telnet のようなプログラムは特に弱いで す。現代的な telnet は端末タイプのような値を自動的に通してしまいま す。 SunOS 4.1.3 や Ultrix 4.4 のように、過度に長い termcap エントリを読んだ ときには警告メッセージを表示する termcap ライブラリでも、結果は望ましい ものではありません。OSF/1 3.0 のように termcap ライブラリが長いエントリ を切り捨てるなら、ここで死ぬことはありませんが、端末に対して不 正 確 な データを返すことになるでしょう。

「tc 展開後」の長さは上と同じように影響するでしょうが、影響を受けるのは TERM をその端末タイプに実際に設定した人だけです。 tgetent() は探して い る 時ではなく、探していた端末タイプを見つけた時に一度だけ "tc" 展開を行 うからです。

結局、1023 バイトより長い termcap エントリ は、termcap ライブラリとアプ リ ケーションのさまざまな組合せで、コアダンプや警告や不正確な操作を引き 起こすかもしれません。"tc" 展開前でも長過ぎるなら、他の端末タイプのユー ザや termcap エントリのない TERM 変数を指定しているユーザにも影響するで しょう。

-C (termcap へ翻訳) モードでは、tic(1) の ncurses の実装 は tc 前 の termcap へ 翻 訳する長さが長過ぎる場合、警告メッセージを出します。 -c (check) オプションは、分析された (tc 展開後の) 長さもチェックします。

バイナリ互換性

商用の UNIX の間のバイナリの terminfo エントリの移植性に期待するのは 賢 明 ではありません。問題は terminfo に (HP-UX と AIX で) 少なくとも 2 つ のバージョンがあるからです。どちらも SVr1 の後で System V の terminfo か ら分岐したもので、文字列表に System V や XSI Curses 拡張と (バイナリ フォーマットで) 衝突する拡張ケーパビリティを追加しています。

拡張

SVr4 の curses の実装のいくつかと SVr4 以前のものすべてはパラメータ文字 列内の %A 演算子と %O 演算子を解釈しません。

SVr4/XPG4 は、別の文字セットモードで msgr がカーソルの移動を許可するか どうかを指定しません (そのようなモードは、数ある中でも CR と NL を局 所 的 な移動を引き起こさない文字に写してしまうかも知れません)。 ncurses の 実装は ALTCHARSET モードでは msgr を無視します。このため、反対の解釈 を す る XPG4 の実装では、ncurses 用に作られた terminfo エントリの msgr を オフにする必要があるかも知れません。

ncurses ライブラリは、更新の効率を上げるために少し非標準的な方法で文 字 挿入と文字挿入モードを扱います。上記の 文字の挿入/削除 の副節を参照して ください。

set_clockdisplay_clock のパラメータ置換は SVr4 でも XSI Curses 規格 でも説明されていません。AT&T 505 端末の説明書から推測したものです。

kmous ケー パ ビ リ ティ の 割 り当てには注意してください。ncursesKEY_MOUSE として解釈しようとし、xterm のようなキーボード入力ストリー ム 中 で マ ウストラック情報を返すことのできる端末やエミュレータが使用しま す。

異なる商用の terminfo と curses はそれぞれ異なる XSI Curses 標準の一 部 と (いくつかの場合) 異なった拡張をサポートします。以下は 1995 年 10 月 時点での正確な要約です。

SVR4, Solaris, ncurses -- SVr4 ケーパビリティをすべてサポートします。

SGI -- SVr4 すべてと説明のない拡張文字列ケーパビリティ 1 つ (set_pglen) をサポートします。

SVr1, Ultrix -- terminfo ケーパビリティの制限された一部をサポートしま す。ブール値は xon_xoff で、数値は width_status_line で、 文 字 列 は prtr_non で終わりです。

HP/UX -- SVr1 の 一 部と、SVr[234] の数値 num_labels, label_height, label_width と、ファンクションキー 11 から 63 ま で と、 plab_norm, label_on, label_off と、文字列表の非互換な拡張をいくつかサポートしま す。

AIX -- SVr1 の一部と、ファンクションキー 11 から 63 までと、たくさん の 非互換な文字列表拡張をサポートします。

OSF -- SVr4 全部と AIX 拡張の両方をサポートします。

関連ファイル

/usr/share/misc/terminfo/?/*

端末記述を含むファイル

関連項目

tic(1M), curses(3X), printf(3S), term(5).

作者

Zeyd M. Ben-Halim, Eric S. Raymond, Thomas E. Dickey. Pavel Curtis に よる pcurses に基づいています。

スポンサーリンク