Bash Line Editor

内部の関数

ble-decode

ble-decode は端末からの入力を処理する部分である。 端末から送信されたデータは、先ずバイト単位で ble-decode-byte に渡される。 ble-decode-byte は現在の文字符号化方法に従って受け取った byte を unicode 値に変換し、ble-decode-char に渡す。 更に ble-decode-char は、制御文字を通常文字に対する修飾として解釈したり、 エスケープシーケンスを復号して Function キー として解釈したりする等の加工を行って、 その結果を ble-decode-key に渡す。 ble-decode-key は受け取ったキー入力を組み立て、登録されたコマンドが在ればそれを実行する。

関数 ble-decode-byte ( byte )+
関数 ble-decode-char charcode
関数 ble-decode-key keycode
形式 keycode
定数 ble_decode_Erro=0x40000000
定数 ble_decode_Meta=0x08000000
定数 ble_decode_Ctrl=0x04000000
定数 ble_decode_Shft=0x02000000
定数 ble_decode_Hypr=0x01000000
定数 ble_decode_Supr=0x00800000
定数 ble_decode_Altr=0x00400000
定数 ble_decode_MaskChar=0x001FFFFF
定数 ble_decode_MaskFlag=0x7FC00000

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 の操作が行われた事を意味する。 key0<=key&&key<0x110000 の時は文字コードを表し、 対応する文字が入力された事を示す。 それ以外の値を持つ場合は、マウスによる文字列を表す。

形式 keyspec := ( keymod '-' )* keyname
関数 ble-decode-kbd keyspecs # ret=keycodes
関数 ble-decode-unkbd keycodes # ret=keyspecs

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 識別子名で名前が割り当てられている。

