% Lisp関数仕様 - terme
nptのドキュメントです。
参照元:ANSI Common Lisp npt
npt-systemパッケージの下記の関数を説明します。
defun terme
terme-enableterme-beginterme-endterme-inputterme-outputterme-moveterme-clearterme-deleteterme-sizeterme-scrollterme-fontterme本関数は、端末の入出力を操作します。
termeを利用するには、コンパイルオプションを指定する必要があります。
利用可能かどうかはコマンドライン引数の--versionで確認できます。
$ npt --version | grep Prompt
Prompt mode terme
関数仕様を下記に示します。
(defun terme (symbol &rest args) ...) -> *
入力: symbol
入力: args, 引数
出力: *, 状態
symbolは次の内容を指定できます。
terme-enableterme-beginterme-endterme-inputterme-outputterme-moveterme-clearterme-deleteterme-sizeterme-scrollterme-font例えば、terme-enableを実行する際は次のようにします。
(terme 'terme-enable)
sysctlとは違い、引数はsymbolをeq判定で行います。
もしnpt-systemパッケージを継承していない場合は、次のように実行してください。
(npt-system:terme 'npt-system:terme-enable)
以降は、継承していることを前提に説明します。
terme: terme-enabletermeモジュールが利用可能かどうかを返却します。
(defun terme (terme-enable) ...) -> boolean
返却がtの場合は、terme機能を利用できます。
返却がnilの場合は、terme機能は利用できません。
実行例を示します。
(terme 'terme-enable)
terme: terme-begintermeの操作を開始します。
(defun terme (terme-begin &optional mode) ...) -> paper
内部の動作は、端末をraw modeに設定しています。
raw modeは、下記の点において通常のモードと違っています。
返却値paperは、変更前の端末情報を保有したPaperオブジェクトです。
terme-endの引数に渡すことで、端末の状態をもとに戻すことができます。
終了する前は、必ずterme-endを実行してください。
引数modeは、nilか:defaultを指定できます。
省略時はnilであり、端末をraw modeに設定します。
modeが:defaultの場合は、端末を起動時の設定に変更します。
その際の返却値は、raw modeと同様に、変更される前の端末情報です。
実行例はterme-endをご確認ください。
terme: terme-endtermeの操作を終了します。
(defun terme (terme-end paper) ...) -> null
内部の動作は、引数の情報をもとに端末を通常の状態に戻します。
引数に、terme-beginで返却されたPaperオブジェクトを受け取ります。
端末の操作を終了する場合は、必ずterme-endを実行して下さい。
terme-endは、unwind-protectのcleanupにて実行することをお勧めします。
例えば、次のようになります。
(let ((x (terme 'terme-begin)))
(unwind-protect
(progn ...)
(terme 'terme-end x)))
terme: terme-input入力を受け取ります。
(defun terme (terme-input &optional (block t)) ...) -> (values symbol value)
block (or null (eql t) integer float) ;; default T
symbol symbol
value (or null integer)
本機能は入力が到達するまで実行を停止します。
入力とは下記のいずれかになります。
入力と返却値の対応を下記に示します。
| 入力 | 返却symbol |
返却value |
|---|---|---|
| 文字 | terme-code |
文字コード |
| ↑ キー | terme-up |
nil |
| ↓ キー | terme-down |
nil |
| ← キー | terme-left |
nil |
| → キー | terme-right |
nil |
| Function キー | terme-function |
1, 2, ~ |
| Home キー | terme-home |
nil |
| End キー | terme-end |
nil |
| Page Up キー | terme-page-up |
nil |
| Page Down キー | terme-page-down |
nil |
| Insert キー | terme-insert |
nil |
| Esc キー | terme-escape |
nil |
イベントと返却値の対応を下記に示します。
| イベント | 返却symbol |
返却value |
|---|---|---|
| 入力異常 | nil |
nil |
| サイズ変更 | terme-signal |
nil |
| タイムアウト | terme-hang |
nil |
入力異常とは、認識できない入力か、非対応のエスケープシーケンスを受け取った時です。
頻繁に発生することが考えられますので、無視することをお勧めします。
サイズ変更は、プロセスがシグナルを受け取った時です。
端末のサイズが変更されたときもシグナルを受け取りますので、
画面の再描画を行う契機になります。
タイムアウトについて説明します。
terme-inputは、省略可能な引数blockを受け取ります。
省略時はtです。
blockがtの場合は無限に待ち続けます。
blockがnilか0の場合は、待たずにすぐに返却します。
blockが整数か浮動小数の場合は、タイムアウトまでの秒数を表します。
もしタイムアウトが発生した場合は、terme-hangが返却されます。
実行例を示します。
(terme 'terme-input)
-> TERME-CODE, 3 ;; Ctrl+Cを受け取った
(terme 'terme-input 0.01)
-> TERME-HANG, NIL ;; タイムアウト
terme: terme-output端末にデータを出力します。
(defun terme (terme-output &optional value) ...) -> null
value (or null charcter string integer array) ;; default nil
引数valueは省略可能であり、デフォルトはnilです。
引数valueが文字の場合は、UTF-8エンコードで出力します。
引数valueが文字列の場合は、UTF-8エンコードで出力します。
引数valueが整数の場合は、Unicodeコードとみなして、UTF-8エンコードで出力します。
引数valueが配列の場合は、内容に応じて出力を行います。
引数valueがnilの場合は、キャッシュのデータをflushします。
引数が配列であった場合は、必ず一次元である必要があります。
配列は、最初の要素から、fill-pointerの値まで出力します。
あらかじめバッファを広めに用意しておき、fill-pointerでサイズを操作することで、
メモリ空間の節約と速度向上を期待することができます。
本機能で出力を行うと、内部のバッファに出力データが保留されます。
画面に反映したい場合は、必ず(terme 'terme-output)で内容をflushして下さい。
terme-outputではない、他の操作関数(例えばterme-moveなど)は、
エスケープシーケンスをterme-outputで出力して実現しています。
このような操作関数を即座に画面に反映したい場合は、
文字出力と同様に(terme 'terme-output)を実行してバッファをflushして下さい。
実行例を示します。
;; 13, 10, flushで改行出力
(terme 'terme-output 13)
(terme 'terme-output 10)
(terme 'terme-output)
;; カーソルの移動
(terme 'terme-move 10 20 :absolute)
(terme 'terme-output)
terme: terme-moveカーソルを移動します。
(defun terme (terme-move x y mode) ...) -> null
x integer
y (or null integer)
mode (member :absolute :relative)
modeが:relativeのときは、現在のカーソルの位置からの移動距離を指定します。
modeが:absoluteのときは、左上からの絶対座標を指定します。
(0, 0)が原点です。
:absoluteのときのみ、yをnilに設定することができます。
実行例を示します。
(terme 'terme-move 0 0 :absolute)
(terme 'terme-output)
terme: terme-clear端末全体の文字を消去します。
(defun terme (terme-clear &optional value) ...) -> null
value (member nil :before :after) ;; default nil
引数valueは省略可能であり、デフォルトはnilです。
引数valueがnilの場合は、画面全体を消去します。
引数valueが:beforeの場合は、カーソルの位置を含む行頭までと、上部全てを削除します。
引数valueが:afterの場合は、カーソルの位置を含む行末までと、下部全てを削除します。
:beforeの実行例を示します。
(terme 'terme-clear)
(terme 'terme-move 0 0 :absolute)
(terme 'terme-output "ABCDEF")
(terme 'terme-move 0 1 :absolute)
(terme 'terme-output "GHIJKL")
(terme 'terme-move 0 2 :absolute)
(terme 'terme-output "MNOPQR")
(terme 'terme-move 3 1 :absolute)
(terme 'terme-clear :before)
(terme 'terme-move 0 3 :absolute)
(terme 'terme-output)
実行結果
KL
MNOPQR
:afterの実行例を示します。
(terme 'terme-clear)
(terme 'terme-move 0 0 :absolute)
(terme 'terme-output "ABCDEF")
(terme 'terme-move 0 1 :absolute)
(terme 'terme-output "GHIJKL")
(terme 'terme-move 0 2 :absolute)
(terme 'terme-output "MNOPQR")
(terme 'terme-move 3 1 :absolute)
(terme 'terme-clear :after)
(terme 'terme-move 0 3 :absolute)
(terme 'terme-output)
実行結果
ABCDEF
GHI
terme: terme-delete行の文字を消去します。
(defun terme (terme-delete &optional value) ...) -> null
value (member nil :before :after) ;; default nil
引数valueは省略可能であり、デフォルトはnilです。
引数valueがnilの場合は、行全体を消去します。
引数valueが:beforeの場合は、カーソルの位置を含む行頭までを削除します。
引数valueが:afterの場合は、カーソルの位置を含む行末までを削除します。
実行例を示します。
(terme 'terme-clear)
(terme 'terme-move 0 0 :absolute)
(terme 'terme-output "ABCDEF")
(terme 'terme-move 0 1 :absolute)
(terme 'terme-output "GHIJKL")
(terme 'terme-move 0 2 :absolute)
(terme 'terme-output "MNOPQR")
(terme 'terme-move 3 1 :absolute)
(terme 'terme-delete :before)
(terme 'terme-move 0 3 :absolute)
(terme 'terme-output)
実行結果
ABCDEF
KL
MNOPQR
terme: terme-size端末の幅と高さを取得します。
単位は文字数です。
(defun terme (terme-size) ...) -> x, y
x 横の文字数、幅
y 縦の文字数、高さ
実行例
* (terme 'terme-size)
80
25
terme: terme-scroll画面を上下にスクロールします。
(defun terme (terme-scroll value) ...) -> null
value integer
valueが正の時は、上方向にスクロールします。
valueが負の時は、下方向にスクロールします。
valueが1の時は、画面の最下段でEnterを押したときの動作と同じです。
terme: terme-font文字種、文字色、背景色を変更します。
(defun terme (terme-font &rest args) ...) -> null
value (member nil :before :after) ;; default nil
本機能は、表示する端末の性能によっては正しく表示されません。
文字種とは、例えばボールド、イタリックなどの属性を示します。
文字色、背景色は、デフォルトの8色、256パレット、RGB指定で設定可能です。
下記の順番で、本機能の使い方を説明します。
次のいずれかを実行することで、設定をリセットできます。
(terme 'terme-font)
(terme 'terme-font nil)
(terme 'terme-font 'code 'reset)
(terme 'terme-font 'code 0)
文字種、文字色、背景色がデフォルトの設定に戻ります。
文字種は'codeで設定できます。
(terme 'terme-font 'code x)
xは、整数かsymbolを指定します。
整数のときはエスケープシーケンスの操作番号です。
symbolのときは、下記の内容を指定できます。
| symbol | 内容 | コード |
|---|---|---|
reset |
リセット | 0 |
bold |
ボールド | 1 |
faint |
薄く表示 | 2 |
italic |
イタリック | 3 |
underline |
下線 | 4 |
slow-blink |
遅く点滅 | 5 |
rapid-blink |
速く点滅 | 6 |
reverse |
色逆転 | 7 |
hide |
文字を隠す | 8 |
strike |
打消し線 | 9 |
実行例を示します。
(terme 'terme-font 'code 'italic)
(terme 'terme-output)
文字色は次の3通りの方法で指定できます。
標準8色指定は、foreという識別子で設定できます。
次の値を引数の取ります。
| 色 | 設定値 | 設定値(暗い) | 設定値(明るい) |
|---|---|---|---|
| 黒 | black |
dark-black |
bright-black |
| 赤 | red |
dark-red |
bright-red |
| 緑 | green |
dark-green |
bright-green |
| 黄色 | yellow |
dark-yellow |
bright-yellow |
| 青 | blue |
dark-blue |
bright-blue |
| 赤紫 | magenta |
dark-magenta |
bright-magenta |
| 水色 | cyan |
dark-cyan |
bright-cyan |
| 白 | white |
dark-white |
bright-white |
| 標準 | default |
- | - |
dark-もbright-も付いていない識別は、
*prompt-bright*の値により明暗が選択されます。
例えば、*prompt-bright*がtのとき、
yellowはbright-yellowと同じです。
実行例を示します。
(terme 'terme-font 'fore 'dark-magenta)
(terme 'terme-output)
256パレット指定は、palforeという識別子で設定できます。
引数に、#x00~#xFFまでの整数を取ります。
実行例を示します。
(terme 'terme-font 'palfore #xAA)
(terme 'terme-output)
RGBフルカラー指定は、rgbforeという識別子で設定できます。
引数に、#x00~#xFFまでの整数を連続で3つ取ります。
実行例を示します。
(terme 'terme-font 'rgbfore #xFF #xFF #x80)
(terme 'terme-output)
設定方法は文字色と同じです。
識別子が違いますので、下記に示します。
backpalbackrgbback実行例を示します。
(terme 'terme-font 'back 'dark-magenta)
(terme 'terme-font 'palback #xAA)
(terme 'terme-font 'rgbback #xFF #xFF #x80)
文字種、文字色、背景色は、複合して設定できます。
同時に設定したい場合は、連続して記載してください。
実行例を下記に示します。
(terme 'terme-font 'code 'underline 'fore 'magenta 'rgbback #xFF #xFF #x80)
(terme 'terme-output)