ble-decode は端末からの入力を処理する部分である。 端末から送信されたデータは、先ずバイト単位で ble-decode-byte に渡される。 ble-decode-byte は現在の文字符号化方法に従って受け取った byte を unicode 値に変換し、ble-decode-char に渡す。 更に ble-decode-char は、制御文字を通常文字に対する修飾として解釈したり、 エスケープシーケンスを復号して Function キー として解釈したりする等の加工を行って、 その結果を ble-decode-key に渡す。 ble-decode-key は受け取ったキー入力を組み立て、登録されたコマンドが在ればそれを実行する。
keycode はキー入力などの操作を表現する整数である。
flag = keycode&ble_decode_MaskFlag
は修飾キーを表すフラグの部分であり、
key = keycode&ble_decode_MaskChar
の部分が操作を表す部分である。
flag は ble_decode_Shft (Shift), ble_decode_Ctrl (Control),
ble_decode_Meta (Meta), ble_decode_Altr (Alter), ble_decode_Supr (Super),
ble_decode_Hypr (Hyper), ble_decode_Erro (文字復号エラー) の
任意の組合せの論理和であり、それぞれの修飾キーを伴って key の操作が行われた事を意味する。
key は 0<=key&&key<0x110000
の時は文字コードを表し、
対応する文字が入力された事を示す。
それ以外の値を持つ場合は、マウスによる文字列を表す。
keyspec は入力操作を分かり易い名前で表した物である。 keymod は入力に対する修飾キーを表す。 keymod = 'S' は Shift 修飾を表し、 keymod = 'M' は Meta 修飾を表し、 keymod = 'C' は Control 修飾を表し、 keymod = 'A' は Alter 修飾を表し、 keymod = 's' は Super 修飾を表し、 keymod = 'H' は Hyper 修飾を表す。 keyname は、文字の入力に対してはその文字自体を用いる。 例えば文字 a の入力は keyname = 'a' で表される。 但し、空白文字や制御文字になどに対しては以下の表の様な名前が割り当てられている。 一部の空白文字・制御文字については keyname = '^A' 等の形式で指定する事も可能である。 表中の HT 及び CR は TAB 及び RET の別名であり、 keycode から keyspec の変換では TAB 及び RET の名称が優先される。 また、Function キーの入力などその他の操作の場合には C 識別子名で名前が割り当てられている。
空白類 | |||||||
---|---|---|---|---|---|---|---|
keyname | 16進値 | keyname | 16進値 | keyname | 16進値 | keyname | 16進値 |
SP ^` | 0x32 | DEL ^? | 0x7F | TAB ^I | 0x09 | RET ^M | 0x0D |
制御文字 | |||||||
keyname | 16進値 | keyname | 16進値 | keyname | 16進値 | keyname | 16進値 |
NUL ^@ | 0x00 | DLE ^P | 0x10 | PAD | 0x80 | DCS | 0x90 |
SOH ^A | 0x01 | DC1 ^Q | 0x11 | HOP | 0x81 | PU1 | 0x91 |
STX ^B | 0x02 | DC2 ^R | 0x12 | BPH | 0x82 | PU2 | 0x92 |
ETX ^C | 0x03 | DC3 ^S | 0x13 | NBH | 0x83 | STS | 0x93 |
EOT ^D | 0x04 | DC4 ^T | 0x14 | IND | 0x84 | CCH | 0x94 |
ENQ ^E | 0x05 | NAK ^U | 0x15 | NEL | 0x85 | MW | 0x95 |
ACK ^F | 0x06 | SYN ^V | 0x16 | SSA | 0x86 | SPA | 0x96 |
BEL ^G | 0x07 | ETB ^W | 0x17 | ESA | 0x87 | EPA | 0x97 |
BS ^H | 0x08 | CAN ^X | 0x18 | HTS | 0x88 | SOS | 0x98 |
HT ^I | 0x09 | EM ^Y | 0x19 | HTJ | 0x89 | SGCI | 0x99 |
LF ^J | 0x0A | SUB ^Z | 0x1A | VTS | 0x8A | SCI | 0x9A |
VT ^K | 0x0B | ESC ^[ | 0x1B | PLD | 0x8B | CSI | 0x9B |
FF ^L | 0x0C | FS ^~ | 0x1C | PLU | 0x8C | ST | 0x9C |
CR ^M | 0x0D | GS ^] | 0x1D | RI | 0x8D | OSC | 0x9D |
SO ^N | 0x0E | RS ^\ | 0x1E | SS2 | 0x8E | PM | 0x9E |
SI ^O | 0x0F | US ^_ | 0x1F | SS3 | 0x8F | APC | 0x9F |
その他の操作 | |||||||
keyname | 操作 | keyname | 操作 | keyname | 操作 | keyname | 操作 |
up | ↑ Key | down | ↓ Key | right | → Key | left | ← Key |
home | Home Key | end | End Key | prior | PageUp Key | next | PageDown Key |
insert | Insert Key | delete | Delete Key | ||||
f1 | F1 Key | f7 | F7 Key | f13 | F13 Key | f19 | F19 Key |
f2 | F2 Key | f8 | F8 Key | f14 | F14 Key | f20 | F20 Key |
f3 | F3 Key | f9 | F9 Key | f15 | F15 Key | f21 | F21 Key |
f4 | F4 Key | f10 | F10 Key | f16 | F16 Key | f22 | F22 Key |
f5 | F5 Key | f11 | F11 Key | f17 | F17 Key | f23 | F23 Key |
f6 | F6 Key | f12 | F12 Key | f18 | F18 Key | f24 | F24 Key |
kp0 | KeyPad 0 | kp4 | KeyPad 4 | kp8 | KeyPad 8 | kpsep | KeyPad , |
kp1 | KeyPad 1 | kp5 | KeyPad 5 | kp9 | KeyPad 9 | kpsub | KeyPad - |
kp2 | KeyPad 2 | kp6 | KeyPad 6 | kpmul | KeyPad * | kpdec | KeyPad . |
kp3 | KeyPad 3 | kp7 | KeyPad 7 | kpadd | KeyPad + | kpdiv | KeyPad / |
ble-decode-kbd と ble-decode-unkbd は、 それぞれ keyspec から keycode への変換とその逆変換を行う関数である。 ble-decode-kbd は引数に keyspec の列を空白で区切った物を受け取って、 対応する keycode の列を空白で区切って ret シェル変数に代入する。 ble-decode-unkbd は引数に keycode の列を空白で区切った物を受け取って、 対応する keyspec の列を空白で区切って ret シェル変数に代入する。
簡易メモ
bash の bind -x を用いて bash に対する全入力にフックします。
ble_opt_char_width_mode には端末が文字幅 (半角・全角) をどの様に判定するかを指定する。 'west' を指定すると、Unicode East_Asian_Width A の文字幅 (曖昧文字幅) を 1 とする。 'east' を指定すると、Unicode East_Asian_Width A の文字幅を 2 とする。 'emacs' を指定すると emacs-24.2.1 char-width-table から抜き出した文字幅を使用する。
文字幅の判定方式を追加したければ、 .ble-text.c2w+char_width_mode という名前の関数を定義し、 char_width_mode を ble_opt_char_width_mode に設定する。 このユーザ定義関数は第一引数に文字コード (Unicode) を受け取り、ret 変数に文字幅を設定して返る。
IFS (空白文字) で区切られた単語を単位とする操作。 IFS が空の場合は SP HT LF を区切り文字として使用する。
[_a-zA-Z0-9]+ の形式の単語を単位とする操作。
シェルのメタ文字 (SP HT LF | & ; ( ) < >) で区切られた単語を単位とする操作。
空白または / で区切られた文字を単位とする操作。
ble_getopt_vars は ble-getopt が内部で使用する一時変数の一覧を保持する配列である。 コマンド外部の環境に影響を与えないようにする為に、 ble-getopt-begin, ble-getopt を使用する前に local "${ble_getopt_vars[@]}" の様に宣言を行う。
ble-getopt-begin 関数は ble-getopt の初期化を行う。
progname には引数を処理するコマンドの名前を指定する。
optspec には対応しているオプションとオプション引数の定義を与えたリストを指定する。
arg には処理する引数の列を指定する。
optspec は空白区切のリストで、各単語 optdef は一つのオプションの定義を与える。
optdef は optname ( ':' optparam )*
の形式を持つ。
optname はオプション文字または長形式のオプション名である。
オプションが引数を取る場合は、引数の数だけ optparam を指定する。
optparam はオプション引数の種類を表す文字を指定する。
optparam := 'n'
:
非空白のオプション引数を受け取る。オプション引数が空白の場合 ble-getopt は失敗する。
optparam := '?' defaultValue
:
引数があればそれを引数とする。引数がなければ既定の値として defaultValue を用いる。
引数がなく defaultValue も指定されていない場合は、引数は設定されていないとする
(引数が空文字列か設定されていないかを判別する為には、
後述の ${#OPTARGS[@]} の値を見ればよい)。
optparam := '*'
:
任意の引数を受け取る。
ble-getopt 関数は次の引数またはオプションを取得し、その結果を OPTARGS に設定して戻る。 全ての引数を処理し終わり次の引数が存在しない時は OPTARGS を unset して終了状態 2 を返す。 オプションの読み取りに失敗した場合、エラーメッセージを出力して終了状態 1 を返す。
OPTARGS には ble-getopt の実行結果が格納される。 OPTARGS の第0要素 ${OPTARGS[0]} にはオプションの名前が格納される。 そのオプションがオプション引数を持つ場合は、それらは ${OPTARGS[1]} 以降に格納される。
ble-getopt を利用して引数を処理する関数の定義は、典型的には以下の様な構造になる。
function my_command { # 1 内部変数を local に閉じ込める local "${ble_getopt_vars[@]}" # 2 ble-getopt の初期化を行う ble-getopt-begin 'my_command' 'a foo:*:*' "$@" # 3 引数の走査 while ble-getopt; do case "${OPTARGS[0]}" in (a) # 引数 -a に対する処理 ;; (foo) # 引数 --foo に対する処理 # オプション引数1 は ${OPTARGS[1]} に、 # オプション引数2 は ${OPTARGS[2]} に格納されている。 ;; () # 通常の引数に対する処理 ;; esac done # 4 引数走査が正常に終了したか確認 test -n "${OPTARGS+set}" && return 1 # 5 処理の実行 : }
TODO: optname := optchar,longname の形式に対応する?
TODO: optname を空にする事で、通常の引数の形式も指定できる様にする。
TODO: ヘルプ用オプションリスト生成機構 (80文字幅, 各オプションに対する説明の指定)