ble - Bash Line Editor

# 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 の操作が行われた事を意味する。 key は `0<=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 識別子名で名前が割り当てられている。

  空白類
  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 シェル変数に代入する。

関数 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 は一つのオプションの定義を与える。 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文字幅, 各オプションに対する説明の指定)