Lisp関数仕様 - terme

nptのドキュメントです。
参照元:ANSI Common Lisp npt

Lisp関数仕様

npt-systemパッケージの下記の関数を説明します。

defun terme

関数terme

本関数は、端末の入出力を操作します。

termeを利用するには、コンパイルオプションを指定する必要があります。
利用可能かどうかはコマンドライン引数の--versionで確認できます。

$ npt --version | grep Prompt
Prompt mode          terme

関数仕様を下記に示します。

(defun terme (symbol &rest args) ...) -> *

入力: symbol
入力: args, 引数
出力: *, 状態

symbolは次の内容を指定できます。

例えば、terme-enableを実行する際は次のようにします。

(terme 'terme-enable)

sysctlとは違い、引数はsymboleq判定で行います。
もしnpt-systemパッケージを継承していない場合は、次のように実行してください。

(npt-system:terme 'npt-system:terme-enable)

以降は、継承していることを前提に説明します。

関数terme: terme-enable

termeモジュールが利用可能かどうかを返却します。

(defun terme (terme-enable) ...) -> boolean

返却がtの場合は、terme機能を利用できます。
返却がnilの場合は、terme機能は利用できません。

実行例を示します。

(terme 'terme-enable)

関数terme: terme-begin

termeの操作を開始します。

(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-end

termeの操作を終了します。

(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です。
blocktの場合は無限に待ち続けます。
blocknil0の場合は、待たずにすぐに返却します。
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が配列の場合は、内容に応じて出力を行います。
引数valuenilの場合は、キャッシュのデータを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のときのみ、ynilに設定することができます。

実行例を示します。

(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です。
引数valuenilの場合は、画面全体を消去します。
引数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です。
引数valuenilの場合は、行全体を消去します。
引数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が負の時は、下方向にスクロールします。

value1の時は、画面の最下段で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のとき、 yellowbright-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)

背景色の設定

設定方法は文字色と同じです。
識別子が違いますので、下記に示します。

実行例を示します。

(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)