TERMINFO

Section: File Formats (5)
Updated:
索引 jman
 

索引

名称

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

索引

書式

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

索引

解説

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

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

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

接尾辞意味
-nn画面の行数aaa-60
-np画面記憶ページ数c100-4p
-am自動マージン付 (通常これがデフォルト)vt100-am
-m白黒モード; 色を抑制 ansi-m
-mc魔法のクッキー; ハイライトのときの空白wy30-mc
-na矢印キー無し (局所的にとどめる) c100-na
-nam自動マージン無し vt100-nam
-nlステータス行無し att4415-nl
-nsステータス行無し hp2626-ns
-rv反転表示 c100-rv
-sステータス行有り vt100-s
-vbビープの代わりに可視ベルを使用 wy370-vb
-w幅広モード (> 80 桁、通常 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 番目のパラメータを表します。

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

variablecap-TCap説明
ブール値nameCode
auto_left_marginbwbw cub1 は桁 0 から最後の桁に回り込む
auto_right_marginamam 自動マージン機能を持つ
back_color_erasebceut 画面を背景色で消去する
can_changeccccc 既存の色を再定義可能
ceol_standout_glitchxhpxs 強調出力は上書きで消去されない (hp)
col_addr_glitchxhpaYA hpa/mhpa では正方向のみ移動可能
cpi_changes_rescpixYF 文字ピッチを変えると解像度が変わる
cr_cancels_micro_modecrxmYB cr を使用するとマイクロモードがオフになる
dest_tabs_magic_smsoxtxt タブは破壊的、強調文字の動作が奇妙 (t1061)
eat_newline_glitchxenlxn 80 桁より後の改行は無視される (concept)
erase_overstrikeeoeo 空白の重ね打ちで消去可能
generic_typegngn 一般的な回線タイプ
hard_copyhchc ハードコピー端末
hard_cursorchtsHC カーソルが見にくい
has_meta_keykmkm メタキーを持つ (押すと第 8 ビットがセットされる)
has_print_wheeldaisyYC 文字セットを変更するのに人手が必要なプリンタ
has_status_linehshs 特別なステータス行を持つ
hue_lightness_saturationhlshl 端末は HLS 色表記のみ使用 (Tektronix)
insert_null_glitchinin 挿入モードでヌル文字を区別する
lpi_changes_reslpixYG 行ピッチを変えると解像度が変わる
memory_abovedada 画面より上の描画が保持される
memory_belowdbdb 画面より下の描画が保持される
move_insert_modemirmi 挿入モードで安全にカーソル移動可能
move_standout_modemsgrms 強調モードで安全にカーソル移動可能
needs_xon_xoffnxonnx パディング機能が働かない。xon/xoff 制御が必要
no_esc_ctlcxsbxb beehive 端末 (f1=escape, f2=ctrl C)
no_pad_charnpcNP パディング文字が存在しない
non_dest_scroll_regionndscrND スクロール領域が非破壊的
non_rev_rmcupnrrmcNR smcup は rmcup の動作を反転しない
over_strikeosos 端末は重ね打ち可能
prtr_silentmc5i5i プリンタ出力は画面にエコーしない
row_addr_glitchxvpaYD vpa/mvpa では正方向にのみ移動可能
semi_auto_right_marginsamYE 最終桁で出力すると cr 動作をする
status_line_esc_okeslokes ステータス行上でエスケープ可能
tilde_glitchhzhz ~ 表示不可 (hazeltine 端末)
transparent_underlineulul 下線付文字は上書きする
xon_xoffxonxo 端末は xon/xoff ハンドシェークを行う

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

variablecap-TCap説明
数値 nameCode
columnscolsco 1 行の桁数
init_tabsitit タブの初期設定は # 個の空白毎
label_heightlhlh ラベル 1 つの行数
label_widthlwlw ラベル 1 つの桁数
lineslinesli 画面またはページの行数
lines_of_memorylmlm lines の値以上の場合メモリの行数。0 は行数が可変であることを表す
magic_cookie_glitchxmcsg smso や rmso で画面に残る空白数
max_attributesmama 端末が組み合わせて処理できる属性数の最大値
max_colorscolorsCo 画面上の最大色数
max_pairspairspa 画面上の色ペアの最大値
maximum_windowswnumMW 定義可能なウィンドウ数の最大値
no_color_videoncvNC 色付きでは使用できないビデオ属性
num_labelsnlabNl 画面上のラベル数
padding_baud_ratepbpb パディングが必要な最低ボーレート
virtual_terminalvtvt 仮想画面番号 (CB/unix)
width_status_linewslws ステータス行の桁数

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

variablecap-TCap説明
数値 nameCode
bit_image_entwiningbitwinYo 各ビットイメージ行に対するパスの数
bit_image_typebitypeYp ビットイメージデバイスのタイプ
buffer_capacitybufszYa 印字前にバッファリング可能なバイト数
buttonsbtnsBT マウスのボタン数
dot_horz_spacingspinhYc 1 インチあたりのドット数での水平方向のドット間隔
dot_vert_spacingspinvYb 1 インチあたりのピン数での垂直方向のピン間隔
max_micro_addressmaddrYd micro_..._address での最大値
max_micro_jumpmjumpYe parm_..._micro での最大値
micro_col_sizemcsYf マイクロモードでの文字ステップサイズ
micro_line_sizemlsYg マイクロモードでの行ステップサイズ
number_of_pinsnpinsYh プリントヘッドのピン数
output_res_charorcYi 1 行あたりのユニット数での水平解像度
output_res_horz_inchorhiYk 1 インチあたりのユニット数での水平解像度
output_res_lineorlYj 1 行あたりのユニット数での垂直解像度
output_res_vert_inchorviYl 1 インチあたりのユニット数での垂直解像度
print_ratecpsYm 1 秒あたりの文字数での印字速度
wide_char_sizewidcsYn 倍幅モードでの文字ステップサイズ

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

variablecap-TCap説明
文字列nameCode
acs_charsacscac 図形文字セットの組、vt100 に基づく
back_tabcbtbt 後退タブ (P)
bellbelbl 可聴シグナル (ベル) (P)
carriage_returncrcr 復帰文字 (P*) (P*)
change_char_pitchcpiZA 1 インチあたりの文字数を # 1 に変更
change_line_pitchlpiZB 1 インチあたりの行数を #1 に変更
change_res_horzchrZC 水平解像度を #1 に変更
change_res_vertcvrZD 垂直解像度を #1 に変更
change_scroll_regioncsrcs 領域を行 #1 から行 #2 までに変更 (P)
char_paddingrmprP ip と同様だが挿入モード以外で使用
clear_all_tabstbcct タブ設定をすべてクリア (P)
clear_marginsmgcMC 左右のソフトマージンをクリア
clear_screenclearcl 画面をクリアし、カーソルをホームに移動 (P*)
clr_bolel1cb 行先頭までクリア
clr_eolelce 行末までクリア (P)
clr_eosedcd 画面末までクリア (P*)
column_addresshpach 水平絶対位置 #1 (P)
command_charactercmdchCC 端末がプロトタイプで設定可能なコマンド文字 !?
create_windowcwinCW ウィンドウ #1 を #2,#3 から #4,#5 までと定義
cursor_addresscupcm 行 #1 桁 #2 に移動
cursor_downcud1do 1 行下に移動
cursor_homehomeho カーソルをホームに移動 (cup がない場合)
cursor_invisiblecivisvi カーソルを見えなくする
cursor_leftcub1le カーソルを 1 空白分左に移動
cursor_mem_addressmrcupCM メモリ相対のカーソル位置指定であり、行 #1 列 #2 へ移動
cursor_normalcnormve カーソルを通常表示にする (civis/cvvis を元に戻す)
cursor_rightcuf1nd 非破壊空白 (1 空白分右に移動)
cursor_to_llllll 最終行の最初の桁 (cup がない場合)
cursor_upcuu1up 1 行上へ
cursor_visiblecvvisvs カーソルをより見えるようにする
define_chardefcZE 文字 #1 を幅 #2 ドット、ディセンダ #3 で定義する
delete_characterdch1dc 文字を削除 (P*)
delete_linedl1dl 行を削除 (P*)
dial_phonedialDI 番号 #1 にダイアルする
dis_status_linedslds ステータス行を無効にする
display_clockdclkDK 時計を表示する
down_half_linehdhd 半行下へ
ena_acsenacseA 別の文字セットを有効にする
enter_alt_charset_modesmacsas 別の文字セットを開始 (P)
enter_am_modesmamSA 自動マージンオン
enter_blink_modeblinkmb 点滅モードオン
enter_bold_modeboldmd 太字 (更に明るい) モードオン
enter_ca_modesmcupti cup を用いたプログラムを開始する文字列
enter_delete_modesmdcdm 削除モード開始
enter_dim_modedimmh 半輝度モード開始
enter_doublewide_modeswidmZF 倍幅モード開始
enter_draft_qualitysdrfqZG ドラフト印字モード開始
enter_insert_modesmirim 挿入モード開始
enter_italics_modesitmZH 斜体モード開始
enter_leftward_modeslmZI 左向き移動モード開始
enter_micro_modesmicmZJ マイクロ移動モード開始
enter_near_letter_qualitysnlqZK NLQ 印字モード開始
enter_normal_qualitysnrmqZL 通常品質印字モード開始
enter_protected_modeprotmp 保護モードオン
enter_reverse_moderevmr 反転表示モードオン
enter_secure_modeinvismk ブランクモードオン (文字が見えない)
enter_shadow_modesshmZM シャドウプリントモード開始
enter_standout_modesmsoso 強調モード開始
enter_subscript_modessubmZN 下付き文字モード開始
enter_superscript_modessupmZO 上付き文字モード開始
enter_underline_modesmulus 下線モード開始
enter_upward_modesumZP 上向き移動モード開始
enter_xon_modesmxonSX xon/xoff ハンドシェークオン
erase_charsechec #1 個の文字を消去 (P)
exit_alt_charset_modermacsae 別の文字セット終了 (P)
exit_am_modermamRA 自動マージンオフ
exit_attribute_modesgr0me 全属性オフ
exit_ca_modermcupte cup を用いたプログラムを終了する文字列
exit_delete_modermdced 削除モード終了
exit_doublewide_moderwidmZQ 倍幅モード終了
exit_insert_modermirei 挿入モード終了
exit_italics_moderitmZR 斜体モード終了
exit_leftward_moderlmZS 左向き移動モード終了
exit_micro_modermicmZT マイクロ移動モード終了
exit_shadow_modershmZU シャドウプリントモード終了
exit_standout_modermsose 強調モード終了
exit_subscript_modersubmZV 下付き文字モード終了
exit_superscript_modersupmZW 上付き文字モード終了
exit_underline_modermulue 下線モード終了
exit_upward_moderumZX
 逆向き移動モード終了
exit_xon_modermxonRX xon/xoff ハンドシェークオフ
fixed_pausepausePA 2-3 秒待つ
flash_hookhookfh スイッチフックをフラッシュ
flash_screenflashvb 可視ベル (カーソルは移動しない)
form_feedffff ハードコピー端末でのページ排出 (P*)
from_status_linefslfs ステータス行からの復帰
goto_windowwingoWG ウィンドウ #1 に移動
hanguphupHU 電話を切る
init_1stringis1i1 初期化文字列
init_2stringis2is 初期化文字列
init_3stringis3i3 初期化文字列
init_fileifif 初期化ファイルの名前
init_progiprogiP 初期化プログラムのパス名
initialize_colorinitcIc 色 #1 を (#2,#3,#4) に初期化
initialize_pairinitpIp 色ペア #1 を fg=(#2,#3,#4), bg=(#5,#6,#7) に初期化
insert_characterich1ic 文字の挿入 (P)
insert_lineil1al 行の挿入 (P*)
insert_paddingipip 文字挿入の後にパディングを挿入
key_a1ka1K1 キーパッドの左上キー
key_a3ka3K3 キーパッドの右上キー
key_b2kb2K2 キーパッドの中央キー
key_backspacekbskb backspace キー
key_begkbeg@1 begin キー
key_btabkcbtkB back-tab キー
key_c1kc1K4 キーパッドの左下キー
key_c3kc3K5 キーパッドの右下キー
key_cancelkcan@2 cancel キー
key_catabktbcka clear-all-tabs キー
key_clearkclrkC clear-screen キー、または erase キー
key_closekclo@3 close キー
key_commandkcmd@4 command キー
key_copykcpy@5 copy キー
key_createkcrt@6 create キー
key_ctabkctabkt clear-tab キー
key_dckdch1kD delete-character キー
key_dlkdl1kL delete-line キー
key_downkcud1kd down-arrow キー
key_eickrmirkM 挿入モードで rmir や smir が送出するデータ
key_endkend@7 end キー
key_enterkent@8 enter/send キー
key_eolkelkE clear-to-end-of-line キー
key_eoskedkS clear-to-end-of-screen キー
key_exitkext@9 exit キー
key_f0kf0k0 F0 ファンクションキー
key_f1kf1k1 F1 ファンクションキー
key_f10kf10k; F10 ファンクションキー
key_f11kf11F1 F11 ファンクションキー
key_f12kf12F2 F12 ファンクションキー
key_f13kf13F3 F13 ファンクションキー
key_f14kf14F4 F14 ファンクションキー
key_f15kf15F5 F15 ファンクションキー
key_f16kf16F6 F16 ファンクションキー
key_f17kf17F7 F17 ファンクションキー
key_f18kf18F8 F18 ファンクションキー
key_f19kf19F9 F19 ファンクションキー
key_f2kf2k2 F2 ファンクションキー
key_f20kf20FA F20 ファンクションキー
key_f21kf21FB F21 ファンクションキー
key_f22kf22FC F22 ファンクションキー
key_f23kf23FD F23 ファンクションキー
key_f24kf24FE F24 ファンクションキー
key_f25kf25FF F25 ファンクションキー
key_f26kf26FG F26 ファンクションキー
key_f27kf27FH F27 ファンクションキー
key_f28kf28FI F28 ファンクションキー
key_f29kf29FJ F29 ファンクションキー
key_f3kf3k3 F3 ファンクションキー
key_f30kf30FK F30 ファンクションキー
key_f31kf31FL F31 ファンクションキー
key_f32kf32FM F32 ファンクションキー
key_f33kf33FN F33 ファンクションキー
key_f34kf34FO F34 ファンクションキー
key_f35kf35FP F35 ファンクションキー
key_f36kf36FQ F36 ファンクションキー
key_f37kf37FR F37 ファンクションキー
key_f38kf38FS F38 ファンクションキー
key_f39kf39FT F39 ファンクションキー
key_f4kf4k4 F4 ファンクションキー
key_f40kf40FU F40 ファンクションキー
key_f41kf41FV F41 ファンクションキー
key_f42kf42FW F42 ファンクションキー
key_f43kf43FX F43 ファンクションキー
key_f44kf44FY F44 ファンクションキー
key_f45kf45FZ F45 ファンクションキー
key_f46kf46Fa F46 ファンクションキー
key_f47kf47Fb F47 ファンクションキー
key_f48kf48Fc F48 ファンクションキー
key_f49kf49Fd F49 ファンクションキー
key_f5kf5k5 F5 ファンクションキー
key_f50kf50Fe F50 ファンクションキー
key_f51kf51Ff F51 ファンクションキー
key_f52kf52Fg F52 ファンクションキー
key_f53kf53Fh F53 ファンクションキー
key_f54kf54Fi F54 ファンクションキー
key_f55kf55Fj F55 ファンクションキー
key_f56kf56Fk F56 ファンクションキー
key_f57kf57Fl F57 ファンクションキー
key_f58kf58Fm F58 ファンクションキー
key_f59kf59Fn F59 ファンクションキー
key_f6kf6k6 F6 ファンクションキー
key_f60kf60Fo F60 ファンクションキー
key_f61kf61Fp F61 ファンクションキー
key_f62kf62Fq F62 ファンクションキー
key_f63kf63Fr F63 ファンクションキー
key_f7kf7k7 F7 ファンクションキー
key_f8kf8k8 F8 ファンクションキー
key_f9kf9k9 F9 ファンクションキー
key_findkfnd@0 find キー
key_helpkhlp%1 help キー
key_homekhomekh home キー
key_ickich1kI insert-character キー
key_ilkil1kA insert-line キー
key_leftkcub1kl left-arrow キー
key_llkllkH lower-left キー (home down)
key_markkmrk%2 mark キー
key_messagekmsg%3 message キー
key_movekmov%4 move キー
key_nextknxt%5 next キー
key_npageknpkN next-page キー
key_openkopn%6 open キー
key_optionskopt%7 options キー
key_ppagekppkP previous-page キー
key_previouskprv%8 previous キー
key_printkprt%9 print キー
key_redokrdo%0 redo キー
key_referencekref&1 reference キー
key_refreshkrfr&2 refresh キー
key_replacekrpl&3 replace キー
key_restartkrst&4 restart キー
key_resumekres&5 resume キー
key_rightkcuf1kr right-arrow キー
key_saveksav&6 save キー
key_sbegkBEG&9 シフト状態の begin キー
key_scancelkCAN&0 シフト状態の cancel キー
key_scommandkCMD*1 シフト状態の command キー
key_scopykCPY*2 シフト状態の copy キー
key_screatekCRT*3 シフト状態の create キー
key_sdckDC*4 シフト状態の delete-character キー
key_sdlkDL*5 シフト状態の delete-line キー
key_selectkslt*6 select キー
key_sendkEND*7 シフト状態の end キー
key_seolkEOL*8 シフト状態の clear-to-end-of-line キー
key_sexitkEXT*9 シフト状態の exit キー
key_sfkindkF scroll-forward キー
key_sfindkFND*0 シフト状態の find キー
key_shelpkHLP#1 シフト状態の help キー
key_shomekHOM#2 シフト状態の home キー
key_sickIC#3 シフト状態の insert-character キー
key_sleftkLFT#4 シフト状態の left-arrow キー
key_smessagekMSG%a シフト状態の message キー
key_smovekMOV%b シフト状態の move キー
key_snextkNXT%c シフト状態の next キー
key_soptionskOPT%d シフト状態の options キー
key_spreviouskPRV%e シフト状態の previous キー
key_sprintkPRT%f シフト状態の print キー
key_srkrikR scroll-backward キー
key_sredokRDO%g シフト状態の redo キー
key_sreplacekRPL%h シフト状態の replace キー
key_srightkRIT%i シフト状態の right-arrow キー
key_srsumekRES%j シフト状態の resume キー
key_ssavekSAV!1 シフト状態の save キー
key_ssuspendkSPD!2 シフト状態の suspend キー
key_stabkhtskT set-tab キー
key_sundokUND!3 シフト状態の undo キー
key_suspendkspd&7 suspend キー
key_undokund&8 undo キー
key_upkcuu1ku up-arrow キー
keypad_localrmkxke 'keyboard_transmit' モードから抜ける
keypad_xmitsmkxks 'keyboard_transmit' モードに入る
lab_f0lf0l0 f0 でない場合、ファンクションキー f0 のラベル
lab_f1lf1l1 f1 でない場合、ファンクションキー f1 のラベル
lab_f10lf10la f10 でない場合、ファンクションキー f10 のラベル
lab_f2lf2l2 f2 でない場合、ファンクションキー f2 のラベル
lab_f3lf3l3 f3 でない場合、ファンクションキー f3 のラベル
lab_f4lf4l4 f4 でない場合、ファンクションキー f4 のラベル
lab_f5lf5l5 f5 でない場合、ファンクションキー f5 のラベル
lab_f6lf6l6 f6 でない場合、ファンクションキー f6 のラベル
lab_f7lf7l7 f7 でない場合、ファンクションキー f7 のラベル
lab_f8lf8l8 f8 でない場合、ファンクションキー f8 のラベル
lab_f9lf9l9 f9 でない場合、ファンクションキー f9 のラベル
label_formatflnLf ラベルフォーマット
label_offrmlnLF ソフトラベルオフ
label_onsmlnLO ソフトラベルオン
meta_offrmmmo メタモードオフ
meta_onsmmmm メタモードオン (8 番目のビットオン)
micro_column_addressmhpaZY マイクロモードの column_address
micro_downmcud1ZZ マイクロモードの cursor_down
micro_leftmcub1Za マイクロモードの cursor_left
micro_rightmcuf1Zb マイクロモードの cursor_right
micro_row_addressmvpaZc マイクロモードの row_address #1
micro_upmcuu1Zd マイクロモードの cursor_up
newlinenelnw 改行 (cr の後に lf が来る)
order_of_pinsporderZe ソフトウェアビットを印字ヘッドピンに一致させる
orig_colorsococ すべての色ペアを本来のものにする
orig_pairopop デフォルトのペアを本来の値にする
pad_charpadpc パディング文字 (ヌル以外)
parm_dchdchDC #1 文字を削除 (P*)
parm_delete_linedlDL #1 行を削除 (P*)
parm_down_cursorcudDO #1 行下へ (P*)
parm_down_micromcudZf マイクロモードの parm_down_cursor
parm_ichichIC #1 文字を挿入 (P*)
parm_indexindnSF #1 行の前進スクロール (P)
parm_insert_lineilAL #1 行を挿入 (P*)
parm_left_cursorcubLE 左へ #1 文字分移動 (P)
parm_left_micromcubZg マイクロモードの parm_left_cursor
parm_right_cursorcufRI 右へ #1 文字分移動 (P*)
parm_right_micromcufZh マイクロモードの parm_right_cursor
parm_rindexrinSR #1 行の後退スクロール (P)
parm_up_cursorcuuUP #1 行上へ (P*)
parm_up_micromcuuZi マイクロモードの parm_up_cursor
pkey_keypfkeypk ファンクションキー #1 の打鍵文字列を #2 にする
pkey_localpflocpl ファンクションキー #1 の実行文字列を #2 にする
pkey_xmitpfxpx ファンクションキー #1 の送信文字列を #2 にする
plab_normplnpn ラベル #1 に文字列 #2 を表示
print_screenmc0ps 画面の内容を印字する
prtr_nonmc5ppO #1 バイトだけプリンタをオンにする
prtr_offmc4pf プリンタをオフにする
prtr_onmc5po プリンタをオンにする
pulsepulsePU パルスダイアルを選択
quick_dialqdialQD 確認なしで電話番号 #1 にダイアルする
remove_clockrmclkRC 時計を削除
repeat_charreprp 文字 #1 を #2 回繰り返す (P*)
req_for_inputrfiRF (pty 用に) 次の入力文字を送る
reset_1stringrs1r1 リセット文字列
reset_2stringrs2r2 リセット文字列
reset_3stringrs3r3 リセット文字列
reset_filerfrf リセットファイルの名前
restore_cursorrcrc 最後の save_cursor の位置にカーソルを戻す
row_addressvpacv 垂直絶対位置 #1 (P)
save_cursorscsc 現在のカーソル位置を保存 (P)
scroll_forwardindsf テキストを上にスクロール (P)
scroll_reverserisr テキストを下にスクロール (P)
select_char_setscsZj 文字セット #1 の選択
set_attributessgrsa ビデオ属性を #1-#9 に定義 (PG9)
set_backgroundsetbSb 背景色を #1 に設定
set_bottom_marginsmgbZk 下マージンを現在行に設定
set_bottom_margin_parmsmgbpZl 下マージンを #1 行目か (smgtp が与えられていなければ) 下から #2 行目にする
set_clocksclkSC 時計を #1 時 #2 分 #3 秒に設定
set_color_pairscpsp 現在の色ペアを #1 に設定
set_foregroundsetfSf 前景色を #1 に設定
set_left_marginsmglML 左ソフトマージンを現在桁に設定 smgl を参照 (ML は BSD の termcap とは違います)
set_left_margin_parmsmglpZm 左 (右) マージンを桁 #1 に設定
set_right_marginsmgrMR 右ソフトマージンを現在桁に設定
set_right_margin_parmsmgrpZn 右マージンを桁 #1 に設定
set_tabhtsst 全行のタブを現在の桁に設定
set_top_marginsmgtZo 上マージンを現在行に設定
set_top_margin_parmsmgtpZp 上 (下) マージンを行 #1 に設定
set_windowwindwi 現在のウィンドウを行 #1-#2、桁 #3-#4 とする
start_bit_imagesbimZq ビットイメージグラフィック印字の開始
start_char_set_defscsdZr #2 個の文字からなる文字セット #1 の定義の開始
stop_bit_imagerbimZs ビットイメージグラフィック印字の終了
stop_char_set_defrcsdZt 文字セット #1 の定義の終了
subscript_characterssubcsZu 下付き文字となりうる文字のリスト
superscript_characterssupcsZv 上付き文字となりうる文字のリスト
tabhtta 次の 8 文字分のハードウェアタブストップへのタブ文字
these_cause_crdocrZw これらの文字のうちのいずれかの印字は CR を引き起こす
to_status_linetslts ステータス行の列 #1 に移動
tonetoneTO タッチトーンダイアルを選択
underline_charucuc 文字 1 つに下線を付け、次の文字に移動
up_half_linehuhu 半行上へ
user0u0u0 ユーザ文字列 #0
user1u1u1 ユーザ文字列 #1
user2u2u2 ユーザ文字列 #2
user3u3u3 ユーザ文字列 #3
user4u4u4 ユーザ文字列 #4
user5u5u5 ユーザ文字列 #5
user6u6u6 ユーザ文字列 #6
user7u7u7 ユーザ文字列 #7
user8u8u8 ユーザ文字列 #8
user9u9u9 ユーザ文字列 #9
wait_tonewaitWA ダイアルトーンを待つ
xoff_characterxoffcXF XOFF 文字
xon_characterxoncXN XON 文字
zero_motionzeromZx 次の文字表示を移動無しで行う

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

variablecap-TCap説明
文字列nameCode
alt_scancode_escscesaS8 スキャンコードエミュレーションのための別のエスケープ文字
bit_image_carriage_returnbicrYv 同一行の先頭へ移動
bit_image_newlinebinelZz ビットイメージの次の行に移動
bit_image_repeatbirepXy ビットイメージセル #1 を #2 回繰り返す
char_set_namescsnmZy 文字セットの名のリストから #1 番目の item を生成する
code_set_initcsinci 複数コードセットの初期化シーケンス
color_namescolornmYw 色 #1 に名前を与える
define_bit_image_regiondefbiYx 矩形のビットイメージ領域を定義
device_typedevtdv 言語/コードセットサポートの指定
display_pc_chardispcS1 PC 文字 #1 を表示
end_bit_image_regionendbiYy ビットイメージ領域の終了
enter_pc_charset_modesmpchS2 PC 文字表示モード開始
enter_scancode_modesmscS4 PC スキャンコードモード開始
exit_pc_charset_modermpchS3 PC 文字表示モード終了
exit_scancode_modermscS5 PC スキャンコードモード終了
get_mousegetmGm curses がボタンイベントを取得すべき。パラメータ #1 は文書化されていない
key_mousekmousKm マウスイベントが起きた
mouse_infominfoMi マウス状態の情報
pc_term_optionspctrmS6 PC 端末オプション
pkey_plabpfxlxl ファンクションキー #1 に文字列 #2 を送信させ文字列 #3 を表示させる
req_mouse_posreqmpRQ マウス位置の要求
scancode_escapescescS7 スキャンコードエミュレーションのためのエスケープ
set0_des_seqs0dss0 コードセット 0 にシフト (EUC セット 0、ASCII)
set1_des_seqs1dss1 コードセット 1 にシフト
set2_des_seqs2dss2 コードセット 2 にシフト
set3_des_seqs3dss3 コードセット 3 にシフト
set_a_backgroundsetabAB ANSI エスケープシーケンスを使って背景色を #1 に設定
set_a_foregroundsetafAF ANSI エスケープシーケンスを使って前景色を #1 に設定
set_color_bandsetcolorYz リボンの色を #1 に変更
set_lr_marginsmglrML 左右両マージンを #1、#2 に設定、(ML は BSD の termcap のものと違います)
set_page_lengthslinesYZ ページ長を #1 行に設定
set_tb_marginsmgtbMT 上下両マージンを #1、#2 に設定

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

variablecap-TCap説明
文字列nameCode
enter_horizontal_hl_modeehhlmXh 水平ハイライトモードに入る
enter_left_hl_modeelhlmXl 左ハイライトモードに入る
enter_low_hl_modeelohlmXo 下ハイライトモードに入る
enter_right_hl_modeerhlmXr 右ハイライトモードに入る
enter_top_hl_modeethlmXt 上ハイライトモードに入る
enter_vertical_hl_modeevhlmXv 垂直ハイライトモードに入る
set_a_attributessgr1sA ビデオ属性の 2 番目の組を #1-#6 と定義
set_pglen_inch slengthsL ページ長を 100分の #1 インチに設定

 

エントリの例

以下のエントリは、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 は以下のモードのほとんどをサポートします。

tparm パラメータ属性エスケープシーエンス

noneなし\E[0m

p1強調\E[0;1;7m

p2下線\E[0;4m

p3反転表示\E[0;7m

p4点滅\E[0;5m

p5暗い表示利用できません

p6太字\E[0;1m

p7不可視\E[0;8m

p8保護使われていません

p9別の文字セット^O (オフ) ^N (オン)

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

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

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

シーケンス出力される場合terminfo への翻訳

\E[0常に\E[0

;1p1 または p6 のとき%?%p1%p6%|%t;1%;

;4p2 のとき%?%p2%|%t;4%;

;5p4 のとき%?%p4%|%t;5%;

;7p1 または p3 のとき%?%p1%p3%|%t;7%;

;8p7 のとき%?%p7%|%t;8%;

m常にm

^N または ^Op9 が真なら ^N そうでなければ ^O%?%p9%t^N%e^O%;

これをすべて一緒に 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 [mu] 3 のキー配列を持つ場合、他の 5 つの キーを ka1, ka3, kb2, kc1, kc3. で指定します。 3 [mu] 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 ケーパビリティで設定されます。

GlyphACSAsciiVT100
NameNameDefaultName
UK pound sign ACS_STERLINGf}
arrow pointing downACS_DARROWv.
arrow pointing leftACS_LARROW<,
arrow pointing rightACS_RARROW>+
arrow pointing upACS_UARROW^-
board of squaresACS_BOARD#h
bullet ACS_BULLETo~
checker board (stipple)ACS_CKBOARD:a
degree symbol ACS_DEGREE\f
diamond ACS_DIAMOND+`
greater-than-or-equal-toACS_GEQUAL>z
greek pi ACS_PI*{
horizontal line ACS_HLINE-q
lantern symbol ACS_LANTERN#i
large plus or crossoverACS_PLUS+n
less-than-or-equal-toACS_LEQUAL<y
lower left cornerACS_LLCORNER+m
lower right cornerACS_LRCORNER+j
not-equal ACS_NEQUAL!|
plus/minus ACS_PLMINUS#g
scan line 1 ACS_S1 ~o
scan line 3 ACS_S3 -p
scan line 7 ACS_S7 -r
scan line 9 ACS_S9 _s
solid square blockACS_BLOCK#0
tee pointing downACS_TTEE+w
tee pointing leftACS_RTEE+u
tee pointing rightACS_LTEE+t
tee pointing up ACS_BTEE+v
upper left cornerACS_ULCORNER+l
upper right cornerACS_URCORNER+k
vertical line ACS_VLINE|x

新しいデバイスの図形セットを定義するのに一番よい方法は、この表のその端末用の コピーに列を追加し、対応する図形のところに (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 値は色空間での通常の位置を示しています。

#define RGB
COLOR_BLACK0    0, 0, 0
COLOR_RED 1    max,0,0
COLOR_GREEN2    0,max,0
COLOR_YELLOW3    max,max,0
COLOR_BLUE4    0,0,max
マゼンタCOLOR_MAGENTA5    max,0,max
シアンCOLOR_CYAN6    0,max,max
COLOR_WHITE7    max,max,max

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 が理解する属性との対応は以下の通りです。

属性ビット10 進数
A_STANDOUT01
A_UNDERLINE12
A_REVERSE24
A_BLINK 38
A_DIM 416
A_BOLD 532
A_INVIS 664
A_PROTECT7128
A_ALTCHARSET8256

例えば、多くの 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 に基づいています。


 

索引

Index

名称
書式
解説
ケーパビリティ
エントリの例
ケーパビリティの型
コンパイルされた記述の読み込み
端末記述の準備
基本的なケーパビリティ
パラメータ化された文字列
カーソル移動
領域消去
行の挿入/削除と垂直移動
文字の挿入/削除
ハイライト・下線・可視ベル
キーパッドとファンクションキー
タブと初期化
遅延とパディング
ステータス行
線画
色の扱い
その他
ゴミ機能、困った機能 (Glitches and Braindamage)
よく似た端末
長いエントリの落とし穴
バイナリ互換性
拡張
関連ファイル
関連項目
作者

jman



Time: 07:07:31 GMT, January 12, 2009