空白類
keyname16進値keyname16進値keyname16進値keyname16進値
SP ^`0x32DEL ^?0x7FTAB ^I0x09RET ^M0x0D
制御文字
keyname16進値keyname16進値keyname16進値keyname16進値
NUL ^@0x00DLE ^P0x10PAD0x80DCS 0x90
SOH ^A0x01DC1 ^Q0x11HOP0x81PU1 0x91
STX ^B0x02DC2 ^R0x12BPH0x82PU2 0x92
ETX ^C0x03DC3 ^S0x13NBH0x83STS 0x93
EOT ^D0x04DC4 ^T0x14IND0x84CCH 0x94
ENQ ^E0x05NAK ^U0x15NEL0x85MW 0x95
ACK ^F0x06SYN ^V0x16SSA0x86SPA 0x96
BEL ^G0x07ETB ^W0x17ESA0x87EPA 0x97
BS ^H0x08CAN ^X0x18HTS0x88SOS 0x98
HT ^I0x09EM ^Y0x19HTJ0x89SGCI0x99
LF ^J0x0ASUB ^Z0x1AVTS0x8ASCI 0x9A
VT ^K0x0BESC ^[0x1BPLD0x8BCSI 0x9B
FF ^L0x0CFS ^~0x1CPLU0x8CST 0x9C
CR ^M0x0DGS ^]0x1DRI 0x8DOSC 0x9D
SO ^N0x0ERS ^\0x1ESS20x8EPM 0x9E
SI ^O0x0FUS ^_0x1FSS30x8FAPC 0x9F
その他の操作
keyname操作keyname操作keyname操作keyname操作
up↑ Keydown↓ Keyright→ Keyleft← Key
homeHome KeyendEnd KeypriorPageUp KeynextPageDown Key
insertInsert KeydeleteDelete Key
f1F1 Keyf7 F7 Key f13F13 Keyf19F19 Key
f2F2 Keyf8 F8 Key f14F14 Keyf20F20 Key
f3F3 Keyf9 F9 Key f15F15 Keyf21F21 Key
f4F4 Keyf10F10 Keyf16F16 Keyf22F22 Key
f5F5 Keyf11F11 Keyf17F17 Keyf23F23 Key
f6F6 Keyf12F12 Keyf18F18 Keyf24F24 Key
kp0KeyPad 0kp4KeyPad 4kp8KeyPad 8kpsepKeyPad ,
kp1KeyPad 1kp5KeyPad 5kp9KeyPad 9kpsubKeyPad -
kp2KeyPad 2kp6KeyPad 6kpmulKeyPad *kpdecKeyPad .
kp3KeyPad 3kp7KeyPad 7kpaddKeyPad +kpdivKeyPad /

ble-decode-kbd と ble-decode-unkbd は、 それぞれ keyspec から keycode への変換とその逆変換を行う関数である。 ble-decode-kbd は引数に keyspec の列を空白で区切った物を受け取って、 対応する keycode の列を空白で区切って ret シェル変数に代入する。 ble-decode-unkbd は引数に keycode の列を空白で区切った物を受け取って、 対応する keyspec の列を空白で区切って ret シェル変数に代入する。

関数 ble-bind [-xc] -k charspecs [keyspec]
関数 ble-bind [-m kmap] [-xc] -f keyspecs [command]

簡易メモ

keyspecs
command
空文字列または省略した場合は、設定を削除する。
オプション -m 文字列を定義する対象を指定する
オプション -f (未実装)
command がキーシーケンスを引数に受け取る関数である事を表す
オプション -x (未実装)
command で編集文字列に対して操作を行う事を示す。 これを設定した場合 BLE_LINE, BLE_POINT 環境変数に現在の編集文字列とカーソルの位置が指定される。 BLE_LINE, BLE_POINT に対する操作は現在の編集文字列及びカーソルの位置に反映される。
関数 ble-decode-bind

bash の bind -x を用いて bash に対する全入力にフックします。

ble-text

関数 .ble-text.c2s charcode # ret=char
関数 .ble-text.s2c string [index] # ret=charcode
関数 .ble-text.c2w charcode # ret=width
関数 .ble-text.s2w string [index] # ret=width
設定 ble_opt_char_width_mode := 'west' | 'east' | 'emacs' | char_width_mode [ default = emacs ]
関数 .ble-text.c2w+char_width_mode charcode # ret=width (ユーザ定義関数)

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 変数に文字幅を設定して返る。

BLE 編集関数

編集関数 redraw-line
編集関数 clear-screen
編集関数 bell
編集関数 insert-string str
編集関数 discard-line
編集関数 accept-line
編集関数 complete
編集関数 command-help
編集関数 display-shell-version

mark, kill, yank

編集関数 set-mark
編集関数 marked edit-function
編集関数 nomarked edit-function
編集関数 exchange-point-and-mark
編集関数 yank
編集関数 delete-region
編集関数 kill-region
編集関数 copy-region
編集関数 delete-region-or edit-function
編集関数 kill-region-or edit-function
編集関数 copy-region-or edit-function

文字単位の操作

編集関数 self-insert
編集関数 quoted-insert
編集関数 transpose-chars
編集関数 forward-char
編集関数 backward-char
編集関数 delete-forward-char
編集関数 delete-backward-char
編集関数 delete-forward-char-or-exit
編集関数 delete-forward-backward-char

unix word

IFS (空白文字) で区切られた単語を単位とする操作。 IFS が空の場合は SP HT LF を区切り文字として使用する。

編集関数 forward-uword
編集関数 backward-uword
編集関数 delete-forward-uword
編集関数 delete-backward-uword
編集関数 delete-uword
編集関数 kill-forward-uword
編集関数 kill-backward-uword
編集関数 kill-uword
編集関数 copy-forward-uword
編集関数 copy-backward-uword
編集関数 copy-uword

C word

[_a-zA-Z0-9]+ の形式の単語を単位とする操作。

編集関数 forward-cword
編集関数 backward-cword
編集関数 delete-forward-cword
編集関数 delete-backward-cword
編集関数 delete-cword
編集関数 kill-forward-cword
編集関数 kill-backward-cword
編集関数 kill-cword
編集関数 copy-forward-cword
編集関数 copy-backward-cword
編集関数 copy-cword

shell word

シェルのメタ文字 (SP HT LF | & ; ( ) < >) で区切られた単語を単位とする操作。

編集関数 forward-sword
編集関数 backward-sword
編集関数 delete-forward-sword
編集関数 delete-backward-sword
編集関数 delete-sword
編集関数 kill-forward-sword
編集関数 kill-backward-sword
編集関数 kill-sword
編集関数 copy-forward-sword
編集関数 copy-backward-sword
編集関数 copy-sword

filename

空白または / で区切られた文字を単位とする操作。

編集関数 forward-fword
編集関数 backward-fword
編集関数 delete-forward-fword
編集関数 delete-backward-fword
編集関数 delete-fword
編集関数 kill-forward-fword
編集関数 kill-backward-fword
編集関数 kill-fword
編集関数 copy-forward-fword
編集関数 copy-backward-fword
編集関数 copy-fword

編集関数 end-of-line
編集関数 beginning-of-line
編集関数 kill-forward-line
編集関数 kill-backward-line

history

編集関数 history-next
編集関数 history-prev
編集関数 history-isearch-backward
編集関数 history-isearch-forward
編集関数 history-expand-line
編集関数 isearch/next
編集関数 isearch/prev
編集関数 isearch/forward
編集関数 isearch/backward
編集関数 isearch/self-insert
編集関数 isearch/exit
編集関数 isearch/cancel
編集関数 isearch/exit-default
編集関数 isearch/accept
編集関数 isearch/exit-delete-forward-char

便利なコマンド

ble-getopt

配列 ble_getopt_vars
関数 ble-getopt-begin progname optspec ( arg )*
関数 ble-getopt
配列 OPTARGS (local)

ble_getopt_vars は ble-getopt が内部で使用する一時変数の一覧を保持する配列である。 コマンド外部の環境に影響を与えないようにする為に、 ble-getopt-begin, ble-getopt を使用する前に local "${ble_getopt_vars[@]}" の様に宣言を行う。

ble-getopt-begin 関数は ble-getopt の初期化を行う。 progname には引数を処理するコマンドの名前を指定する。 optspec には対応しているオプションとオプション引数の定義を与えたリストを指定する。 arg には処理する引数の列を指定する。 optspec は空白区切のリストで、各単語 optdef は一つのオプションの定義を与える。 optdefoptname ( ':' optparam )* の形式を持つ。 optname はオプション文字または長形式のオプション名である。 オプションが引数を取る場合は、引数の数だけ optparam を指定する。 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文字幅, 各オプションに対する説明の指定)