sistema_progs

Programas para customizar o meu entorno de traballo nos meus equipos persoais
Log | Files | Refs

note.txt (536010B)


      1 # -*- coding:utf-8 -*-
      2 
      3 拡張
      4 
      5   * compopt -o ble/filter-by-prefix
      6     プログラム補完に於いて補完関数内で指定した場合、
      7     生成される候補を接頭辞が一致するものだけに絞り込む。
      8 
      9   * compopt -o ble/syntax-raw
     10   * compopt -o ble/no-mark-directories
     11   * compopt -o ble/prog-trim
     12   * compopt -o ble/no-default
     13   * HISTCONTROL=strip
     14 
     15 制限
     16 
     17   * ble.sh を attach しているとき builtin read -e は動かない。
     18     代わりに ble.sh が定義したシェル関数 read (組み込みコマンドを上書き)
     19     を用いて read -e を呼び出す必要がある。
     20 
     21   * bash-3 C-d について
     22 
     23     今は何とか C-d を処理する事に成功しているが完全ではない。
     24 
     25     1 C-d を押した時に bash が出力するエラーメッセージを使って捕捉している。
     26       このエラーメッセージは言語や設定によって異なると思われる。
     27       現在は以下のメッセージを調べている。
     28       - 'Use "exit" to leave the shell.'
     29       - 'ログアウトする為には exit を入力して下さい'
     30       - 'シェルから脱出するには "exit" を使用してください。'
     31       自分の bash が異なるメッセージを出力する時は
     32       それを bleopt_ignoreeof_message に設定する。
     33     2 連続で沢山 C-d を押すと "^D" が echo されて表示が乱れるかもしれない。
     34       最悪の場合 C-d によって bash プロセスが落ちる可能性もあるかもしれない。
     35       (未だ落ちた事はないが)。
     36     3 C-d を処理する為に SIGUSR1 を使用している。
     37       その為 SIGUSR1 を別の目的で使用する事は出来ない。
     38 
     39   * 文字コードについて
     40 
     41     現在は基本的に UTF-8 を想定している。
     42     それ以外の環境のためには少なくとも以下の修正が必要になる。
     43 
     44     - ble.sh 自体を iconv で変換する事。或いは日本語を完全に排除する事。
     45 
     46       現在のところは日本語はコメント中にしか含まれていないはずである。
     47       コメントさえ削除すれば何処でも動くようになっていると良い。
     48 
     49     - 使いたい文字コード → unicode のデコーダを自分でかく事:
     50       これは "function ble-decode-byte+文字コード" を実装すれば良い。
     51 
     52     - Unicode → 文字のコードが正しく動作する様にする事:
     53       これは .ble-text.c2s (ble-core.sh) の辺りを直せばよい。
     54       "ble-text-c2b+文字コード"
     55       "ble-text-b2c+文字コード"
     56       も実装する必要がある。
     57 
     58     - ble/encoding:$bleopt_input_encoding/generate-binder
     59 
     60       現在 "C-@", "ESC" 及び "ESC *" を bind する為に、
     61       その符号化形式の非正規な符号に変換している。
     62       この変換はシェル関数 ble/encoding:$bleopt_input_encoding/generate-binder
     63       において文字符号化方式毎に (UTF-8 前提の設定を上書きする形で) 定義する。
     64 
     65       また bind を記録したキャッシュは $bleopt_input_encoding 毎に保持するが、
     66       このキャッシュの更新は bind.sh のタイムスタンプしか見ていない (ble-decode/bind 内)。
     67       新しい符号化方式を定義する時には、タイムスタンプを参照するファイル
     68       (ble/encoding:$bleopt_input_encoding/generate-binder を定義するファイル) を決める必要がある。
     69 
     70 
     71     他の文字コードは未だ一回も実装していないので上記以外にも必要な作業が出て来る可能性がある。
     72 
     73     + 2015-11-30 Note: ble-decode.sh (generate-source-to-unbind-default)
     74 
     75       文字コード実装時に問題があるかも。
     76 
     77       現在、bind -sp が出力する中途半端なバイトを解釈する為に、LANG=C で awk を起動している。
     78       UTF-8 の場合には複数バイト文字を構成するバイトは ASCII 文字と被らないので問題ないが、
     79       Shift_JIS 等の場合には ASCII 文字、特に \ や " を含む可能性がある。
     80       この場合には LANG=C にしていると問題が生じる。
     81       というか、bind -sp の出力する中途半端な文字と、複数バイト文字の一部を本質的に区別する方法はない様に思われる。
     82 
     83       ただし、救いは、もし ble.sh を plain な bash の上で起動するとすれば
     84       日本語で bind -sp に登録がなされていることはないだろうということである。
     85       つまり、ユーザが手で (或いは .inputrc に) bind '"日本語":"にほんご"' などとしない限りは問題は生じない。
     86 
     87   * bash-4.0, 4.1 において特殊シェル変数 FUNCNAME をユーザが unset した上で、
     88     関数内から ble.sh を source すると ble の使う連想配列がローカルに定義され問題になる。
     89 
     90     - bash-4.0 以降では連想配列を用いるが bash-4.2 未満では、
     91       連想配列を明示的にグローバルに配置することができない。
     92 
     93     - FUNCNAME がユーザによって削除されていなければ、
     94       この変数を用いて関数内から source されたことを検知できるので、
     95       その時には配列実装に fallback する。
     96       FUNCNAME が削除されていると fallback に正しく切り替わらずに問題になる。
     97 
     98   * bash-4.3 では C-x は、次の文字が来るまでは受信できない。
     99     bash-4.0 - 4.4 の他の version では遅延はないのでこれは bash-4.3 特有の問題である。
    100 
    101   * 構文に従った着色の中には bash の不自然な振る舞いや、
    102     複雑な振る舞いのために正確さを諦めた物がある。
    103 
    104     - bash の最初の [@()] の構文解析とパス名展開時の解析の齟齬
    105 
    106       echo [@(echo|[...])]
    107 
    108       恐らく bash は最初の単語の切り出しで @() を一単位として読み取り、
    109       ["@(echo|[...])"] の様に読み取る。その上で、改めてパス名展開を適用するが、
    110       その時には ["@(echo|[.."]")]" の様に解釈する。
    111       つまり、初めの構文解析とパス名展開の適用の間に齟齬がある。
    112 
    113       ble.sh では構文解析に従った解析・着色をすることにしたので、
    114       実際のパス名展開の適用結果が着色と異なることがあることに注意する。
    115 
    116     - bash echo {@(,)}
    117 
    118       これについても上と同様のことが起こる。
    119       単語の切り出しは {"@(,)"} となり、構文エラーは発生しない。
    120       後のブレース展開では {"@(",")"} と解釈されて分割される。
    121       単語が分断されてしまうのでパス名展開は起こらない。
    122 
    123     - bash のブレース展開時の ${var:-...}{,} の解析とパラメータ展開時の解析の齟齬
    124 
    125       echo ${var:-{a,b}{a,b}
    126 
    127       恐らく bash は最初にブレース展開を試みる時に、
    128       ${} の中については {} の入れ子を数えてスキップする。
    129       従って、上のコマンドの時は ${} が終端しないのでブレース展開は試みられない。
    130       しかし、パラメータ展開が実施される時には {} の入れ子は考慮に入れられず、
    131       最初に現れた "}" で終端するので、${var:-"{a,b"}"{a,b}" という解釈になる。
    132 
    133       [予定]
    134       ble.sh ではどの様に着色するか微妙である。
    135       理想的には最終的な解釈の ${var:-"{a,b"}"{a,b}" に応じた着色にしたいが、
    136       後半の {a,b} の部分が {} の入れ子のアンバランスによって
    137       無効化されている事を検出するのは困難である。
    138       仕方がないので、ブレース展開の {} の入れ子の勘定はバグとして無視する事にする。
    139       つまり、echo ${var:-"{a,b"}{a,b} という解釈で着色する。
    140 
    141     - bash のチルダ展開の時の echo a[]b]=~ の解析と、パス名展開の時の解析
    142 
    143       チルダ展開の時には a["]b"]=~ とはならず a[]"b]="~ という解釈になるので、チルダ展開は起こらない。
    144       一方で、パス名展開のときには a["]b"]"=~" という解釈になり、'ab=~' などのファイル名に一致する。
    145       ble.sh ではパス名展開の規則の方を優先させる。
    146 
    147     - ble.sh では [[ @({a,b}) ]] のブレース展開が有効であるかの様に着色される。
    148 
    149       実際には、条件コマンドの中ではブレース展開は無効になる。
    150       これに正確に対応する為には "条件コマンドの中の extglob"
    151       に対応する文脈値を定義する必要があるが、煩雑になるので対応していない。
    152 
    153     - ble.sh では echo [{@(a|b),[abc]}] の内部の extglob や [...] が有効であるかの様に着色される。
    154 
    155       しかし、実際にはブレース展開を実行したとしても [] の内部なので、
    156       extglob や [...] は不活性化しているはずである。
    157       しかし、これも解析が無意味に複雑になるので対応はしない。
    158 
    159     - ble.sh では echo {~user,~user} の内部のチルダ展開に反応しない。
    160 
    161       bash ではブレース展開された後にチルダ展開が実行されるので有効。
    162 
    163     - ble.sh はブレース展開が含まれる変数代入形式単語でも、
    164       ブレース展開より前のチルダ展開は有効である。
    165 
    166       bash では変数代入形式の単語の右辺でチルダ展開が起こる。
    167       しかし、ブレース展開が含まれている場合には例外としてチルダ展開が起こらない様だ。
    168 
    169       $ a=~:{a,b}:~:echo      → ブレース展開は起こらず、チルダ展開は起こる。
    170       $ echo a=~:{a,b}:~:echo → ブレース展開が起こり、チルダ展開は起こらない
    171                                  ble.sh では一つ目のチルダ展開の解析時点では、
    172                                  次にブレース展開が来ることを知らないので、
    173                                  一つ目の ~ はチルダ展開として着色する。
    174 
    175       規則がよく分からないが、取り敢えず ble.sh ではブレース展開が現れたら、
    176       それ以降はチルダ展開が無効になるようにしている。
    177       具体的には _ble_syntax_bash_command_IsAssign[ctx] の設定されている文脈は、
    178       ブレース展開が現れたときに、変数代入形式前の文脈値に戻すようにしている。
    179 
    180     - echo [a[!b
    181 
    182       echo [! の組み合わせは履歴展開にはならない。
    183       echo [a[!b] の場合にも履歴展開にはならない。
    184       しかし、echo [!a[!b の場合には履歴展開になる。
    185       違いは bracket expressions が閉じているか閉じていないかである。
    186       然し、それを判定する為には先読みをして単語の最後まで見ないといけない。
    187       それは実装上困難なのでこれは諦める。
    188 
    189       (bash の parser がここでどう動作しているのかは不思議ではある。
    190       例えば echo [a[!echo""] は無効で [a[!echo"" は有効である。)
    191 
    192     - echo $((echo)>/dev/null)
    193       よく考えたらこの有名なパターンに対応するのを忘れていた。
    194 
    195     - echo $(case A in A) echo B;; esac)
    196       実はこのパターン。Bash-4.0 以降では大丈夫だが、
    197       Bash-3.2 以降では構文エラーになる。ble.sh は bash-4.0 以降の振る舞いしかしない。
    198 
    199     - ${#var[...]修飾}
    200       この形式は Bash 的には構文エラーになるが、[...] の中身を相当先読みしないと
    201       修飾があるかないかを見る事ができないので諦めている。
    202 
    203     - set +H; echo ${!!修飾}
    204       これは Bash では構文エラーだが何故かが分からない。
    205 
    206     - {$v,$w}xxx これは $vxxx $wxxx に展開される。
    207       つまり、v と xxx がくっついて新しい変数名になる。
    208       これは分かりにくい動作だが、これを逆に使う人もあるのかもしれない。
    209       実の所、ブレース展開も文法レベルで実施されるべきなのかもしれない。
    210 
    211     - $((a[\10])) $((a["10"])) ${v:a[\10]} (bash <= 4.3)
    212 
    213       Bash では最初の解析で a[\10] の部分が抜き出されて、その後で a[\10] が処理
    214       される。最初の解析では [] の入れ子は考慮されない。一方で \10 が有効かどう
    215       かを判定する為には [] の入れ子を追跡する必要がある (bash-4.3 以下では \10
    216       は [] の外では使えないが中では使える)。ble.sh の実装ではこの場合には []
    217       の入れ子は追跡しないことにする。つまり、bash-4.3 以下では $((a[\10])) が
    218       許される筈なのにエラー着色になる。
    219 
    220       Bash-4.4 以上では上記の文脈では [] の内外で振る舞いが一貫しているので実際
    221       上の問題は出ない。他にも ((expr)) や ${v:expr} でも同様の入れ子追跡の処理
    222       の問題があるが、これらの場合には [] 内部と外部の振る舞いは一貫しているの
    223       で実際上の問題にはならない。
    224 
    225     - ${v:a["10"]} に関しても上と同様の問題がある。これは bash-5.1 以下で問題になる。
    226 
    227   * 2019-02-04 プログラム補完関数の中で標準入力は使えない。
    228     どうしてもユーザからの入力を得たい場合には、
    229     現在の補完が自動補完でない事を確認してから /dev/tty から直接取る事。
    230 
    231 bash 実装上で注意するべき事
    232 
    233   * 3.0以上 [Note: これは regcomp の問題かもしれない]:
    234     正規表現 '.^' や $'\n^' は文字列の先頭ではなく行頭に一致する。
    235 
    236     その他の場合 (.*^ など) にはちゃんと文字列の先頭にしか一致しない様だ。
    237 
    238     Ref. #D1869
    239 
    240   * bash-5.2 以上の patsub_replacement に注意する。
    241 
    242     任意の文字列に置換する場合は & が勝手に解釈されない様に "${var/x/"$s"}" の
    243     様に quote すると良い。但し、bash-4.2 では "${var/x/"$s"}" の " は literal
    244     に解釈されてしまう事に注意する。一番安全なのは一旦変数に代入するという事。
    245 
    246   * 変数の代入は基本的に quote は必要ないが、
    247 
    248     1 チルダで始まる時はチルダ展開を防ぐ為に quote が必要。
    249       (変数展開の中にあるチルダは quote しなくても大丈夫)
    250 
    251     2 配列要素を空文字列で連結するときは quote が必要。
    252       つまり、IFS= eval 'declare var=${arr[*]}' とすると空白区切りになる。
    253       IFS= eval 'declare var="${arr[*]}"' とする必要がある。
    254       また IFS が中身のある場合には問題は起こらない。
    255 
    256       - bash-4.3 以降では IFS= eval 'var=${arr[*]}' なら OK
    257 
    258     関係あるか分からないが
    259     http://lists.gnu.org/archive/html/bug-bash/2017-04/msg00001.html
    260     において以下のような例が紹介されている。これは bash-4.5 で修正されるらしい。
    261 
    262     | bash-4.2$ unset IFS; set ' '; a=$*; printf '<%s>' "$a"
    263     | < >
    264     | bash-4.3$ unset IFS; set ' '; a=$*; printf '<%s>' "$a"
    265     | <>
    266 
    267   * コマンドをつなぐ && と || の優先順位は同じで左結合である
    268     但し、算術式や [[ ]] に登場する && と || はC言語と同じ優先順位である。
    269 
    270   * unset の引数は quote しないとパス名展開の対象である。
    271     特に配列要素を消す場合には [...] を quote する必要がある。
    272 
    273   * unset -v または unset -f と明示的に指定しないと、
    274     意図せず同名の関数または同名の変数を消去してしまう可能性がある。
    275     変数を消す場合でも unset -v と明示する必要がある (ref #D0893)。
    276 
    277   * コマンドの単語中のパラメータ展開は "" でクォートする必要がある
    278     (ref #D0943)
    279 
    280     特に値として以下の物が含まれている可能性がある時は絶対必要である。
    281     先ず始めに IFS に含まれる文字がある場合は意図しない単語分割を抑制する為に "" で囲む。
    282     次に、グロブの特殊文字 *?[ が含まれている場合にも注意する。
    283     shopt -s extglob の時には @( や !( の並びにも注意する必要がある。
    284     更に、'\' が含まれる場合もグロブ特殊文字のクォートに何故か影響を与える様なので注意する。
    285     これは例えば shopt -s failglob において、a='\'; echo $a'*' がエラーメッセージを出す事で分かる。
    286 
    287   [complete 仕様について]
    288 
    289   * compgen -f はクォート除去、チルダ展開を実行する
    290     理解できないのはクォート除去した後にチルダ展開をするという事。
    291     compgen -f "'~/'" としても '~' というディレクトリには決して一致しない。
    292     compgen -f "'\~/'" 等とクォートした上に backslash も指定しないと行けない。
    293     結局どういう規則なのか分からないので、寧ろ arr=('~/'*) 等の様にするべき。
    294 
    295     Note: ~ だとちゃんと現在のディレクトリ以下のファイルに一致するようだ?
    296     Note: compgen -W でも似たような quote 除去・ブレース展開などを行う様だが、
    297       それでも理解できる振る舞いになっている。
    298     Note: bash --norc で echo \~/ から補完を実際に実行してみると echo ~/... に書き換わってしまう。
    299       何処かで quote が消えてしまっている。これはバグと見做すべきであろう。
    300 
    301   * $ complete -F foo -C bar command と登録すると foo, bar の両方が foo bar の順に実行される。
    302     $ complete -C bar -F foo command と登録すると bar foo の順に実行される。
    303     しかし、complete -p とすると両者とも
    304     complete -C 'bar' -F foo
    305     と表示され登録順・実行順についての情報を取り出す事ができない。
    306 
    307     →今試すと必ず foo bar の順序でしか呼び出されない。compgen でも同様に見える。
    308 
    309   * $ complete -F hoge1 -F hoge2 command とすると、-F hoge2 だけ有効になる
    310     (complete -p による表示もそうだし、実際に実行されるのも hoge2 だけであった)。
    311     -F オプションは後からものによって上書きされるという事の様だ。
    312 
    313   * shopt -q は通常の出力はやめてもエラーメッセージは出す。
    314     つまり未実装のオプション (compat* や autocd) について
    315     shopt -q をするとエラーメッセージが出力されるので
    316     結局 &>/dev/null にリダイレクトしなければならない。
    317 
    318   * locale の環境変数 LC_*/LANG を設定する時は &>/dev/null する必要がある。
    319     ref #D1205 #D1341 #D1355
    320 
    321     元々入っていた値が不正な値である場合、
    322     元の値を復元した時にエラーメッセージが意図されず出力される。
    323 
    324     ローカル変数として設定する場合は、
    325     - 値の復元はどうやら関数の本体を完全に実行し終わった後に起こる様なので、
    326       関数の本体自体を &>/dev/null で囲んでも意味はない。
    327     - 関数の中で unset を行っても意味はない。
    328     - 関数の中でもとの値を設定しても意味はない。
    329       関数が抜ける時に改めて設定される様だ。
    330 
    331     IFS= LC_ALL=C read -t 0 &>/dev/null
    332     としても復元時のメッセージは何故か抑制できなかった。
    333 
    334     * #D1341 更に、bash-4.1 以下では LC_ALL= LC_COLLATE=C func 等の形式にしても
    335       効果が現れない。local LC_ALL= LC_COLLATE=C としないと効かない様である。
    336 
    337       外部コマンドを呼び出す時には問題は起こらない。関数経由でも大丈夫。
    338       逆に外部コマンドの時には "LC_ALL=C awk" の形式にする必要がある。
    339       もしくは "local -x LC_ALL= LC_COLLATE=C" とする。
    340 
    341       ng$ aaa() { echo ${#1}; }; LC_CTYPE=C aaa あいうえお
    342       ok$ echo あいうえお | LC_CTYPE=C awk '{print length($0)}'
    343       ok$ echo あいうえお | LC_CTYPE=C ble/bin/awk '{print length($0)}'
    344 
    345     * 2021-01-15 aaa() { local LC_ALL= LC_CTYPE=C; ... ; } 2>/dev/null の形式でも
    346       駄目だという事が判明した。ちゃんとする為には関数内で unlocal までする必要がある?
    347 
    348   * Bash 正規表現はシステムの <regex.h> を使用するので環境依存である。
    349 
    350     Linux においては bash 正規表現の POSIX 文字クラス ([[:alpha:]] など) は
    351     ロケールによって何にでも一致するので信用できない。
    352     例えば GNU/Linux (Fedora 25) では ja_JP.UTF-8 で [[:alpha:]] は漢字・仮名にも一致する。
    353 
    354   * bind 関数の中で set +o emacs などをして編集モードを無効にすると、
    355 
    356     編集関数の実行自体が中断されるようである。
    357     具体的には set +o emacs を含む行だけ実行されて、次の行以降は実行されない。
    358     set +o emacs が eval に含まれる場合は eval が終わると共に中断される。
    359     また関数内に set +o emacs がある場合は、その関数は最後まで実行されるようだ。
    360 
    361     従って set +o emacs が実行されたことを検知して適切な後処理を実行するのは難しい。
    362     更にその後で set -o emacs に戻ってくると変な状態になる。
    363     bind -p ではちゃんと hook された状態になっているが、
    364     実際に操作してみると keymap はリセットされているように見受けられる。
    365     この辺りはもう少し詳しく調べてみないと具体的に何が起こっているかはわからない。
    366 
    367     例: 以下の3行のコマンドを実行しようとすると途中で中断され元の状態には戻らなくなる。
    368 
    369     $ set +o emacs
    370     > echo hello
    371     > set -o emacs
    372 
    373     直接 readline で実行している場合にはこの問題は起こらない。
    374 
    375   * ble.sh では変数の -i は積極的には使用しないことにした ref #D0894
    376 
    377     関数引数に使用する場合は、そもそも -i の機能を使う機会の方が少ないので
    378     全ての関数の引数に適用するのは非効率であり、一部の関数の引数にだけ適用するのは
    379     関数の仕様として分かりにくくバグの元である。そもそも算術式展開が必要化どうかは
    380     呼び出し元が知っていることのはずなので呼び出し元で算術式展開をするべきである。
    381 
    382     関数内で使用する場合についても明示的に算術式展開を実行すれば良い。
    383 
    384   * bind 関数中の set +v は揮発性 ref #D0930 (Bash 3.0--5.0)
    385 
    386     bind 関数中で set +v 等としてもその状態は
    387     次の bind 関数の呼び出しの際には元に戻ってしまう。
    388     この振る舞いは試した全ての bash version で共通だった。
    389 
    390 bashbug: 実装上で注意するべき事・バグ
    391 
    392   * bash-5.0 -- 4.4 (ref #D1334)
    393     trap handler が実行中に return を無引数で呼び出すと、
    394     無条件に trap handler 起動直前の $? が関数の終了ステータスになる。
    395     POSIX に要求されていると書かれているが解釈に難がある。
    396     特に trap handler を抜ける時の戻り値だけに影響を与えるのが自然に思われる。
    397 
    398   * bash-5.0 -- 3.0 (全 version) バグ (ref #D0943)
    399 
    400     $ shopt -s failglob
    401     $ a='\'; echo $a'*'
    402 
    403     これで failglob になる。\* に一致するファイルは存在しませんのエラーメッセージ。
    404     ファイルとして '*', '\*', '\a', 'a' 等があっても決して一致しない。
    405     これを防ぐ為には、パラメータ展開は必ず "" でクォートする様にすれば良い。
    406 
    407   * bash-5.0 -- 3.0 (全 version) バグ
    408 
    409     history -p をコマンド実行中に呼び出すと呼び出す度に履歴項目が減る。
    410     これは例えば f1() { history | tail -1; history -p '!!'; history | tail; } として、
    411     f1 を実行すると分かる。f1;f1;f1 等とすると一回で3件消える。
    412     更に bash-3.0 では bind -x の関数の中であっても history -p を呼び出す度に履歴項目が減る。
    413 
    414   * bash-4.4 -- 4.3 バグ
    415 
    416     \C-@ 関係に bind -x すると正しく動かない
    417     bash-4.4 での動作については未だ確認していない。
    418     → bash-4.4 でもやはり動かない。
    419 
    420     これは修正した http://lists.gnu.org/archive/html/bug-bash/2018-03/msg00165.html
    421 
    422   * bash-4.4 -- 3.2, etc
    423 
    424     rex="^([^\$]|\\'[^\\']*\\')+\$" && [[ 'i$' =~ $rex ]] && echo hello
    425     が一致する。\' の解釈が謎である。単に ' とすれば問題ない。
    426 
    427     rex=$'^([^$]|\\\'.\\\')+$' でも一致する。
    428     rex=$'^([^$]|\\\')+$' だと一致しない。
    429     \' は何らかのアンカーとして解釈されるという事だろうか。
    430     或いは単純に無視されているのか。
    431 
    432   * bash-4.2
    433 
    434     declare -g -r var とした時に、
    435     グローバル変数が定義されていなければローカルに新しく変数を作る様だ。
    436     bash-4.3 で直っている。
    437 
    438   * bash-4.2 以下
    439     bash-4.2 ~ bash-3.0
    440 
    441     \C-x 単体に bind -x して C-x に続けて何か打つと segfault する。
    442     $ bind -x '"\C-x":echo' → 続けて C-x a 等と入力
    443 
    444   * bash-4.1 以下: LC_CTYPE=C eval 'echo ${#var}' としても
    445     ${#var} が元のロケールで計算される。"変数代入 コマンド"
    446     の形式だとロケールの初期化が間に合わないのだろうか。
    447 
    448   * bash-4.0 segfault
    449 
    450     以下で segfault を起こすことが分かった。bash-4.1 以降では直っている。
    451 
    452     bash-4.0 -c 'function f1 { COMPREPLY=(alpha); }; compgen -F f1 2>/dev/null'
    453 
    454     但し、ble.sh の使用中に実際に compgen -F を通して segfault になることはなかった。
    455     もしかすると何らかの条件が整うと segfault するかもしれないので、
    456     念のためここに記録に残しておく。
    457 
    458   * bash-3.2 以下ではプロセス置換に含まれるブレース展開は
    459     プロセス置換ごと複製してしまう。
    460     例えば echo <(echo {1..3}) は、
    461     echo <(echo 1 2 3) ではなくて、
    462     echo <(echo 1) <(echo 2) <(echo 3) に展開されてしまう。
    463 
    464   * bash-3.2 以下では declare a としただけで空の値で初期化される。
    465     unset 状態になるという事はないので注意を要する。
    466 
    467   * bash-3.2, bash-3.1 では source にプロセス置換を渡しても読み取ってくれない。
    468     つまり source <( ... ) としても何も起こらない。
    469     代わりに eval -- "$( ... )" すると良い。
    470 
    471   * bash-3.2 -- 3.1
    472 
    473     ref #D0857
    474     10 以上のファイルディスクリプタで使用されている物に対して
    475     リダイレクションで新しい出力先を設定しようとしても失敗する。
    476     これは fd>&- として一旦閉じてからリダイレクションすれば良い。
    477 
    478     bash-3.1 では一度開いた fd を改めて開き直したり、
    479     或いは閉じたりすることができない。
    480     exec 34>/dev/null とすると、exec 34>&- としても閉じれないし、
    481     exec 34>a.txt としても /dev/null に繋がったままになってしまう。
    482 
    483   * bash-3.1 では declare -f funcname の funcname に + 等の文字を含める事ができない。
    484     一応 declare -F 等とすれば名前は列挙される様ではある。
    485     bash-3.2 未満では declare -f ではなく type -t で関数かどうかの確認を行う。
    486 
    487   * bash-3.1 での bind -r について
    488     bind -sp とすると "\M-[C" 等と表示されるがそれに従って bind -r '\M-[C'
    489     としても削除する事は出来ない。代わりに bind -r '\e[C' とすれば削除できる。
    490 
    491     eval -- "$(bind -sp | awk '/M-\[/{sub(/:$/,"",$1);gsub(/\\M-/,"\\e");print "bind -r " $1}')"
    492 
    493   * msys1, msys2: var='^M' とすると CR が消えてなくなる。
    494     msys2 では var=$'\r' とすれば大丈夫。また変数に入っている物も大丈夫。
    495     例えば var=$_ble_term_CR はOKである。
    496     msys1 ではそれでも駄目。local var=$'\r' とすれば大丈夫。
    497     変数に入っている物でも local を付けないと消滅してしまう。
    498 
    499     Ref #D1270
    500 
    501   * msys1 では named pipe が未対応。従ってプロセス置換も使えない。
    502 
    503 bashbug 算術式周りのバグと注意点
    504 
    505   * bash-3.0 - 4.4.7 算術式:
    506 
    507     条件分岐で実行されない部分でも配列の添字は 0 以上でなければならない。
    508     例えば以下はエラーになる @ bash-3.0, 3.1, 3.2, 4.0, 4.2, 4.3
    509     ((a=-1,a>=0?b[a]:0))
    510 
    511     もっと調べてみると配列の添字に限らず分岐しない所で式が評価されている様だ:
    512 
    513     + 三項条件式で起こる。true/false branches のどちらでも起こる。&& や || では起こらない。
    514 
    515       $ echo 'x=a=1; ((a=0,0?x:0)); echo $a' | bash      1 (bash-3.0 - 4.3)
    516       $ echo 'x=a=1; ((a=0,1?0:x)); echo $a' | bash      1 (bash-3.0 - 4.3)
    517       $ echo 'x=a=1; ((a=0,0&&x)); echo $a' | bash       0 (bash-3.0 - 4.3)
    518       $ echo 'x=a=1; ((a=0,1||x)); echo $a' | bash       0 (bash-3.0 - 4.3)
    519 
    520       $ echo 'x=a=1; ((a=0,0?b[x]:0)); echo $a' | bash   1
    521       $ echo 'x=a=1; ((a=0,0&&b[x])); echo $a' | bash    0 (bash-3.0, 3.1, 4.2+ / bash-3.2, 4.0, 4.1 は別の bug で 1)
    522 
    523     + 括弧で囲めば何も起こらない様だ。
    524 
    525       $ echo 'x=a=1; ((a=0,0?(x):0)); echo $a' | bash    0 (bash-3.0 - 4.3)
    526       $ echo 'x=a=1; ((a=0,1?0:(x))); echo $a' | bash    0 (bash-3.0 - 4.3)
    527 
    528       $ echo 'x=a=1; ((a=0,0?(b[x]):0)); echo $a' | bash 0 (bash-3.0, 3.1, 4.2+ / bash-3.2, 4.0, 4.1 は別の bug で 1)
    529 
    530   * bash-4.2 算術式 seg fault
    531 
    532     https://lists.gnu.org/archive/html/bug-bash-gnu/2013-01/msg00036.html
    533     https://lists.gnu.org/archive/html/bug-bash-gnu/2013-01/msg00042.html
    534     https://lists.gnu.org/archive/html/bug-bash-gnu/2013-01/msg00043.html
    535 
    536     算術式の中で配列要素の参照に関係して特定の式構造になると segfault する。
    537     多分、配列要素の読み出しの次の token が整数または代入式の左辺だと落ちる。
    538     配列要素を参照したら一旦算術式を閉じるのが良い。
    539     $ ((a=b[0],c=0))
    540 
    541     以下でも segmentation fault が起こった。
    542     $ (((klen=node[nofs+k])<0||(kbeg=j-klen)>end0))
    543     $ (((a=node[1])<2||(b=3)))
    544     $ (((a=node[1])||(b=3)))
    545     $ (((a=node[1])<2||b)) # OK
    546     $ (((a=node[1])||b))   # OK
    547     $ (((node[1])||(b=3))) # OK
    548     やはり起こる条件が良く分からない。
    549     代入式の右辺に配列が来て、
    550     その後に代入式の左辺に token があると駄目なのか?
    551 
    552   * bash-4.1, 4.0, 3.2: 算術式分岐内配列参照
    553 
    554     bash-3.2.48 で以下の評価に失敗する。
    555     bash-3.1 以下は大丈夫。bash-4.2, bash-4.3 も大丈夫。bash-4.0 は駄目。
    556 
    557     dbg=()
    558     ((a=0,b=0,0&&(a=1,x=dbg[0],b=1))) # NG
    559     配列添字で値を参照 (代入はOK) すると、その部分以降が必ず実行される。
    560     複合代入であっても駄目である。
    561 
    562     bash-4.0 bash-4.1 でも以下の式で必ず _pos[1]++ が実行されていた。
    563     ((_eoc[2]&&(_pos[0]=0,_pos[1]++)))
    564 
    565 
    566     $ ((a=0,b=0,0&&(a=1,x=dbg[0],b=1))); echo $a $b               → 0 1
    567     $ expr="a=1,x=dbg[0],b=1"; ((a=0,b=0,0&&expr)); echo $a $b    → 0 1
    568     $ expr="a=1,x=dbg[0],b=1"; ((a=0,b=0,0&&(expr))); echo $a $b  → 0 1
    569 
    570     更に配列添字も必ず評価されてしまう。
    571     ((i>=0&&a[i])) は i が負であっても参照される。
    572     そして、((i>=0&&a[i--])) をすると更に副作用も起こる。
    573 
    574   * bash-4.1 以下 (bash-3.0 ~ bash-4.1)
    575 
    576     配列要素に対して修飾付きのパラメータ展開を実行すると、
    577     配列添字に指定した算術式が2回評価される。
    578     例えば "${arr[i++]#a}" を実行すると i が 2 増える。
    579 
    580   * bash-4.0 他 算術式を使って値を計算する時の注意
    581 
    582     算術式の中に初期化されていない変数…例えば ret 等がある場合、
    583     ret の中身に不正な数式的な物が入っていたりコマンド置換が入っていたりすると、
    584     文法エラーになったりこれが eval されてしまう。
    585     実際に 4.0 では 'あ' という文字列が入っているだけでエラーになる。
    586     (より上の version では識別子名と解釈されているからなのかエラーにはならない。
    587     しかし、今迄は毎回「あ」等という変数を探していたのだろう。
    588 
    589   * bash-3.1, 3.0
    590 
    591     ?: 演算子の中身は全てカッコで囲まないと構文エラーになる。例えば、
    592     $ bash-3.1 -c '((a?(b=123):c?(d=321):1))'
    593     bash-3.1: ((: a?(b=123):c?(d=321):1: syntax error in expression (error token is "?(d=321):1")
    594 
    595 bash 配列の宣言に関する注意点
    596 
    597   * arr=(1 2 3) func の形式で配列をシェル関数に渡そうとすると、
    598     export arr='(1 2 3)' で渡されてしまう。
    599 
    600   * 既に配列変数になっている物に対して
    601     export var=value や typeset -x var=value をしても、
    602     呼び出された別コマンドからは環境変数として見えない。
    603 
    604     $ a=(1 2 3)
    605     $ (export a=1; bash -c 'declare -p a')
    606     bash: 0 行: declare: a: 見つかりません
    607 
    608     新しい変数として導入すれば良い。
    609     例えば関数内で新しく local -x var=value とするか、
    610     var=value command の形式で呼び出すようにすれば良い。
    611 
    612     $ (a=1 bash -c 'declare -p a')
    613     declare -x a="1"
    614 
    615 その他のバグ
    616 
    617   * BUG gawk-4.0.2 正規表現 [][:space:]] や [^][:space:]] に対して警告メッセー
    618     ジを出力する。実際には正しく解釈して正しく動作する様である。また、他の gawk
    619     version では問題はない。
    620 
    621     これは scan チェックに含める事にする。
    622 
    623 bash_features
    624 
    625   * time -- について。
    626     bash-5.1 以降で time -- command が可能。
    627     bash-4.2 以降で time -p -- command が可能。
    628     (bash-4.1 以前では time には -- を指定できない)
    629 
    630   * bash-5.0 以降: EPOCHREALTIME, EPOCHSECONDS
    631     ref #D0925
    632 
    633   * Bash-5.0 では POSIX に倣ってパラメータ展開結果に \ が含まれる場合に
    634     グロブパターンと見做す様に変更されたが、
    635     これにより問題が起こり POSIX が記述に誤りがあることを認めて修正した。
    636     結局 Bash-5.1 で 4.4 と同じ動作に戻すつもりらしい。
    637     https://lists.gnu.org/archive/html/bug-bash/2020-03/msg00051.html
    638 
    639   * ${param@a} (attributes) 及び他の transformation は bash-4.4 より
    640 
    641   * read -t timeout
    642 
    643     * -t オプションの対応は 2.04 である。
    644     * TMOUT 変数の対応は 2.05b-alpha1 以降である。
    645     * 小数を指定できる様になったのは 4.0-alpha 以降である。
    646     * `-t 0' で次の文字を読み取り可能かどうかチェックできるのは 4.0 以降である。
    647     * 4.3 以下では timeout した時に読み取った入力は失われてしまう。
    648       4.4 以降では timeout するまでに読み取った内容が指定した変数に格納される。
    649 
    650   * グローバル変数に対する属性指定 declare -g は bash-4.2 から
    651 
    652     更に bash-4.3 には declare -gA を二度行うとクラッシュするバグがあったらしい。
    653     現在の最新版ではそのような振る舞いは見られない?
    654 
    655     2021-02-10 #D1470 どうも bash-4.2 の declare -g にはバグがある。declare -gA
    656     とすると属性は global まで適用されるが、代入された値は関数を抜けると共に消
    657     滅する。2021-05-20 追記。declare -gA a=() とすると関数を抜けると共に値が消
    658     滅するが、declare -gA a; a=() とすると特に問題は生じない。
    659 
    660   * 連想配列 declare -A は bash-4.0 から
    661 
    662   * BASHPID 何と Bash 4.0 以降の機能らしい ref #D1200
    663 
    664     ------------------------------------------------------------------------------
    665     This document details the changes between this version, bash-4.0-alpha,
    666     and the previous version, bash-3.2-release.
    667 
    668     c.  There is a new variable, $BASHPID, which always returns the process id of
    669         the current shell.
    670     ------------------------------------------------------------------------------
    671 
    672     と思ったら既にソースコードの一部にも Bash 4.0 以降であるとの注記があった。
    673 
    674   * command |& command は Bash 4.0 以降なので使えない。
    675 
    676   * printf -v var %s value
    677 
    678     bash-3.1 以降で使える。
    679     bash-4.1 以降で var として配列要素 (arr[123] 等) を指定できる。
    680 
    681   * printf %(...)T は bash-4.2 以降から。但し、bash-4.2 では -1 を明示的に指定
    682     しないと現在時刻になってくれずに 0 になってしまう。bash-4.3 以降では省略し
    683     た場合は現在時刻になる。
    684 
    685   * ${!arr[@]} は bash-3.0 より
    686 
    687 bash_tips
    688 
    689   * swap の仕方
    690     local a=$b b=$a
    691     local や declare などは必要である。
    692 
    693   * [[ ]] の中で =~ で設定された BASH_REMATCH は直後の式で参照できる。
    694     つまり [[ $text =~ $rex && $BASH_REMATCH == ... ]] の様にできる。
    695 
    696     bash-3.0 から bash-4.4 までで以下のコマンドで確かめた。
    697 
    698     [[ "" =~ ^ ]]; [[ $BASH_REMATCH ]]; [[ a =~ a && $BASH_REMATCH ]]
    699 
    700   * 構文関係でマニュアルに載っていないものが色々ある。
    701 
    702     * }, fi, done, esac の直後に }, fi, done, esac, do, else, elif, then が来る場合はセミコロンは省略できる。
    703 
    704     * for ((expr1; expr2; expr3)) [ ; ] { list; } は比較的有名だが、
    705       for name [in name]; { list; }
    706       select name [in name]; { list; } も使える様だ。
    707 
    708     * select name [ [ in word ... ] ; ] do ...; done
    709       ※in word ... がない場合、do の前のセミコロンは省略可能である。
    710 
    711   * "$(case *) ;; esac)" に対応する可能性があるかと思ったが動きはない
    712     ref http://lists.gnu.org/archive/html/bug-bash/2017-11/msg00002.html, #D0928
    713 
    714   * function @() { ...; } は成功するが実際には関数は作られない
    715     ref http://lists.gnu.org/archive/html/bug-bash/2017-03/msg00220.html, #D0927
    716 
    717   * declare -c var という隠し属性がある。Capitalize する。Bash 4.0+
    718     変数の値の各単語について適用するのではなく本当に最初の文字にしか適用されない。
    719     この中途半端な機能の為に恐らくマニュアルに載っていないのだろう。
    720 
    721     ソースコードを確認すると他にも declare -G var という謎機能が存在する。
    722     同じ文脈に局所変数があればそれに設定してそれ以外ならば大局変数に設定する。
    723     これは丁度他の言語のレキシカルスコープを真似た物という事だろうか。
    724 
    725   * nameref & extra expansion
    726     気付いたのだが declare -n ref='arr[...]' の ... に任意の式を記述できる。
    727     これによって新しい乱数変数も定義できるのでは。例えば。
    728 
    729     declare -n var='var_[var_=RANDOM*RANDOM,0]'
    730 
    731     但し、算術式なので整数以外は代入できない。
    732     更に、$() でプログラムを実行することすらできる。
    733     然し、任意の文字列という訳には行かないのが問題。
    734     $() はサブシェルで実行されるので副作用を残す事ができない。
    735 
    736   * let & brace expansion
    737     これは算術式のページに既に書いた。
    738 
    739   * rcfile を処理している間は
    740 
    741     * 関数内で FUNCNAME, BASH_SOURCE, BASH_LINENO を確認するとFUNCNAME
    742       の最後の要素は "source" であり、BASH_LINENO の最後の要素は 0 に
    743       なっている。BASH_SOURCE の最後の要素がファイル名である。
    744 
    745     * bash-4.4 以降では $- に s (標準入力から読み取り中) が含まれない
    746       事で確かめられる。bashrc を抜けてPROMPT_COMMAND を実行する時には
    747       s が含まれる様になる。bash-4.4 未満では s は決して含まれない事に
    748       注意する。
    749 
    750     まとめると以下の様な関数で rcfile 中で走っているかどうかを判定できるのではないか。
    751 
    752     function ble/util/is-running-in-rcfile {
    753       [[ $- == *i* && ( _ble_bash -lt 40400 || $- != *s* ) ]] || return 1
    754       local nstack=${#BASH_LINENO}
    755       [[ ${BASH_LINENO[nstack-1]} == 0 && ${FUNCNAME[nstack-1]} == source ]]
    756     }
    757 
    758 
    759 *******************************************************************************
    760     Memo
    761 -------------------------------------------------------------------------------
    762 
    763 2023-01-31
    764 
    765   * review: direnv [#M0023]
    766 
    767     direnv は .envrc を bash で評価して、環境変数の変更を調べて、それを各シェル
    768     の変数に反映させるらしい。これにより使うシェルに依存せず一つの .envrc で同
    769     時に対応できる。然し一方でこれが意味する所は、環境変数だけしか親シェルに反
    770     映させる事ができないのだろうという事。ローカルな関数やエイリアスは引き継が
    771     れない (或いはエイリアスであれば可能であろう)? また環境変数に制限する事によっ
    772     てディレクトリに入る前の環境変数のセットをそのまま保存する事によって
    773     push/pop を自前で実装しなくて済む様になっている。
    774 
    775     .envrc は direnv allow しないと有効にならない。このallow/unallowedの情報は
    776     どこに記録しているのだろうか。うーん。別の箇所にディレクトリを作成している
    777     様にも見える。うーん。
    778 
    779     https://github.com/bbugyi200/funky これは各ディレクトリの中にデータベースファ
    780     イルを作って local functions を保存する事によって動く。グローバルに使える関
    781     数も定義できる (が .bashrc で定義するのと比べて何が違うのか謎)。
    782 
    783     https://github.com/cxreg/smartcd これは機能的になかなか参考になる気がする。
    784     README の see also のまとめが参考になる。
    785     https://github.com/cxreg/smartcd#see-also
    786 
    787     https://github.com/Tarrasch/zsh-autoenv ... smartcd SEE ALSO による
    788     と、~/.autoenv_authorized に実行して良い env ファイルが記録されているそうだ。
    789 
    790     https://github.com/hyperupcall/autoenv ... これは bash にも対応している。記
    791     録ファイル ~/.autoenv_authorized は zsh-autoenv と同じ様である。
    792 
    793     https://github.com/jamesob/desk ... これも似たような事を実装しているが、恐
    794     らく予め設定した内容だけでなく現在のディレクトリやコマンド履歴などの動的な
    795     情報も「セッション」として記録している気がする。然しここまで来ると screen
    796     で良いのではないかという気がしてくる。
    797 
    798 2021-12-31
    799 
    800   * "function f {}" vs "f() {}" [#M0022]
    801 
    802     function f は元々は ksh functions で、POSIX functions f() とは局所変数の取
    803     り扱いが異なる。ksh では f() の形式の関数では局所変数を定義できない。ksh
    804     functions ではその関数で宣言したローカル変数またはグローバル変数しか見えな
    805     い。この背景から function f() という両方を組み合わせた形で書くと鬼の首を撮っ
    806     たかの様に指摘してくる人がいる (Greg Wooledge だったか)。
    807 
    808     f() の形式の場合には f の部分は alias 展開の対象である。例えば alias
    809     die=std::die 等として名前空間を import している時に、関数を上書きしたい時に
    810     それが alias されているという事を意識せずに直接 die() { ... } 等として上書
    811     きする事ができる。
    812 
    813     function ... の場合には、f() の形式では定義できない、特別な文字を含んだ関数
    814     も定義する事ができる。POSIXLY_CORRECT の時には結局どちらの形式を使ったとし
    815     ても、識別子以外の名前で関数を定義する事はできないのであるが。
    816 
    817     Bash 5.0 以前では function hello の直後にはサブシェル () を本体とした定義は
    818     置けない。文法的にはこれが当たり前の様な気もするが、Bash 5.1 以降では直後に
    819     サブシェルを置ける様である。例えば function f(echo) など。
    820 
    821 2021-05-16
    822 
    823   * Linux パッケージのチェック (by killermoehre) [#M0021]
    824     どの Linux にどのパッケージのどの version が入っているかを調べられるサイト
    825     https://pkgs.org/search/?q=groff
    826 
    827 2021-05-15
    828 
    829   * PKGBUILD の説明は此処にある [#M0020]
    830     https://wiki.archlinux.org/title/VCS_package_guidelines
    831     https://wiki.archlinux.jp/index.php/PKGBUILD
    832     https://wiki.archlinux.jp/index.php/%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E4%BD%9C%E6%88%90#.E9.96.A2.E6.95.B0_pkgver.28.29
    833 
    834     PKGBUILD と一緒に.SRCINFO も更新すること。
    835     pkgrel は新しい pkgver に変わったら一緒に 1 に変更する。
    836 
    837 2021-05-03
    838 
    839   * awk の互換性に関する注意点 [#M0019]
    840 
    841     * 正規表現 {m,n} は gawk-4 以降でしか既定で使えない。gawk-3 も nawk も mawk
    842       も駄目。
    843 
    844       POSIXに反しているが過去の互換性の為という事らしく gawk-3 では
    845       POSIXLY_CORRECT またはオプション --posix または --re-interval を指定すれ
    846       ば利用できる様になるが、nawk/mawk はそういうオプションすらない。
    847 
    848     * 正規表現 A?A? は mawk では最初の A? しか一致しない。
    849 
    850       これは明らかにバグの気がするがどうなのだろうか。
    851 
    852     * 16進リテラル 0xHHHH は gawk でしか使えない。
    853 
    854 2021-05-01
    855 
    856   * ble.sh 初期化時の Bash 設定に対する対策 [#M0018]
    857 
    858     ble.sh が set -euxv -o posix や FUNCNEST=0 等特殊な状況で呼び出される事がある。
    859     この様な環境ではまともに動作する事ができないので設定を適切な順序で解除してい
    860     く必要がある。
    861 
    862     set -eu に関しては適切な記述方法を取れば回避する事ができるので後回しにする。
    863     set -xv に関しても標準エラー出力を適当な物に繋いで置けば回避できる。set -o
    864     posix が設定されていると関数を定義できない。その他の振る舞いにも注意が必要だ
    865     ろう。alias も何が定義されているか分からないので出来るだけ expand_aliases を
    866     off にする方向で考えたい。
    867 
    868     現在の実装では以下の順にチェック・対策を行っている。
    869 
    870     1 最初の引数解析 (POSIX shell 準拠): この部分は別のシェルで起動した場合などで
    871       も引数解析の結果などを表示する為に対策よりも前に処理する。alias で { や if
    872       が書き換えられている事によって失敗しても、シェルが全く操作できなくなるとい
    873       う事はないだろうし、ユーザー側の責任とする。
    874 
    875     2 Bash のバージョンチェック。これをしないとそもそも対策コード自体動くか怪しく
    876       なってくるので先にチェックする必要がある。これもシェルが全く操作できなくな
    877       るという事はないだろうという事で、ユーザー側の責任とする。
    878 
    879     3 expand_aliases
    880     4 FUNCNEST
    881     5 set +o posix
    882 
    883       この三つを設定すれば取り敢えず安全に関数を定義して実行できる。
    884 
    885     6 reset-builtins
    886 
    887       builtin が上書きされてしまうのを防ぐ為。
    888 
    889     7 adjust-options (set +euxv; shopt -u nocaseglob; shopt -u expand_aliases)
    890 
    891 2020-05-11
    892 
    893   * Bash の HISTTIMEFORMAT 振る舞いのまとめ [#M0017]
    894 
    895     ref #D1351
    896 
    897     * Bash は、HISTTIMEFORMAT の値に関係なく、コマンドの時刻を常に内部
    898       的に管理している (#0x10 の件を考えると文字列で記録している疑いが
    899       ある)。HISTTIMEFORMAT が設定されている時、history コマンドで出力
    900       されるコマンド履歴に時刻が出力される。
    901 
    902     * 変数 HISTTIMEFORMAT が存在する時 (空文字列や unset も含む)、Bash
    903       は履歴ファイルに #%s の形式で時刻を保存する。
    904 
    905     * 履歴ファイルからコマンドを読み取る時、直前に #%s があればそれを
    906       コマンドの時刻とする。それ以外の時はコマンドの時刻は bash の起動
    907       時刻とする。これは HISTTIMEFORMAT の状態に関係ない。
    908 
    909       履歴ファイルから読み取る時には単一行モードと複数行モードがある様
    910       だ。変数 HISTTIMEFORAMAT が存在 (空文字列や unset も含む) してか
    911       つファイルの先頭行が #%s の時に複数行モードになる。
    912 
    913       時刻行は "#数字" で始まっているかどうかで判定する。先頭または #
    914       と数字の間に余分な空白が含まれている場合は時刻行ではない。"#整数
    915       " の後に別の文字列があったとしてもそれは無視される。但し、"#0"
    916       で始まっている時だけは行全体を時刻と見做すようで、余分な文字列が
    917       あると history で出力する際にエラーになる。
    918 
    919     * history コマンドの出力は HISTTIMEFORMAT が非空文字列の時にタイム
    920       スタンプが出力される。
    921 
    922       HISTTIMEFORMAT が設定されていても空文字列の時には処理は行われな
    923       い。これは通常の見た目の振る舞いでは区別がつかない (処理していて
    924       も処理していなくても出力に違いは出ない) が、履歴ファイルに #0xxx
    925       の様な無効なタイムスタンプが含まれていた時の振る舞いで分かる。
    926 
    927     * shopt -s lithist は、for 等の文法的に複数行に跨るコマンドについ
    928       て、そのままの形でコマンド履歴に登録する。単にコマンドラインで複
    929       数行を入力して実行しても改行で分割してコマンド履歴に登録される。
    930 
    931       これはコマンドを実行した時に Bash プロセスの内部のコマンド履歴に
    932       登録する際に影響を与える物であって、履歴ファイルへの書出しや履歴
    933       ファイルからの読み出しには影響を与えない様である。
    934 
    935     現在の ble.sh サポートの制限について。
    936 
    937     * mlfix: bash-4.4 以降では複数行コマンドを history -r で読み出せるが、
    938       bash-4.3 以前では複数行コマンドは history -s で構築せざるを得ない。
    939       従って複数行コマンドに関しては正しくコマンド時刻を復元できない。
    940 
    941 2020-05-06
    942 
    943   * trap: DEBUG/RETURN trap のまとめ [#M0016]
    944 
    945     DEBUG trap は設置した関数内で有効。set -o functrace (set -T) が設
    946     置されている時または呼び出される関数に declare -tf を設定している
    947     時にのみ呼び出される関数に継承される。trap -p の出力は現在処理して
    948     いる関数毎に異なる (継承しない場合は DEBUG/RETURN trap に対しては
    949     何も出力されない)。
    950 
    951     DEBUG: bash-4.3 以下では設置した関数の呼び出し元には影響はないが、
    952     bash-4.4 以降では呼び出し元の DEBUG trap も上書きする。DEBUG trap
    953     を削除した場合には、呼び出し元には影響は与えない。DEBUG trap の中
    954     では DEBUG trap は発火しない。
    955 
    956     RETURN:
    957 
    958     * BASH_COMMAND には最後に関数内で実行したコマンドが入っている。
    959       return を使った場合にはそれが、関数の末端で終わった場合には最後
    960       のコマンドが入っている。
    961     * RETURN trap は関数内部で実行されるので、return を呼び出して終了
    962       ステータスを変更する事ができる。但し、条件をつけないと、RETURN
    963       trap の return に対して再び RETURN trap が発火して無限ループにな
    964       るので注意する。
    965     * RETURN trap の中では RETURN trap は発火しない。それ以外の trap
    966       では発火する。
    967 
    968     BASH_LINENO, BASH_SOURCE, FUNCNAME についてはまだ詳しく調べていない。
    969 
    970 2020-04-14
    971 
    972   * ${###} 等のパラメータ展開・変数展開について [#M0015]
    973 
    974     Bash のパラメータ展開 #D1330
    975 
    976     <param>
    977 
    978     - 位置パラメータ: 1 2 ...
    979     - 特殊パラメータ: * @ # ? - $ ! 0 _
    980     - 変数名: /_[[:alpha:]][[:alnum:]]*/ の形式
    981     - 配列名[添字]
    982       添字はシェル展開の対象で配列の時は算術式の対象
    983     - 配列名[@], 配列名[*]
    984 
    985     <modifier>
    986 
    987     - @A 変数の定義
    988     - @a 変数の属性
    989     - @Q @E @P 値を加工する
    990       これらの ops は展開の対象ではない。つまりvar=A として ${xxx@$var} とはできない。
    991     - #, ##, %, %%
    992     - /, //, /#, /% (クォートとの兼ね合い)
    993     - ^ ^^ , ,, ~ ~~
    994       Note: ~ については https://qiita.com/t_nakayama0714/items/80b4c94de43643f4be51 に書いてあった。
    995     - = + - ? := :+ :- :?
    996     - :offset, :offset:length
    997 
    998     * $<param>
    999       Note: 配列, 2桁以上の位置パラメータは使えない。
   1000 
   1001     * ${...} の例外規則
   1002 
   1003       * ${#<param>}
   1004         ${#@}, ${#*}, ${#a[@]}, ${#a[*]} は要素の数。
   1005         それ以外については文字の数。
   1006 
   1007       * ${!var@} ${!var*}
   1008 
   1009       * ${!arr[@]} ${!var[*]}
   1010 
   1011     * ${<param><modifier>}
   1012     * ${!<param><modifier>}
   1013 
   1014       * ! で始まる物については ${<param>} を変数名とする。
   1015 
   1016         Note: <param> は !, $ 以外でなければならない様だ。
   1017 
   1018         $@ $* ${arr[@]} ${arr[*]} の時には "$*" などを変数名と見做す。
   1019         つまり、普通に ${!arr[*]##} 等とすると要素が1個の時以外はエラーになる。
   1020         (arr=(a b c); IFS=; abc=4321; echo "${!arr[*]##}") 等とすると動く。
   1021         (arr=(a b c); IFS=; abc=4321; echo "${!arr[@]##}") は動かない。
   1022 
   1023     ★${!#} で最後の引数を取れる。${@:$#} でも行ける。
   1024       但し、引数がない場合は $0 に展開される事に注意する。
   1025 
   1026 2020-04-07
   1027 
   1028   * bashrc に於ける history の操作について [#M0014]
   1029     初回の history -nrs の実行時に "未初期化" であれば初期化を行う。
   1030     "未初期化" の判定は履歴がその時に空であるかどうかによる。
   1031 
   1032     * "未初期化" の時に history -awcd を呼び出した時は何も実行しない。
   1033     * "未初期化" の時に history -nrs を呼び出した時は、
   1034       履歴ファイル (HISTFILE) を読み取って初期化した後に要求された操作を実行する。
   1035       これは bash の動作とは異なる。bash は履歴ファイルを読まずに操作を実行する。
   1036       その後で何らかの条件で履歴ファイルの読み取りを最初のプロンプト表示の前に行う。
   1037     * history -p に関しては "未初期化" かどうかに関係なく、そのまま実行する。
   1038 
   1039     bashrc の中で history -r を実行すると履歴の倍加が発生する。
   1040     但し、実行時だけで記録される履歴ファイルは倍加しない。
   1041 
   1042 2019-06-10
   1043 
   1044   * history -na の動作に就いて [#M0013]
   1045 
   1046     * どのコマンド以降を新しいものとして取り扱うのか。という事について。
   1047       特に他の Bash が bash_history に書き込んだ新しいコマンドを読み取った時、
   1048       次に自分が history -a する時にどの範囲のコマンドを追加するのだろうかという事など。
   1049 
   1050       まとめると Bash の動作は恐らく以下の様になっている。
   1051       先ず Bash は2つの変数を使っている。ここでは read_index と write_index と呼ぶ事にする。
   1052       read_index は history -n で HISTFILE から次に読み出すべきコマンドの行番号を保持する。
   1053       write_index は history -a で次に HISTFILE に書き込むべき history 内のコマンドの番号を保持する。
   1054       Bash の起動時には read_index も write_index も同じ値に初期化される。
   1055       history -n を実行すると read_index は HISTFILE の行数に再設定される。
   1056       write_index は読み取った行数だけ増加する。
   1057       history -a を実行すると write_index は history の項目数に再設定される。
   1058       read_index は書き込んだ行数だけ増加する。
   1059 
   1060       この動作に従うと history -n; history -a や
   1061       history -a; history -n を実行すると問題が生じる事になる。
   1062       書き込み済みのデータ・読み取り済みのデータが混ざった時に正しく範囲を表現できない。
   1063       この事が理由で巷にある同期の設定では history -a; history -cr を実行しているのである。
   1064 
   1065     * HISTCONTROL=erasedups
   1066       試してみたが erasedups が設定されていたとしても history -n で新しく読み取った
   1067       コマンドと同じ名前のコマンドを削除するとかそういう事は別にしない様である。
   1068 
   1069 2019-02-13
   1070 
   1071   * keymap: 以下のキーについては既定では同じ動作になる様に設定する事にする [#M0012]
   1072     ref #D0929, #D0752
   1073 
   1074     - DEL C-? / BS C-h
   1075     - NUL C-@ C-SP
   1076     - RET C-m
   1077     - TAB C-i
   1078     - C-_ C-DEL C-BS
   1079 
   1080 2019-01-01
   1081 
   1082   * vi: inclusive/exclusive motion の実装に関して [#M0011]
   1083 
   1084     exclusive な motion は exclusive-goto.impl を呼び出す。
   1085     inclusive な motion は inclusive-goto.impl を呼び出す。
   1086     何れの場合も範囲を修正の後に exclustive-range.impl に委譲する。
   1087 
   1088 2018-08-31
   1089 
   1090   * decode: 端末の送信するキーシーケンスについて [#M0010]
   1091 
   1092     * back (BackSpace)
   1093       xterm は back に対して BS (C-h) を送る。
   1094       C-back に対して DEL (C-?) を送る。
   1095       一方で、mintty, RLogin では back に対して DEL (C-?) を送る。
   1096       C-back に対して C-_ を送る。
   1097 
   1098     * modifyOtherKeys(2)
   1099 
   1100 2018-08-05
   1101 
   1102   * compgen に指定した単語のクォート除去に関して [#M0009]
   1103 
   1104     参考: #D0714
   1105 
   1106     生成するコマンドの種類と、バージョンによってクォート除去されたりされなかったりする。
   1107     以下に、クォート除去されることを期待してクォートしても問題がないかをまとめる。
   1108 
   1109       compgen -A command   クォート不可
   1110       compgen -A directory クォート不可 (Bash-4.3 以降でクォート除去されない※1)
   1111       compgen -A file      クォート不可 (Bash-4.0, 4.1 でクォート除去されない※2)
   1112       compgen -A function  クォート可
   1113       compgen -A variable  クォート可
   1114       compgen -A arrayvar  クォート可
   1115 
   1116     ※1 バグと思われる。ble をロードしていると何故かクォート除去されている。
   1117       然し、--norc や ble ロードなしで実行するとクォート除去されない。
   1118       クォート除去が実行されなくなってしまう条件が分からないのでこれは使わない。
   1119 
   1120     ※2 バグと思われる。
   1121 
   1122 2017-10-31
   1123 
   1124   * ble 関数の典型的な終了ステータスについて [#M0008]
   1125 
   1126     127 適切な widget が見つからなかった:
   1127       (由来: Bash でコマンドが見つからなかった時の値)
   1128 
   1129     126 処理をキャンセルするとき:
   1130 
   1131       install-hook した trap に関して、blehook internal_NAME 経由で trap の発火
   1132       をキャンセルする時に返す値。
   1133 
   1134       廃止: widget を呼び出すことができなかった (未使用)
   1135 
   1136     125 widget を呼び出したが適切な処理が見つからなかった:
   1137 
   1138       __defchar__ に登録した widget がこれを返したとき
   1139       次のハンドラを用いる。具体的には __default__ の呼び出しを試みる。
   1140 
   1141     147 ユーザの入力を非同期に待つ為に一時停止した:
   1142 
   1143       ble/util/idle の処理に於いて条件待ち状態に入る時や、widget に於いてユーザ
   1144       の入力を待つ為に、自発的に一時中断した時に返す値。
   1145 
   1146     148 ble/util/idle や isearch や complete に於いて、ユーザ入力を処理する為に
   1147       一旦現在の処理を中断する時に返す値。vi-mode のオペレータが 148 を返したと
   1148       き後処理を実行せずにそのまま抜ける (由来: 128+SIGTSTP)
   1149 
   1150     124 プログラム補完において補完の再実行を要求する
   1151       (由来: これは Bash の仕様に倣った)
   1152 
   1153     27 widget の動作がユーザによってキャンセルされた (由来: ESC = 27)
   1154 
   1155     6 ble-update で更新の必要がなかった時に内部的に使用 (由来: ACK = 6)
   1156 
   1157     2 コマンドの使い方が異なる
   1158 
   1159     3 ble/util/bgproc は named pipes がシステムでサポートされていない時に 3 を返す。
   1160 
   1161 2017-10-18
   1162 
   1163   * ble-decode: widget に関して [#M0007]
   1164 
   1165     __defchar__ および __default__ に登録された widget が 125 を返した時、
   1166     その入力に対する適切な処理が見つからなかったことを表します。
   1167     この時、次のハンドラの探索が行われます。
   1168     次のハンドラがない場合には対応するものが見つからなかったというエラーになります。
   1169 
   1170 2017-09-24
   1171 
   1172   * vi-mode 以下は現在のところ対応しない予定である [#M0006]
   1173 
   1174     * 2017-09-24 vi-mode: % で用いる matchpairs には現在対応しない
   1175 
   1176     * 2017-09-17 vi-mode (insert mode/newline):
   1177       インデントを挿入するが何もしなかった時にそれを削除することには対応していない。
   1178 
   1179       これは実際の所、挿入モードにおける移動と抜ける時の処理において、
   1180       細工を行えば対応できる。現在の挿入モードの操作の繰り返しの記録の仕組みも使えるが、
   1181       もっと別の仕組みを用意しても良い気がする。
   1182 
   1183     * 2017-09-12 vi-mode: タブ文字上にカーソルがある時のカーソルの表示位置
   1184 
   1185       後、気付いたことはタブ文字に居る時のカーソル位置は、
   1186       ノーマルモードにいるときはタブ文字の最後の位置である。
   1187       要するに p で挿入される位置を示しているとも言える。
   1188       でも全角文字の場合にはちゃんと全角文字の先頭にカーソルが来る。
   1189       この動作は分かりにくいし更に言うと現状の ble.sh の描画コードでは対応していない。
   1190       これには取り敢えず対応しないことにする。
   1191 
   1192     以下は積極的に対応する予定はない。
   1193     将来的に対応する場合の注意点がある場合も含む。
   1194 
   1195     * 2017-10-11 M ( ) [[ ]] { } :s :tag
   1196       これらのコマンドは "ジャンプ" なので、$flag なしで実際にジャンプに成功する場合には
   1197       set-local-mark 96 をする必要がある。
   1198 
   1199     * done: 2017-10-09 取り敢えず今の所はスクロール (C-b C-d C-e C-u C-y など) には対応しない
   1200       →これは #D0886 で対応した。
   1201 
   1202 2017-09-08
   1203 
   1204   * vi-mode: 以下のリンクで重要そうなコマンドの一覧が見られる [#M0005]
   1205 
   1206     http://qiita.com/sfuta/items/0de4ead865c15e9e9b68 ?
   1207     http://qiita.com/sfuta/items/2d646396a6117c8e53e5 g? z?
   1208     http://qiita.com/sfuta/items/fd78f3ece8861f8142ee C-w? [? ]?
   1209     http://vim-jp.org/vimdoc-ja/vimindex.html
   1210     http://vim-jp.org/vimdoc-en/vimindex.html
   1211 
   1212 2015-11-28
   1213 
   1214   * デモ画像の作り方 [#M0004]
   1215 
   1216     * ble-0.2 のデモ画像はキャプチャソフトを使った (ref #D0926)
   1217 
   1218       - Cygwin の mintty を用いた。
   1219         画面の幅は56列にし文字の大きさは14程度が良い。
   1220       - キャプチャソフトには LICEcap というソフトウェアを使った。
   1221       - キー入力を表示するソフトには KeyCastOW を改造した物を用いた
   1222         https://github.com/akinomyoga/KeyCastOW
   1223 
   1224       ble-0.1 の時に行った基本的な操作に加えて、
   1225       ble をダウンロード・展開して試してみるところも含めた。
   1226 
   1227     * ble-0.1 のデモ画像は ttyrec & seq2gif を用いて作成した
   1228 
   1229       準備
   1230       $ # PS1=$'[\e[4;38;5;202mfoo@bar\e[m \\j \\W]\\$ '
   1231       $ TTYREC=1
   1232       $ ttyrec demo.tty
   1233 
   1234       echo hello, world
   1235       printf hello
   1236       [[ a == b ]]
   1237       echo "hello $(echo bash $(echo world))"
   1238       C-r for
   1239       echo 'select, copy and paste' コピーする
   1240       echo insert mode -> overwrite mode
   1241       ls
   1242       echo complete ble-TABdTAB histexpand !#:2
   1243       echo "$HIST[TAB]"
   1244 
   1245       $ seq2gif -f 0 -b 15 -h 14 --render-interval=10 -p rosa --play-speed=1.5 < demo.tty > demo2.gif
   1246 
   1247       gif のフォーマット的には 0.01s よりも小さな遅延は設定できない。
   1248       また、現実のブラウザでは 0.02s (50fps) よりも小さな遅延にすると強制的に 0.10 になってしまう。
   1249       更に、Safari や Internet Explorer では 0.06 (16.67fps) よりも小さな遅延は 0.10 になってしまう。
   1250       更に、Windows に附属している viewer では 0.10 よりも小さな遅延は全部 0.10 になってしまう。
   1251 
   1252       [[Frame Delay Times for Animated GIFs by humpy77 on DeviantArt>http://humpy77.deviantart.com/journal/Frame-Delay-Times-for-Animated-GIFs-214150546]]
   1253       [[How to match animation rate of gif files accross browsers (Fenrir Developer's Blog)>http://blog.fenrir-inc.com/us/2012/02/theyre-different-how-to-match-the-animation-rate-of-gif-files-accross-browsers.html]]
   1254       [[Nullsleep | Jeremiah Johnson - Animated GIF Minimum Frame Delay Browser Compatibility Study>http://nullsleep.tumblr.com/post/16524517190/animated-gif-minimum-frame-delay-browser]]
   1255 
   1256 
   1257 2015-08-14
   1258 
   1259   * [memo] builtin check [#M0003]
   1260 
   1261     eval "grc --color --exclude=./test '\b(builtin[[:space:]]+)?$command\b' | grep -Ev '\bbuiltin[[:space:]]+$command\b'"
   1262 
   1263   * [memo] leak variables check [#M0002]
   1264 
   1265     ble/debug/leakvar#list を実行する。
   1266 
   1267     ble/debug/leakvar#reset var
   1268     ...
   1269     ble/debug/leakvar#check var tag1
   1270     ...
   1271     ble/debug/leakvar#check var tag2
   1272 
   1273   * [memo] 解析(ble-syntax/parse)の際の原則 [#M0001]
   1274 
   1275     データ配列とは _ble_syntax_stat, _ble_syntax_nest, _ble_syntax_tree を指すとする。
   1276     或る点 p1 から或る点 p2 に解析を進める場合を考える。
   1277 
   1278     1 この時データ配列に対する変更は p1-p2 (exclusive) の間にだけ行われる。
   1279       これは解析状態の復元と再開が適切に動作する為に必要である。
   1280 
   1281     2 解析の過程でデータ配列に格納されている情報は使用しない。
   1282       これは解析状態の一致チェックの為に必要である。
   1283       データ配列の内容に依存して動作が代わる場合、
   1284       解析状態が一致しても解析結果が異なってしまう可能性があり、不整合を生む。
   1285 
   1286       但し、_ble_syntax_nest については専用の関数を通して 0-p2 の任意の場所を参照しうる。
   1287       これ(専用の関数を通して得られる情報)については
   1288       解析状態の一致チェックの対象に含まれているからである。
   1289       (_ble_syntax_nest の任意の情報を参照して良いという意味ではない。)
   1290 
   1291     tree-append および nest-pop に対する制限
   1292 
   1293       tree-append は _ble_syntax_tree[i-1] に格納を行う。
   1294       従って上記の条件1から p1<=i-1 つまり p1+1 <= i である必要がある。
   1295       これは少なくとも 1 文字 i を進めてからでないと tree-append を呼び出せないという事である。
   1296       nest-pop も内部的にそのまま tree-append を呼び出しているので同じ制限がある。
   1297 
   1298 
   1299 *******************************************************************************
   1300     bug-bash, third-party bugs & reviews
   1301 -------------------------------------------------------------------------------
   1302 
   1303 2023-02-20
   1304 
   1305   * review: completion 自動生成
   1306 
   1307     argument-parser と一緒に completion を自動生成する試みがある。
   1308 
   1309     - spf13/cobra や rsteube/carapace 等の仕組み。
   1310 
   1311     - https://github.com/adoyle-h/bash-completor
   1312 
   1313     - ble.sh でも最初期に getopts interface を実装して、これだけで引数パーサー
   1314       と同時にそれと consistent なコマンド依存単語着色を実装しようと試みた。結
   1315       局、これは argument parsing 速度が遅いという事で放棄されて
   1316       archive/getopt1.sh に眠っているが、直接実行するのではなくて、事前に関数を
   1317       生成して置くという方式にすればそれは気にしなくても良いのかもしれない (但
   1318       しその分だけ footprint が大きくなる)。実のところ ble-face だとか ble-bind
   1319       の様に初期化時に大量に呼び出される物でなければ、別に其処まで速度を気にす
   1320       る必要はない気もする。
   1321 
   1322     - 最近もシェルで getopts と同時にヘルプ等も自動的に生成しようという試みがあ
   1323       る。これである。
   1324 
   1325       https://github.com/ko1nksm/getoptions
   1326 
   1327     - 他にも類似の物が定期的に github 上に現れる気がするが忘れた。
   1328 
   1329     ble.sh 的には以下の物を同時に全てしてくれるととても良い。
   1330 
   1331     - 引数解析器
   1332     - 引数補完候補生成
   1333     - 単語着色
   1334     - 引数指定方法のエラーの検知、診断情報の取得、修正候補の生成
   1335 
   1336     一般的な枠組みとしては更に以下の様な物もあると便利なのだろう
   1337 
   1338     - ヘルプ自動生成
   1339     - 引数に関する単体テストの自動生成 (特殊ファイル名、巨大数、etc.) →でも正
   1340       しく動作しているかどうかの判定は別で書かなければならないのでは?
   1341 
   1342 
   1343 2023-02-14
   1344 
   1345   * bug-bash: bash-5.2 で -u extquote しても ${var//[$'\n']} が改行を削除する。
   1346 
   1347 2023-02-06
   1348 
   1349   * bug-bash: 実は colored-stats は本来 LS_COLORS を反映するらしい。然し、
   1350     readline 初期化前に設定されている必要がある。colored-stats も bind 等ではな
   1351     くて inputrc 経由で有効にしなければならない様だ。
   1352 
   1353 2023-01-31
   1354 
   1355   * review: bash libraries
   1356 
   1357     https://blog.fascode.net/2022/05/05/fasbashlib/
   1358     https://github.com/Hayao0819/FasBashLib ... これはライブラリ構成としてある
   1359     べき形を一通り備えている様に思える。具体的な関数としてどれだけ非自明なもの
   1360     が用意されているのかは余り確認していない。Common.sh を見ると悪しき set -Eeu
   1361     -o pipefail を前提としている。GNU toolchain を要求している。fork を減らすな
   1362     どの効率化については余り意識されていない気がする。結構 trivial なものまで関
   1363     数として定義されている。うーん。ForEach だとか Array.Length だとか、既に
   1364     bash に機能的に存在している物まで関数で wrap したり pipe 化したりと、syntax
   1365     sugar 的な関数が多く、実践志向ではない。或いは minimalism 的潔さはない。ラ
   1366     イブラリ構成としてメタ的な機能(naming convention 変換, etc)を揃えているので
   1367     良さそうと思ったが、それも namespace の模倣のために整えられた枠組みの副産物
   1368     と見るのが良い気がする。
   1369 
   1370     FasCode project の一部? で、これは何かと検索すると Alter Linux という日本産
   1371     Linux distribution を有志で作っている集まりだろうか? Arch based. Issues を
   1372     見ると日本語メインのコミュニティーで 373 stars. 他に Serene Linux というの
   1373     も作っていて Ubuntu-based -> Fedora-based に変更したと書いている。作ってい
   1374     るのは学生の集団らしい。
   1375 
   1376 2023-01-26
   1377 
   1378   * review: コマンド履歴データベースの設計
   1379 
   1380     fish はファイル名に一致する引数を覚えている。これにより autosuggestions で
   1381     は、コマンドライン中のファイル名が現在していない時にはそのコマンドはスキッ
   1382     プするという具合の振る舞いをする。
   1383 
   1384     https://github.com/ellie/atuin ... 暗号化・ホスト間共有・C-r拡張・各種統計
   1385 
   1386     https://github.com/jcsalterego/historian ... 単に .bash_history を検索するだけ
   1387 
   1388     https://github.com/ddworken/hishtory ... custom column として git_remote が
   1389     紹介されている。git remote 単体が便利かどうかは分からない。sqlite3 だと
   1390     column を dynamical に追加するのは難しそう。一方で git の commit id を一緒
   1391     に記録するというのは一つの可能性である。
   1392 
   1393     https://github.com/larkery/zsh-histdb ... 実は同じ名前で zsh にもその様な
   1394     plugin が存在している様である。中を除いてみたら実装はかなり近い形になってい
   1395     る。履歴を表示するコマンドも用意しているが、余り細かい操作を実行できる訳で
   1396     もない様だ。
   1397 
   1398 2022-06-26
   1399 
   1400   * またもや tempenv=... builtin eval ':;echo $tempenv' のバグに引っ掛かった。
   1401     これはやはり直して貰いたい。
   1402 
   1403 2022-02-15
   1404 
   1405   * tmpenv builtin eval vs DEBUG trap
   1406     Ref #D1772
   1407 
   1408     function print { echo "v=${v:-(not found)}"; }
   1409     function trapdebug { echo "$FUNCNAME:1:v=($v)"; }
   1410     builtin trap 'trapdebug' DEBUG
   1411     v=xxxx eval print
   1412     v=xxxx builtin eval print
   1413 
   1414     以上に於いて builtin eval print で実行される print に対する DEBUG trap の中
   1415     から v=xxxx が見えない。eval print の時にはちゃんと見えているので意図的な振
   1416     る舞いとも思われない。
   1417 
   1418 2022-01-23
   1419 
   1420   * wezterm, bash-preexec に対する patch を終結させる。
   1421 
   1422     * bash-preexec に API 安定化のお願いをする → これは PR を出したが返事がない。
   1423       時々活動はあるみたいなので少しでも反応があった時に改めてお願いする事にする。
   1424 
   1425   * bash-preexec は既存の DEBUG trap を正しく実行できていない様に思われる
   1426 
   1427     $ trap 'echo XXX' DEBUG
   1428     $ echo 1; echo 2; echo 3
   1429     XXX
   1430     1
   1431     XXX
   1432     2
   1433     XXX
   1434     3
   1435     $ source bash-preexec.sh
   1436     XXX
   1437     XXX
   1438     XXX
   1439     $ echo 1; echo 2; echo 3
   1440     XXX
   1441     1
   1442     2
   1443     3
   1444 
   1445     これは意図的な物なのだろうか。。と思ったら以下に議論がある。
   1446 
   1447     https://github.com/rcaloras/bash-preexec/issues/52
   1448     https://github.com/rcaloras/bash-preexec/pull/54
   1449     https://github.com/rcaloras/bash-preexec/pull/109
   1450 
   1451     o ユーザーが trap DEBUG etc を実行しても破壊されない。
   1452     o DEBUG trap の overhead がない。
   1453     o 他の枠組みが DEBUG trap を設定・削除しても問題が起こらない。
   1454 
   1455 2021-12-11
   1456 
   1457   * bash-completion
   1458 
   1459     2022-02-02
   1460 
   1461     * [DraftPR で修正済み] _services が failglob で問題を起こしている。
   1462 
   1463       _comp_init_set_up_service_completions も駄目。うーん。failglob ではある
   1464       がこれは自分が修正している途中の物ではない新しい物だろうか? →これは既に
   1465       fix-failglob の中に含まれていた。
   1466 
   1467     * [修正済み] rsync で *-from が云々という failglob が発生している
   1468       →これは最新版では既に修正されている。
   1469 
   1470       結局ロードして欲しい bash-completion が全然ロードされない。何故 → 結局ロー
   1471       カルの場所ではなくて其処で make install されている物が読み出されている様だ
   1472       が、make install しても何故かずっと古いままという状態になっている様だった。
   1473       autoreconf -i をし直して実行したらちゃんと新しい物に置き換えられた。make 自
   1474       体がちゃんと動いていなかったという事になるのだろうか。何れにしてもこれでちゃ
   1475       んと動く様になった。
   1476 
   1477     2022-01-23
   1478 
   1479     683 にも unresolved patch suggestion がある。
   1480     https://github.com/scop/bash-completion/pull/687#discussion_r790203991 : IFS=$'\0' in mount
   1481     https://github.com/scop/bash-completion/pull/687#discussion_r790203132 : mechanism of save/restore shopt
   1482 
   1483     2022-01-11
   1484 
   1485     * bash-completion: curl の抽出オプションが極端に少ないのは何故か→これは
   1486       curl --help は最低限のオプションしか表示しないから。そして --help all を
   1487       呼び出せば全部表示される。確認すると --help all は指定されているが、quote
   1488       されていない。
   1489 
   1490       類似の問題が過去にあったがその時に一緒に直されなかったのかと思ったが、こ
   1491       れが正にその時の問題であって、test などが用意されていなかった為に未だマー
   1492       ジされていないのだった。
   1493 
   1494       https://github.com/scop/bash-completion/pull/560
   1495 
   1496     2021-12-22
   1497 
   1498     * fixed: man の中で _expand を呼び出しているが意味ないのでは? info も同様。
   1499 
   1500     * man の _expand の直後にある eval は危ない気がする。
   1501       →これは別項目で議論する。
   1502 
   1503       info にも同様の問題が存在する。
   1504 
   1505     * grc '&& [^[:space:]]+ \|\|'
   1506       →何故 SC2015 で検出されないのだろうか? 変数代入の場合には許されるのだろうか。
   1507 
   1508     * command ls $... となっている部分が幾つかある。 -- を付加するべき。
   1509       他にも色々とあるのではないかと思われる。
   1510 
   1511     2021-12-11
   1512 
   1513     * curl --http0, --http1, --proxy1 等存在しないオプションが生成されている
   1514     * printf -v varname
   1515     * test, [ の引数の文法に従った補完
   1516 
   1517 2021-12-08
   1518 
   1519   * space
   1520 
   1521     https://space.sh/
   1522     https://github.com/space-sh/space (7k LoC)
   1523     https://github.com/space-sh/space/blob/master/completion/init_autocompletion.sh
   1524 
   1525   * bashible というフレームワークでは関数名は ble_ で始まる様だ。
   1526 
   1527   * bash-dev: "help test" の -n の引数に STRING が二回登場している。
   1528 
   1529     →と思ったが、これは分かった。 [[ -n STRING ]] と [[ STRING ]] の二種類の指定の仕方を
   1530     両方載せているというだけの話である。
   1531 
   1532 2021-09-22
   1533 
   1534   * bash-it で気になる事
   1535 
   1536     * bash-it disable alias を実行すると何も表示されず何も実行されない。
   1537     * bash-it --help もしくは bash-it で色々表示されるが、明らかに表示されてい
   1538       ないコマンドが存在している。
   1539     * bash-it update に外部から登録できる機能?
   1540     * bash-it に自動でインストールする機能もつける可能性について
   1541 
   1542   * bash-5.2
   1543 
   1544     $ i=0; b=$(< "file${a[i++]}"); echo "$i"
   1545     1
   1546 
   1547     $ f=; b=$(< "${f:=file}"); echo "$f"
   1548     file
   1549 
   1550     $ i=0; b=$(< "file$((i=123))"); echo "$i"
   1551     123
   1552 
   1553     $ RANDOM=0; echo "$RANDOM"
   1554     20814
   1555     $ RANDOM=0; b=$(< "$RANDOM"); echo "$RANDOM"
   1556     24386
   1557 
   1558     うーん。これに関しては zsh も ksh も副作用を残す形に実装している様だ。つま
   1559     り、$(< ...) は特別な構文として同じシェルで評価するものとしているという事。
   1560 
   1561 2021-09-07
   1562 
   1563   * segv: bash-dev -c "declare -A A; unset 'A[\${v[0]}]'"
   1564 
   1565 2021-09-01
   1566 
   1567   * review: bash-raytracer
   1568     https://github.com/aneeshdurg/bash-raytracer
   1569 
   1570     固定小数点で実装している。Issue 1 で遅いから inline 化して微妙に改善したと
   1571     いう話をしているが、その改善したコードは push されていない。
   1572 
   1573 2021-08-30
   1574 
   1575   * review: bash-timestamping-sqlite
   1576     https://github.com/csdvrx/bash-timestamping-sqlite
   1577 
   1578     - typo: synthax -> syntax
   1579 
   1580     - 行末に改行が抜けている事を示すマーカーを表示している。然しこれは CPR を使っ
   1581       ている気がする。実装を見ると __notbottom という関数で判定していてこの関数
   1582       では CPR を使っている。
   1583 
   1584     何れにしてもこれは他の人が組み込んで使える様な plugin ではなくて、一つの完
   1585     結した設定になっている。コードも綺麗ではない。現段階では単に個人用の設定に
   1586     説明がついているものと見るべきの気がする。これに対して色々と他の人が使える
   1587     様に改善の提案をするのは違う気がする。
   1588 
   1589 2021-08-19
   1590 
   1591   * st: st 2>&- で開始しようとすると何も表示されない。st 2>&- 0>&- で開始しよう
   1592     とした場合にはちゃんと動く。これは以下の様に修正するべき。後で送る。
   1593 
   1594     $ NOBLE=1 ./st.master 0>&- 1>&- 2>&-
   1595     $ ./st.master 0>&- 1>&- 2>&-
   1596 
   1597     | diff --git a/st.c b/st.c
   1598     | index ebdf360..a9338e1 100644
   1599     | --- a/st.c
   1600     | +++ b/st.c
   1601     | @@ -793,14 +793,15 @@ ttynew(const char *line, char *cmd, const char *out, char **args)
   1602     |                 break;
   1603     |         case 0:
   1604     |                 close(iofd);
   1605     | +               close(m);
   1606     |                 setsid(); /* create a new process group */
   1607     |                 dup2(s, 0);
   1608     |                 dup2(s, 1);
   1609     |                 dup2(s, 2);
   1610     |                 if (ioctl(s, TIOCSCTTY, NULL) < 0)
   1611     |                         die("ioctl TIOCSCTTY failed: %s\n", strerror(errno));
   1612     | -               close(s);
   1613     | -               close(m);
   1614     | +               if (s > 2)
   1615     | +                       close(s);
   1616     |  #ifdef __OpenBSD__
   1617     |                 if (pledge("stdio getpw proc exec", NULL) == -1)
   1618     |                         die("pledge\n");
   1619 
   1620     メールを投稿してみたが全然以下のページに反映されない。
   1621     ブロックされているのだろうか。或いは初回は手動承認が必要になるという事か。
   1622     maintainer は数日に一回しか返信しない様なので取り敢えず一週間待ってみようと思う。
   1623 
   1624     https://lists.suckless.org/hackers/2108/index.html
   1625 
   1626 2021-07-20
   1627 
   1628   * bashbug: ${text//$'\n'+( )/$'\n'} が滅茶苦茶遅い
   1629     https://www.reddit.com/r/bash/comments/m4ts7j/why_is_this_spacereplacing_parameter_expansion/
   1630 
   1631     この記事では bash はそういう用途に使う物ではないだの何だのと言って別の手法
   1632     を使えと書いているが、明らかにこれは bash のバグである。修正するべきだし修
   1633     正は難しくない筈である。後で観察する事にする。
   1634 
   1635 2021-06-09
   1636 
   1637   * complete: contra x screen-4.99 で auto-menu を有効にしていると、
   1638 
   1639     $ cd .mwg/src/ble.sh/wiki
   1640     $ l backup/[TAB][C-u]
   1641 
   1642     とした以降にコマンド1文字目を入力した時点で glitch が生じる。
   1643     contra がどういうデータを受信しているのか確認する必要がある。
   1644 
   1645     通常の screen では問題は生じない様だ。また contra の代わりに mintty を使っ
   1646     ても問題は生じない。変な文字幅モードが関係している可能性もある。
   1647 
   1648 2021-05-30
   1649 
   1650   * https://github.com/dnmfarrell/jp
   1651     https://www.reddit.com/r/bash/comments/nmzans/jp_a_real_json_processor_in_bash
   1652 
   1653     何か変な事をしている。プロセス置換で読みだした fd に対して読み書きを実行している。
   1654     一体どういう事だろうか…。
   1655 
   1656     $ exec 3< <(:)
   1657     $ echo hello >&3 # これはエラーになる
   1658     $ echo hello >/dev/fd/3 # これは行ける
   1659     $ read -u 3
   1660     $ echo $REPLY # 読める
   1661     $ yes | head -1000000 > /dev/fd/3 # これはやはりブロックする C-c で中止
   1662     $ mapfile -t arr < /dev/fd/3
   1663     $ echo ${#arr[@]} # 32768要素 ("y" + LF)x32768 = 64kB つまりパイプバッファのサイズ
   1664 
   1665 2021-05-27
   1666 
   1667   * declare -p -A として見たら contra の状態が壊れた。何だろうか。
   1668 
   1669 2021-05-23
   1670 
   1671   * bash: いつの間にかに日本語の文字幅の計算がおかしくなっている
   1672 
   1673     [現象]
   1674 
   1675     | ble/util/c2w 及び ble/util/c2w-edit の計算は正しい。新しい bash セッショ
   1676     | ンを開始した時には何も問題は発生しない。つまり、reload を通して壊れるとい
   1677     | う事だろうか。然しそうだとしても不思議な壊れ方である。
   1678     |
   1679     | 何かが変わってしまっているという事なのだろうと思うが新しい bash セッション
   1680     | で発生しない様なので取り敢えずこれの解決は後回しにする事にする。
   1681     |
   1682     | うーん。textmap が可笑しくなっている気がする。
   1683     |
   1684     | と思ったら ble/util/s2c で日に対して 230 が返って来ている。何故だろうか。
   1685     | 実装を確認すると単に printf %d "'日" を実行しているだけである。実際に
   1686     | builtin printf の出力結果がおかしくなっている事を確認した。うーん。不思議
   1687     | な事である。
   1688 
   1689     builtin printf %d "'あ" が正しい値を返さなくなっている。一文字目の文字コー
   1690     ドを返している。実装を見ると mbtowc を呼び出している。失敗したら一文字目の
   1691     コードを返す実装になっている。これにより ble/util/s2c が誤った文字コードを
   1692     返し、そして文字幅計算が間違って textmap に間違いが入る。というのが表示が乱
   1693     れる原因であった。
   1694 
   1695     [再現条件?]
   1696 
   1697     a 新しい bash で ble-reload をしても特に問題は発生しない。
   1698 
   1699     b 一度でも LANG を C 辺りに変更すると問題が発生する様になる可能性? 特に再現
   1700       はしない。LANG を元に戻せば元通りになる。また、問題の発生しているセッショ
   1701       ンで LANG=C して LANG=ja_JP.UTF-8 にして見ても問題は治らない。
   1702 
   1703     ? 或いは設定が異なるのか。bind -v の結果を比較しても shopt の結果
   1704       を比較しても $SHELLOPTS:$BASHOPTS の結果を比較しても同じである。dotglob,
   1705       nullglob の設定の違いはあったがこれを解除しても振る舞いは変わらなかった。
   1706 
   1707     ? 或いは LANG 辺りを unset した痕跡があるだろうか。コマンド履歴を探したが
   1708       unset でも LC でも LANG でも怪しい物は見つからない。実際に unset するなど
   1709       しても特に問題は発生しない。
   1710 
   1711     ? よく分からないので bash を見に行くと builtins/printf.def で mbtowc を呼び
   1712       出して文字を一文字抽出している。この mbtowc の文字コードの設定ができなく
   1713       なっているのが問題なのだろう。うーん。やはり setlocale の問題の気がする。
   1714 
   1715     ? うーん。不思議である ble-detach しても状況は変わらない。然し何故か
   1716       readline の文字幅判定等はちゃんと正しく動作している様である。printf
   1717       \u3042 等もちゃんと動いている。
   1718 
   1719     ? うーん。実際にこのセッションで実行したコマンドの一覧を作って観察して見た
   1720       が特に問題がある様には思われない。特に locale を破壊する様な事が起こると
   1721       は思えない。怪しい物に setsid があるがこれで全てのシェルが駄目になるとい
   1722       う事があるのだろうか。うーん。特に問題は発生しない。
   1723 
   1724     もう全然分からないので exec bash してみる事にする→exec bash したら治った。
   1725     結局どういう事だったのか分からず終いである。結局不明である。C標準ライブラリ
   1726     か Linux のバグなのだろうか。
   1727 
   1728 2021-05-21
   1729 
   1730   * bash: fix a problem that "set -e; builtin eval false || true" exits the shell
   1731     false || true # OK
   1732     eval false || true # OK
   1733     builtin false || true # OK
   1734     builtine eval false || true # 駄目
   1735 
   1736 2021-05-08
   1737 
   1738   * bash: Cygwin でも mapfile/read で unbuffered read に変更できないだろうか。
   1739 
   1740 2021-05-06
   1741 
   1742   * bash: complete -p の -F はやはり quote するべきなのではないか。
   1743     $var となっている場合、!! となっている場合、{1..10} となっている場合。
   1744 
   1745   * bug-bash localvar_inherit: dynamic variables の性質も継承されるのは意図的か。
   1746     Ref #D1532
   1747 
   1748     例:
   1749 
   1750       shopt -s localvar_inherit
   1751       local BASH_COMMAND='xxxx'
   1752       local LINENO='xxxx'
   1753       local RANDOM='xxxx'
   1754 
   1755     * PS1 を評価する為に BASH_COMMAND を一時的に別の物に置き換えたい。
   1756       localvar_inherit を一時的に off にしたり或いは tempvar を通して
   1757       BASH_COMMAND を変更する等すれば一応 BASH_COMMAND を置き換える事は可能だが
   1758       非自明である。
   1759 
   1760     * localvar_inherit は local variable という形で初期化を行わなかった時の振る
   1761       舞いを制御する物と思っていたが、実際には上記の様にした場合に影響が出てく
   1762       る。つまり、localvar_inherit の下で上を実行すると set/get がコピーされた
   1763       上で代入が行われる様で、動的変数としての性質が継承される。振る舞いが変わっ
   1764       てしまって困る。特に代入した値が消滅してしまう。
   1765 
   1766     * また、マニュアルを見ても attr 及び value が継承されるとは書かれているが
   1767       dynamic variable としての性質が継承されるとまでは書かれていない (?)。
   1768 
   1769       > info bash より (man bash は本質的に同じ)
   1770       >
   1771       >   localvar_inherit
   1772       >
   1773       >         If set, local variables inherit the value and attributes of a
   1774       >         variable of the same name that exists at a previous scope before
   1775       >         any new value is assigned.  The 'nameref' attribute is not
   1776       >         inherited.
   1777       >
   1778       >   declare
   1779       >
   1780       >         The '-I' option causes local variables to inherit the attributes
   1781       >         (except the 'nameref' attribute) and value of any existing variable
   1782       >         with the same NAME at a surrounding scope.  If there is no existing
   1783       >         variable, the local variable is initially unset.
   1784       >
   1785       > declare --help より
   1786       >
   1787       >   -I    if creating a local variable, inherit the attributes and value of a
   1788       >         variable with the same name at a previous scope
   1789 
   1790     * 他の実装はどうだろうかと思って zsh で RANDOM, LINENO を試してみたが、
   1791       RANDOM に関しては local にしても何も振る舞いの変化は見られず、LINENO に関
   1792       してはそもそも代入不可能だった。そもそも zsh は local var; とすると前のス
   1793       コープの値は保持される単に unset になる。
   1794 
   1795     * 実際にこの継承を行っているのは variables.c:2738 の以下の部分である
   1796 
   1797       variables.c L2738
   1798       > if (localvar_inherit || (flags & MKLOC_INHERIT))
   1799       >   {
   1800       >     /* It doesn't make sense to inherit the nameref attribute */
   1801       >     new_var->attributes = old_var->attributes & ~att_nameref;
   1802       >     new_var->dynamic_value = old_var->dynamic_value;
   1803       >     new_var->assign_func = old_var->assign_func;
   1804       >   }
   1805 
   1806     2021-06-09 SECONDS も影響を受けるだろうか。
   1807 
   1808     より現実的な例として以下の様な場合を考える事ができる。
   1809 
   1810     evaluate_prompt() {
   1811       local BASH_COMMAND=$(HISTTIMEFORMAT=x history 1 | sed '1s/^[[:space:]0-9]*x//')
   1812       result=${PS1@P}
   1813     }
   1814 
   1815     Note: 実は上記の BASH_COMMAND 抽出方法は正確ではない。複数コマンドがある場
   1816     合、本来 BASH_COMMAND は一番最後のコマンドだけを含む。また、HISTCONTROL 等
   1817     によって履歴にコマンドが登録されなかった場合にも結果がずれる事になる。例示
   1818     するならば具体的に結果を無理に模倣しようとせずに、何か適当に内容を書く事に
   1819     するのが良い気がする。例えば、
   1820 
   1821     evaluate_prompt() {
   1822       local BASH_COMMAND='echo "Hello, world!"'
   1823       result=${PS1@P}
   1824     }
   1825 
   1826 2021-05-04
   1827 
   1828   * empty associative array subscripts: これは結局返事がないが ToDo リストに入っ
   1829     ているのかもしれない。或いはそうでもないのかもしれない。何れにしても、今少
   1830     しずつ associative array subscripts の取り扱いの変更が行われているので、そ
   1831     れらが済んでから処理されるのではないか。
   1832 
   1833   * return without arguments in trap handlers. これは結局強い理由がないと変更さ
   1834     れない雰囲気になっている。
   1835 
   1836 2020-12-19
   1837 
   1838   * bug-bash: jobs in trap handlers
   1839 
   1840     以下を実行して端末を resize すると (true) の偽ジョブ情報が出力される
   1841 
   1842       trap '(true); jobs' WINCH
   1843 
   1844     SIGWINCH に限らない。以下を実行して C-c を押しても同様の問題が発生する。
   1845 
   1846       trap '(true); jobs' INT
   1847 
   1848     実は直後の bind -x の中で jobs を実行しても同様。
   1849     一度でもユーザーコマンドを実行すれば偽情報は消える。
   1850 
   1851       trap '(true)' INT
   1852       bind -x '"\C-t": jobs'
   1853 
   1854     2022-07-11 以下でも同様の問題が発生した。これは PROMPT_COMMAND 実
   1855     行中に発生する事である。
   1856     https://github.com/petobens/trueline/pull/46#issuecomment-1179853850
   1857 
   1858 2020-04-25
   1859 
   1860   * starship コマンド実行時間の計測
   1861     preexec と precmd を使っている?
   1862     https://github.com/starship/starship/blob/master/src/init/starship.bash
   1863 
   1864     追記 2022-02-17 これは ble.sh でも類似の物を実装した。
   1865 
   1866   * pipexec という物があるそうだ。と思ったが調べたら C で書かれている。
   1867     https://github.com/flonatel/pipexec
   1868 
   1869   * zsh のテーマである powerlevel10k は実は結構複雑な処理を実装している。
   1870     ごちゃごちゃとした雑多の設定の寄せ集めではない。
   1871     ble.sh 程ではないが単にプロンプトと呼べるレベルを超えている。
   1872     * https://github.com/romkatv/powerlevel10k
   1873     * https://github.com/Powerlevel9k/powerlevel9k
   1874       p9k と initial commit が同じなので再実装というよりは fork の気がする。
   1875 
   1876   * https://github.com/aristocratos/bashtop
   1877     これは最近現れた物で pure bash で色々な UI を実装している。
   1878     オプション引数はなく設定は直接編集する様になっている。
   1879     背景が明るい時の配色に対応していない。256色要求。
   1880 
   1881     * 実用性よりも見た目重視。これはツールの性格による。
   1882       ble.sh 自体は他のプログラムを呼び出す為の物なので主張は控え目。
   1883       然し、宣伝の為には見た目を派手にした物も必要なのかもしれない。
   1884     * 何故か現れたばかりなのに 6.3k も集まっているし、
   1885       一体何が起こるとこのように話題になるのだろうか。不思議である。
   1886       HN にも reddit にも大して人気になった物は見られない。
   1887       何処から広まってどう人気になったのか不明である。
   1888     * freebsd, aur, debian, fedora/centos にまでパッケージが在る。
   1889 
   1890 
   1891 @todo
   1892 *******************************************************************************
   1893     ToDo
   1894 -------------------------------------------------------------------------------
   1895 
   1896 * bump 時にする事
   1897   - version up in README
   1898   - Copyright year
   1899   - Acknowledgments
   1900   - todo 項目の整理
   1901   - leakvars
   1902   - version up in GNUmakefile
   1903   - note.txt に含まれるログの移動 -> done.txt
   1904   - keymap の移動 (これは別 commit にする?)
   1905   - make_command.sh の整理 (scan 分離, char_width 分離)
   1906   - note.txt -> memo.txt
   1907 
   1908 2023-09-13
   1909 
   1910   * bash-5.2 "\e[\000"
   1911     Ref #D2069
   1912 
   1913     * bash-5.2 で "\e[\000": "<C0><9B>[" という macro になっているのが気になる。
   1914       本来此処には \000 は存在するべきではない。これは実際に内部的に \000 があ
   1915       るのかそれとも出力する時の問題で \000 となっているのか。然し、これは既に
   1916       bash-dev では修正されているし、またそれにもかかわらず bash-dev でも今回の
   1917       問題が起こっているので、これは今回の問題には関係ない。
   1918 
   1919       これは以前にも気付いていた事の気がする。探してみたら 2021-11-05 に項目が
   1920       あってしかも放置されている。何れにしても 5.3 では修正されている。実際の振
   1921       る舞いに影響があるのかどうかは不明である。
   1922 
   1923       うーん。これは bash-5.2 のソースコードを使って何が起こっているか確認する
   1924       べきなのかもしれない。或いは bisect を実行する。bind に使っているスクリプ
   1925       トはどこかに出力する事ができる筈である。或いはキャッシュになっている →
   1926       キャッシュにあった。確認すると builtin bind '"\e[":"\xC0\x9B["' で bind
   1927       しているので実行するコマンド自体が壊れていたとかそういう事ではないはず。
   1928 
   1929     * どうやら単に以下を実行しただけで既に再現する。
   1930 
   1931       $ bash-5.2 --norc
   1932       $ bind '"\e[":"abcd"'
   1933       $ bind -s
   1934 
   1935       そして M-[ を押すと (多少の keymap delay の後に) abcd が入力される。つま
   1936       り、実際に \e[\000 が束縛されているというよりは表示の際に変な表示になって
   1937       しまっているという事の気がする。
   1938 
   1939       これが実際に何らかの問題を具体的に引き起こす事はあるだろうか。そもそも通
   1940       常は \e[ は単独では bind しない。なので、例えば ble-detach の時に復元する
   1941       対象にはなっていないと考えられる。
   1942 
   1943 2023-09-03
   1944 
   1945   * complete: copilot
   1946     https://github.com/akinomyoga/ble.sh/issues/358
   1947 
   1948     * copilot completion bash
   1949       https://aws.github.io/copilot-cli/ja/docs/commands/completion/これは公式
   1950       の copilot for shell の様な気がする。一番初めにチェックするべきはこれの気
   1951       がする。copilot バイナリは何処で手に入るのかと思ったが standalone binary
   1952       がある。
   1953       https://github.com/aws/copilot-cli/releases/latest/download/copilot-linux
   1954 
   1955     * これは GPT に質問をしてコマンドを生成させるという事をしている。
   1956       https://github.com/tom-doerr/zsh_codex/tree/main
   1957 
   1958       現在の文脈情報について含めることができるのだろうか。例えば、現在のディレ
   1959       クトリの内容は云々だとか、README の内容は云々だとか。README の内容を普通
   1960       に書き込むとその中に書かれていることも直接 GPT に対する司令だと勘違いして
   1961       しまう可能性もあるのではないか。具体的にどのようにしたら良いのかの例はあ
   1962       るのだろうか。
   1963 
   1964     * github-copilot-cli (fish)
   1965       https://zenn.dev/tunefs/articles/b284d532ed5460
   1966       これは github-copilot-cli というのを呼び出しているみたいがだが、
   1967       github-copilot-cli は入力中のプロンプトの編集を手伝ってくれるのではなくて、
   1968       呼び出すと独自のインターフェイスに入ってコマンドを実行してくれるだけである。
   1969       https://www.npmjs.com/package/@githubnext/github-copilot-cli
   1970 
   1971 2023-09-02
   1972 
   1973   * tmux の外側の端末が取得できていない
   1974     https://github.com/akinomyoga/ble.sh/issues/359
   1975 
   1976     自分の手元でも問題は再現する。何処かの時点で tmux の振る舞いが変わったとい
   1977     う事なのだろうか。padparadscha の tmux 2.9a ではちゃんと動いている。
   1978     chatoyancy の tmux 3.3a では動いていない。これは tmux version の問題だろう
   1979     か。調べると 3.1, 3.2 では動いている。3.3 の CHANGES を見ていたら
   1980     passthrough sequence を既定で off にしたと書かれている。以下の commit
   1981 
   1982     https://github.com/tmux/tmux/commit/eabbc80b75ef8e02653c2728d7f646fc6a8f558f
   1983 
   1984     なので set -g allow-passthrough on にしてもらわないと外側の端末を検出する事
   1985     ができないのである。とは言いつつもし DECSCUSR をちゃんと tmux が外側に伝播
   1986     するのであれば問題は起きないはず。と思ったが、どうもDECSCUSR に関しては 3.1
   1987     でもちゃんと動いていない気がする。微妙に外側にカーソル形状変更が伝わってい
   1988     るが一旦ブロックになると元に戻らない。この振る舞いは遡っても変わらない (2.6
   1989     20170830 まで試した)。screen の中では動いている。更に 3.3 になると次のコマ
   1990     ンドラインに行ってもカーソル形状は復元されなくなっている。
   1991 
   1992 2023-08-17
   1993 
   1994   * ext: Android OS コンパイル環境での問題
   1995     https://github.com/akinomyoga/ble.sh/issues/353
   1996 
   1997     Android OS をコンパイルする時に応答がなくなると言っている。これは Android
   1998     OS のバグなのではないか。調べてみると Android OS をコンパイルするのには4コ
   1999     ア使って数時間かかるとか言っている。仮想マシンの中で実行しようと思うとます
   2000     ます時間がかかるのではないか。しかも 18.04 LTS とかいう古い Ubuntu の OS で
   2001     やっている。
   2002 
   2003     応答がない。
   2004 
   2005 2023-07-31
   2006 
   2007   * bash <= 4.4 & contra & mercury で矢印キーが動かない
   2008 
   2009     bash-4.4 で矢印キーが動かなくなっている。bash-3.2..4.4 の全てで動かなくなっ
   2010     ている。
   2011 
   2012     % contra では起こるが xterm では起こらない。mintty でも起こらない。contra
   2013     % 特有の可能性もある。bash-5.0 以上では動いているので contra が悪いという事
   2014     % ではない気がする。 ESC O A 等の形式でキーを送信する端末において発生してい
   2015     % る。これは bind の問題の様な気がする。
   2016     %
   2017     % と思ったら再現しなくなった。どうも、一旦 mercury にログインした事のある
   2018     % contra の仮想端末でなければ再現しないという事だろうか。再現しない時には
   2019     % ESC [ A が送信されているが問題が再現する時は ESC O A が送信されている。うー
   2020     % ん。ESC O をその場で処理するかどうかが関係している気がする。然し試してみ
   2021     % たところ mercury にログインしても front1 にログインしても再現しない。再現
   2022     % 条件が分からない。こうなると xterm や mintty で起こらなかったのも偶々の可
   2023     % 能性がある。
   2024     %
   2025     % chat 経由で mercury に入っても再現しない。screen の中から mercury に入っ
   2026     % ても再現しない。chat の中の screen の中の mercury でも再現しない。
   2027 
   2028     分かっている事: 端末が矢印キーに対して ESC O A を送信する状態になると
   2029     bash-4.4 以下で問題が発生する。然し、どのようにしたら端末が ESC O A を送信
   2030     する状態になるのかの再現方法は不明。
   2031 
   2032     2023-08-02 再現方法が分かった。screen に入った状態で接続が切れたりして抜け
   2033     ると中途半端な状態になって ESC [ A の代わりに ESC O A が送信される状態にな
   2034     る。更に、この状態では bash-5.0 以降であっても矢印キーの振る舞いが変である。
   2035     複数行コマンドラインに於いて上下キーで行の間を移動したいが、ESC O A になっ
   2036     ている時には履歴項目の間の移動になっている。何故この様な違いが出るのかはよ
   2037     く分からない。kpup などに翻訳されているという事だろうか。また再現した時に
   2038     keylog でどのような受信・翻訳になっているかを確認する事にする。
   2039 
   2040 2023-07-18
   2041 
   2042   * Grisha が bind -X の出力形式を修正している
   2043     https://lists.gnu.org/archive/html/bug-bash/2023-07/msg00076.html
   2044 
   2045     現在の ble.sh は間違っている事を前提として問答無用で前後の "" を削除してい
   2046     たはず。これの削除をなかった事にする。取り敢えず Grisha は "" で囲まない様
   2047     に変更している気がする。なので、ble.sh はこのままで大丈夫の筈だが後で振る舞
   2048     いをチェックする。
   2049 
   2050 2023-06-21
   2051 
   2052   * menu for history entries (requested by auwsom)
   2053     https://github.com/akinomyoga/ble.sh/issues/258#issuecomment-1599945461
   2054 
   2055 2023-06-12
   2056 
   2057   * stty: bash-5.2 以上 exit 後の stty 状態を正しく復元する手法?
   2058     #D2046
   2059 
   2060     呼び出し元の端末が ble.sh であれば呼び出し元で改めて stty を呼び出すから問
   2061     題ないが、そうでなければ壊れた stty 状態のままになって問題になる。呼び出し
   2062     元が ble.sh であっても、連続で複数の対話コマンドを実行した場合には後続の対
   2063     話コマンドの動作に影響を与える。
   2064 
   2065     これは bash-5.2 以降で EXIT trap が終了直前ではなく exit を呼び出した
   2066     context で呼び出されるようになったのが原因である。bash-5.2 でもちゃんと終了
   2067     時に stty を正しく設定する方法を考える必要がある。
   2068 
   2069     a 単に stty を遅延して呼び出すようにするのだと race condition で stty が間
   2070       に合わなかったり、逆に次のコマンドが stty を調整した後にそれを上書きして
   2071       しまったりする事になる。
   2072 
   2073     b DEBUG trap でトップレベルまで抜けてから exit を実行する? 然し、依然として
   2074       bind の中で exit が実行される事には他ならないので問題はそのままである。
   2075 
   2076       a 例えば #D2046 の a で考えた様に一旦キー入力を介する必要がある。例えば
   2077         DSR を送信して返事が来たら終了するという手がある。DSR に対応しているか
   2078         どうかについては端末自動判定の結果があるかどうかで判定する事ができる。
   2079         応答がない場合の可能性も考えると何か一つキーが来たらその内容に関わらず
   2080         終了する。但し、CSI を途中で切ってしまうと中途半端な内容が stdin に残っ
   2081         て問題になるので byte または char ではなく key に対して hook をかける必
   2082         要がある。
   2083 
   2084       b 或いは stdin を潰してしまえばその場で終了するのではないか? と思ったがそ
   2085         の場合に正しく端末の状態が復元されるのかは非自明である。更に exit に指
   2086         定した exit status を反映させる方法が存在しない。
   2087 
   2088 2023-05-19
   2089 
   2090   * osh のテスト上で bash が失敗している。何故だろう。
   2091     http://travis-ci.oilshell.org/github-jobs/
   2092     http://travis-ci.oilshell.org/github-jobs/4035/app-tests.wwz/_tmp/soil/logs/ble-test-bash.txt
   2093 
   2094     * 先ず mawk が正規表現を正しく処理できていない。然し手元の mawk では特に問
   2095       題がある様には見えない。arch 等でも問題が見られた記憶はない。最新の mawk
   2096       で試してみる価値はある。
   2097 
   2098       > mawk: line 37: regular expression compile failed (missing operand)
   2099       > ^('[^']*'|\$'([^\\']|\\.)*'|\$?"([^\\"]|\\.)*"|\\.|[^[:space:]"'`;&|()])*
   2100 
   2101       確認してみたが少なくとも Fedora に載っている mawk は Debian の最新の mawk
   2102       と同じである。という事は最新の mawk で問題があるという訳では無い様に思わ
   2103       れる。では逆に古い mawk で問題があるという可能性?
   2104 
   2105       と思ったが mawk のページには最近幾つかの新しい version が公開されている。
   2106       これらを試す価値はある。改めて最新の物を試してみたが問題は再現しない。
   2107       2010 の物を試してみたが再現しない。念の為、最も古い物を試してみる。と思っ
   2108       たら再現した。2008 の物である。これは mawk のバグだと思って良いだろう。
   2109 
   2110     もしかしたらテストの失敗もこの mawk によって引き起こされているのかもしれな
   2111     い。mawk を上書きした状態でテストを実行したらどうなるかについて確認する。うー
   2112     ん。実際にやってみるとテストに新しく2箇所失敗する。然しながら oilshell ci
   2113     上で見られたエラーは確認されていない。これはまた別の古い awk 実装によって問
   2114     題が発生している可能性があるだろうか。更に試してみるとこの2個のエラーは正規
   2115     表現のエラーとは関係ない様だ。
   2116 
   2117 
   2118     ? mawk の version check をする? テスト上で問題が発生しないのは 20090705 以
   2119       降である。また初期化時の正規表現のエラーが発生しないのは 20090710 以降で
   2120       ある。
   2121 
   2122       ところが mawk が現在のバージョン表記に切り替えたのは mawk 1.3.3 20090721
   2123       以降の様である。それ以前は "mawk 1.3.3 Nov 1996" という文字列固定で表示さ
   2124       れている。バージョン表記に関しては mawk 1.3.4 以降であるか、または mawk
   2125       1.3.3 20?????? 的な形式をしていれば良いという事にする?
   2126 
   2127       然し、このチェックを行う為だけでも初期化コストがかかる。そもそもこの様な
   2128       古い mawk を使っている場合というのは限られているのでそもそも判定しなくて
   2129       も良いのではないか。
   2130 
   2131     todo: mawk のテストも test-bash に追加する事にする。
   2132 
   2133 2023-05-13
   2134 
   2135   * complete: sed コマンドの補完
   2136     [1] https://github.com/akinomyoga/ble.sh/issues/326
   2137 
   2138     zsh は sed -r[TAB] に対してちゃんと short flags を提示するし、"sed
   2139     -re[TAB]" に対して sed expression の説明を提示する。これらをbash-completion
   2140     と協力して実装する事はできない物だろうか。と思っていたら [1] でも要求された。
   2141 
   2142 2023-04-13
   2143 
   2144   * bash は実は補完で pathname expansions の結果を候補として出す
   2145     https://github.com/scop/bash-completion/issues/444
   2146 
   2147 2023-04-10
   2148 
   2149   * gnuplot 実装を真面目に考える?
   2150 
   2151   * complete: here documents の補完
   2152 
   2153     よく考えてみたらそんなに実装は簡単ではないかもしれない。素朴に考えると
   2154     completion-context にて here documents の中にいる時には here documents 全体
   2155     を補完対象としてい補完 source を生成すれば良い気がする。然しそれだと here
   2156     documents 全体が補完の置換対象となって着色が巨大になって自然ではない。
   2157 
   2158     実はこれは長い文法的単語の中に含まれるファイル名などの補完の場合にも問題に
   2159     なる。実際にどの位置から補完を開始するのかが動的に変化する場合についても考
   2160     慮に入れるべきの気がする。そしてそれは source 毎に設定できる様にする?
   2161 
   2162     a 然しそうすると補完開始位置が混在する事になる。或いは表示している時の着色
   2163       だけが問題という事であれば単に着色開始位置を各候補に記録させれば良いだけ
   2164       の気もする。
   2165 
   2166     b 或いは source 毎に補完開始位置は固定にして異なる補完開始位置の source が
   2167       ある場合には、より前の位置から補完を開始した物を削除する?
   2168 
   2169       これを実装する為には動的に COMP1 を変更する仕組みが必要になる気がする。果
   2170       たして source の生成途中で COMP1 を変更しても問題が起こらない様になってい
   2171       たのだったか。現在の実装だと source の呼び出しの時点で COMP1 が決定されて
   2172       いると考えて良い。なので、source の中で未だ候補を生成していない限りは
   2173       COMP1 は他に影響を与えていないので問題はないのではないかという気がする。
   2174 
   2175       一方で既に述べた様に異なる source が異なる COMP1 を設定した時にどうするの
   2176       かという問題が生じる。
   2177 
   2178       a これだと source 毎に補完を生成してから merge するという操作が必要になっ
   2179         てしまうのではないか。
   2180 
   2181         然しその方が却って良いのかもしれないとも思う。現在の実装だと毎回一々
   2182         old_cand_count 等を記録したり部分的にfilter をかけたりと非自明な操作が
   2183         入っているので。然し、この様にしたとしても内部的に入れ子で source を呼
   2184         び出している実装の場合には結局毎回チェックは行う必要がある事に違いはな
   2185   2186 
   2187         集計を行うとしたら source に登録してもらう配列名 (cand_*) と、それらを
   2188         集めた結果の配列名 (merge_cand_*) を変える必要が出てくる。既存の実装の
   2189         全ての cand_* に対する参照を書き換えるのは大変なのではないか→取り敢え
   2190         ず数えると 104 個ある。其処まで多くはない。或いは、変数名はこれまでの儘
   2191         にしておいて、source を呼び出している関数で合成を行う?
   2192 
   2193         また COMP1 についても各 source に対して用意して最後に統一するという手が
   2194         ある。
   2195 
   2196         うーん。調べた所、cand_* に作用する関数は色々ある。source の内部でも
   2197         source の外側でも呼び出す可能性がある物を考えたらやはり変数名は変更せず
   2198         に generate-with-filter の側で切り替えを行う方が良いだろうか?
   2199 
   2200         * 先ず使用実態を調査しなければならない。
   2201 
   2202       b 或いは、以前の source が生成した物よりも後に開始位置をずらしたい場合に
   2203         は既に生成した補完候補は削除する事にして、また、一旦開始位置が後ろにず
   2204         らされたら後続のの補完 source はそもそも呼び出さないという仕組みにする?
   2205 
   2206         x この方法だと補完候補生成が source の順番に依存する様になってしまう。
   2207 
   2208       c 或いは、各 source の先頭で現在のずらされた状況を調べてもしずらされてい
   2209         たら補完候補を生成しない、もしくは補完候補を生成しないなどの対策を行う。
   2210         然し、この実装はそれぞれの source で細かい事を考える必要があるので余り
   2211         望ましくない。
   2212 
   2213 
   2214     c 或いは completion-context の決定の時点でコマンド毎に補完の開始位置をカス
   2215       タム計算できる様にする? しかしこの方法だと、最初に「単語全体の補完を試み
   2216       てその後で部分単語について補完を試みる」という段階的な補完を実行すること
   2217       ができない。
   2218 
   2219 2023-04-09
   2220 
   2221   * contrib: (source snake.sh) して C-c C-c で停止させようとすると read が壊れる
   2222 
   2223     read にて -u が変数名ではないというエラーメッセージが出て止まらくなる。
   2224     と思ったら再現しなくなった。よく分からない。
   2225 
   2226 2023-04-02
   2227 
   2228   * set -o posix で起動すると keymap が見つからないというエラーが発生する
   2229 
   2230   * history (bash 3.0): 履歴が重複して記録される
   2231 
   2232     bash-3.1 以降では問題ない様だ。つまり bash-3.0 だけで起きている問題である。
   2233     これの優先度は低い。或いはもしかすると既知の問題である可能性?
   2234 
   2235   * prompt: 右プロンプトの範囲に合わせて textarea の横幅を途中で切り替える?
   2236     https://github.com/akinomyoga/ble.sh/discussions/310
   2237 
   2238     これはこれまでにも考えた事があるはずだと思ったが todo 項目が見つからない。
   2239     もしかすると頭の中で思っていただけかもしれない。
   2240 
   2241     * scroll 機能との兼ね合い → rps1 も一緒に scroll する事にすれば良い。
   2242 
   2243       少し考えてみたがどうも scroll 機能と conflict する気がする。scroll する毎
   2244       に各行の折返を実行し直すというのは well-defined なのか。というかそもそも
   2245       他のアプリケーションでもその様な変な形の枠の中で scroll しながら枠に合わ
   2246       せて折返を実行し直すという実装は見た事がない。
   2247 
   2248       或いは、scroll する場合にはそれに応じて rps も一緒に scroll するという可
   2249       能性? その様にすれば変な事は気にしなくて良い。rps1 を途中で切断しなければ
   2250       ならないかもしれないがそれに関しては clip すれば良い気がする。
   2251 
   2252       然し長いコマンドラインを実行した後に rps1 が表示されない状態で次のプロン
   2253       プトに行くという事にならないか。或いは長いコマンドラインの時には全体を一
   2254       旦出力して次に進むという事にすれば良いのだろうか。新しいコマンドラインに
   2255       移動する直前であればターミナルを溢れてしまっても問題ない筈なので。下手に
   2256       削られて記録が消えるよりはそちらの方が自然の気がする。
   2257 
   2258       と思ったがスクロール範囲はプロンプトの最終行から始まる。なので、右プロン
   2259       プトもプロンプトの最終行以降に被っている部分だけスクロールする事になるの
   2260       だろうか。何だか複雑である。然し、そもそも右プロンプトもプロンプトの高さ
   2261       で範囲を制限していて非自明な事をしているのでその程度の事は寧ろ自然の気も
   2262       する。
   2263 
   2264 2023-03-27
   2265 
   2266   * menu-complete: 長い候補を表示した後の再配置
   2267     Ref #D2025
   2268 
   2269     これは WINCH 後の振る舞いにも関係している。WINCH があったら menu を閉じるか
   2270     或いは再配置を行う必要がある。現在は開きっぱなしになっている気がする。或い
   2271     は…何か変な状態になっている。info panel の高さはクリアされているけれども描
   2272     画されていない状態? の気がする。
   2273 
   2274     本当は info に関係する winch の callback も欲しいという事。或いは panel
   2275     height 決定で要求したのと異なる高さになった時に呼び出す hook? というか単に
   2276     panel height change に対する hook で良い気がする。そして既にその仕組は
   2277     onHeightChange で実装されている。現状では info#panel::onHeightChange は実装
   2278     されていない。此処で info#panel::onHeightChange に際して現在の選択項目が範
   2279     囲外になっていたら再描画を発生させる hook を登録できる様にする。現在表示し
   2280     ている内容が menu なのかどうかの情報を何処に記録するのかはよく分からない。
   2281 
   2282     どうも winch を実行すると瞬間的に高さが縮む様である。その後で続きを処理しよ
   2283     うとすると高さがまた元の高さに戻る。うーん。と思ったがそうでも無いような気
   2284     がする。前回と同じ高さであっても onHeightChange が呼び出されている。何故だ
   2285     ろうか。内容がクリアされてなくなってしまった場合にも呼び出されるという事と
   2286     思って良いか。
   2287 
   2288     →うーん。どうやら潰れて見えなくなった時には onHeightChange は呼び出されな
   2289     い様だ。その後で最初に有限の高さに戻った時に onHeightChange が呼び出される。
   2290 
   2291     然し height change を受け取ったとしてもその場で再描画する訳には行かない。既
   2292     に描画の途中でその処理の途中に height change が起こっているかもしれないから
   2293     である。
   2294 
   2295     a うーん。onHeightChange に於いて invalidate を設定する? でもこれだと現状で
   2296       潰れた時に onHeightChange を呼び出していないので、潰れた事を検知できない。
   2297 
   2298     b もしくは info#panell::render に於いて高さを毎回チェックすれば良いのかもし
   2299       れない。と思ったが、これも潰れた時に一度も呼び出されないので潰れてまた拡
   2300       大した時に検知できないのではないか。
   2301 
   2302     取り敢えず menu-complete 中に長い行が選択されて info が縮まった後にもちゃん
   2303     と onHeightChange は呼び出される様だ。但し、onHeightChange が呼び出された後
   2304     に果たして render が呼び出されるのかは保証できない。上の枠組みで高さが変化
   2305     したら render を改めて呼び出すという事を処理する様にしてしまうと今度は無限
   2306     ループになるのではないかという懸念が生じる。
   2307 
   2308     現状の canvas panel の枠組みにおける問題点は以下の二つである。
   2309 
   2310     * onHeightChange が潰れた時に呼び出されない。潰れた時にも呼び出す様に変更し
   2311       たいが、既存の onHeightChange の処理がどうなっているか気になる。
   2312 
   2313       更に潰れたという事が command-layout 等の都合で一時的に潰れる (後で全体を
   2314       再描画する予定) という事なのか、それとも他の panel が大きくて潰れざるを得
   2315       なかった (後で再描画はしない。より小さい領域に fit する様に処理する必要が
   2316       ある可能性はある) という事なのかで振る舞いが違っても良い。
   2317 
   2318       一時的に潰れているだけなのであれば現状の様に onHeightChange は呼び出さず
   2319       に別の種類の処理を呼び出すべきの気がする。
   2320 
   2321     * 一つの描画処理の中で既に描画し終わった panel の size change が発生した時
   2322       に、その panel を改めて再描画する様に処理するか?
   2323 
   2324       然しそもそも描画処理の途中に高さが変わるという事があるのかというのは疑問
   2325       である。調べてみるとどの panel も途中で reallocate-height.draw を呼び出し
   2326       ている。そもそもこの段階で処理を再考するべきなのではないか?
   2327 
   2328       最初の処理の段階で希望の高さを提出しておいて reallocate-height を実行した
   2329       後に各 panel の描画を開始する。各 panel は与えられた高さの中で表示する様
   2330       にする。もし足りない場合には fallback するか collapse する (減る分には問
   2331       題はない筈)。
   2332 
   2333     * invalidate は panel 側でも管理するべき? 但し、分からない。
   2334 
   2335 2023-03-09
   2336 
   2337   * sabbrev: suffix alias in Zsh (拡張子で実行形式を選択)
   2338     コマンド名補間も一緒に対応する必要がある。
   2339     つまり suffix alias がある時には対応する拡張子を持つファイルも候補に表示する。
   2340 
   2341   * complete: 末尾に不完全な \ がある候補の specialchars フィルタリング?
   2342 
   2343     最後に中途半端な \ がある時には実はフィルターする時にも \ で quote する必要
   2344     性のある文字が続いている物だけにするべきなのではないか。と思ったが処理的に
   2345     複雑になるのではないか? 取り敢えず末端に中途半端な \ があるかどうかは
   2346     comps_flags に B が含まれているかどうかで分かる。
   2347 
   2348     その上でその事実を用いて生成するファイル名を制限するかどうかというのが問題。
   2349     然しその制限を適用する事によって候補がなくなってしまっては変な気もする。
   2350 
   2351     a 全ての候補を生成してから、生成候補を制限しても候補が残るようであれば制限
   2352       をかける事にしようと思ったがそうしたとしても異なる種類の候補が混ざってい
   2353       る時に不用意にフィルタできない。例えば sabbrev 候補は絞り込みの為に cand
   2354       には quote を処理した後の値を入れている。
   2355 
   2356     b と思ったが quote の必要のない候補ばかりの時には生成候補がなくなっても良い
   2357       気がしてきた。
   2358 
   2359     そうは言っても問題になるのが bash-completion によって生成される候補を制限す
   2360     るかしないかという事。実際に生成している側でないとその意図は分からない。
   2361 
   2362 2023-03-08
   2363 
   2364   * :name: に対して emoji 変換を実装する?
   2365 
   2366     https://www.webfx.com/tools/emoji-cheat-sheet/ に一覧がある。
   2367     然し、emoji リストの難点は思い出すのが大変という事。リストを表示できたら良いのだが。
   2368     例えば sabbrev -m 経由で挿入するというのが良いかもしれない。:: を使う。
   2369 
   2370   * [保留] canvas/panel: 一旦 scroll buffer に行ったものを元に戻す可能性? (motivated by mozirilla213)
   2371 
   2372     https://github.com/akinomyoga/ble.sh/discussions/288#discussioncomment-5226973
   2373     > (And the completion words fill and cut the previous output when scrolling
   2374     > up the terminal which I think is a known limitation which is fine,
   2375 
   2376     panel の set-height で行が消えてなくなる? うーん。然し報告者の使っているら
   2377     しき konsole では特に内容が失われるということはない様である。ちゃんと
   2378     scroll buffer に内容が残っている。
   2379 
   2380     恐らく scroll buffer に行って一旦画面から見えなくなるという事を言っているの
   2381     だろう。或いは、一旦 scroll buffer に行った物を、menu が閉じた後にある程度
   2382     回復するという事。端末によっては何かそういう様な拡張をしていた様な気がする
   2383     のでそれを有効にする可能性はある。
   2384 
   2385 2023-03-02
   2386 
   2387   * menu-complete: C-TAB を連続で押すと仮挿入をそのままに新しい補完が始まる
   2388 
   2389     menu-complete の外側の keymap で menu-complete が設定されている時には単に
   2390     menu_complete/forward にしたりなどした方が良いのではないか。
   2391 
   2392     と思ったが menu_complete に対して引数が指定されている時などにどのように対処
   2393     するべきかわからない。例えば insert_all や insert_brances や context=* が指
   2394     定されている場合には単に移動するのではなくて今の補完を明示的にキャンセルし
   2395     て新しく補完し直すべきなのではないか。然し、単なる complete や
   2396     menu-completion や menu-complete backward 等の時には改めて開始するのではな
   2397     くて内部での補完候補の移動を行いたい気もする。
   2398 
   2399     然しチェックするにしても全ての文字をチェックしていると大変である。と思った
   2400     が、UTF-8 decode や key decode 等の処理の重さなどを考えたら大した事ないとい
   2401     えば大したことない。
   2402 
   2403   * menu-complete: suffix もメニュー選択時に表示する機能?
   2404     https://github.com/akinomyoga/ble.sh/discussions/297#discussioncomment-5159146
   2405 
   2406     然しこれは最後の確定時にならないと計算されない。メニューを選択した時にそれ
   2407     も計算する? 然しそうするとしてもrequote だとか前方の文字列の吸収だとかその
   2408     他の処理についてはどうするのか。
   2409 
   2410     特に前方の文字列の吸収に関しては実際に実行してしまうと元々の内容が消滅して
   2411     しまうので駄目である。或いは前方の文字列に一致する物がある場合には単に挿入
   2412     部分の方を短くすれば良いのかもしれないが、それはそれで着色範囲が変になって
   2413     しまって見にくい。更に前方に完全に一致する場合には挿入文字列の幅が 0 になっ
   2414     てしまって見えなくなる。また確定した時に何処にカーソルが移動するのかという
   2415     のも分かりにくい。
   2416 
   2417   * wiki: Design Widget の翻訳?
   2418     https://github.com/akinomyoga/ble.sh/discussions/272#discussioncomment-5013253
   2419     https://github.com/akinomyoga/ble.sh/discussions/294
   2420     https://github.com/akinomyoga/ble.sh/discussions/301
   2421 
   2422     何やら色々変な事を試そうとしている人がいるみたいなので。
   2423 
   2424 2023-03-01
   2425 
   2426   * [保留] decode: M-S-o と M-O のどちらか一方に強制的に揃える?
   2427 
   2428     現状では二つの形式に同じ binding を与える様に設定しているがわざわざ両方設定
   2429     するのは大変である。一方で、CapsLock 等を考慮に入れると両者は実は互換ではな
   2430     い。更に端末によって CapsLock がある時の振る舞いや、S を付加している時に
   2431     Shift 前の文字を底字にするのか Shift 後の文字を底字にするのか振る舞いが異な
   2432     る。なので正確に判定するのは難しい。
   2433 
   2434   * [保留] ble/builtin/readonly などの上書きを function#push で行う?
   2435 
   2436     ユーザーが独自に定義していた時などにそれを保持する為。また、ユーザーコマン
   2437     ドを実行した直後にユーザーが上書きしていたら改めて push を行う。その時には
   2438     既に push chain の中に登録済みであればそれを削除する等の仕組みが欲しい気が
   2439     する (opts 引数で指定)。
   2440 
   2441     これはわざわざ表示しなくて良い気がする。
   2442 
   2443 2023-02-27
   2444 
   2445   * [保留] complete: compopt -o filenames が指定された時に末尾の空白を除去する?
   2446     bash の振る舞いを確認する。
   2447 
   2448 2023-02-20
   2449 
   2450   * autoenv 実装
   2451 
   2452     既存の物と同じ設定ファイルを使い回す事を検討するべきだろうか。zsh-autoenv
   2453     は .autoenv.zsh を使っている。これに倣うのであれば .autoenv.blesh という物
   2454     を用意するのが便利である。
   2455 
   2456     * authorized 的なファイルの形式はどうするか。何処に記録するか。sha256sum を
   2457       呼び出せば良い。然し、sha256sum が存在しなかった時にどうするのかや、前に
   2458       無かったのに新しくインストールされた場合にどうするのか等が非自明である。
   2459       取り敢えず cksum は存在すると思っておくべき? あと、前にはあったけれどもな
   2460       くなってしまったという場合にもどうするのか困る。うーん。ファイルには hash
   2461       の形式も一緒に記録する事にするのが良い気がする。
   2462 
   2463     * bleopt push/pop の機能を実装するべき。bleopt --push ... 等とする? 或いは
   2464       全ての設定を一斉に push するという手もあるだろうか。或いは、bleopt 自体に
   2465       hook して .autoenv を実行中の変更を全て track する。これが楽の気がする。
   2466 
   2467     * function については ble/function#push/pop を使ってもらう。alias は ble.sh
   2468       側で追跡する。adjust の中で定義して大丈夫なのか? 抜ける時には特に今まであっ
   2469       たものを敢えて削除する事はしないので一応使える? 然し、以前の alias が退避
   2470       されていた場合にそれが restore される時に上書きされて昔の物に戻ってしまう
   2471       という事が起こるのでは。という事を考えると alias に関しては adjust を一旦
   2472       restore しておく必要があるのではないか。他にも FUNCNAME 等が気になる。
   2473 
   2474 2023-02-12
   2475 
   2476   * syntax: 5.0 以降では関数名として function `xxx` 等も実は許されている。5.3
   2477     以降では更に <(...) も関数名として使える。しかもこれらは `xxx`() や
   2478     <(...)() の形式でも定義できる。
   2479 
   2480     現在の実装では関数名を function NAME まで一回の解析で進むようにしている。何
   2481     故だったか。何か理由があった気がするが、この取扱になっている限りはちゃんと
   2482     対応するのは難しい。過去の記録を調べる必要がある。
   2483 
   2484   * complete: shopt -s extglob failglob で @(aa)() { echo; } という関数を作成し
   2485     て置くと screen -dr の補完の途中でエラーメッセージが表示される。何処から表
   2486     示されているのだろうか? 関数名を拾って更にその上でそれをパス名展開に晒して
   2487     いる箇所があるのだろうか? simple-word ではないので ble.sh の内部ではないの
   2488     ではないか…という気がするが分からない。
   2489 
   2490 2023-02-06
   2491 
   2492   * auto-complete: cd 等簡単に成否が分かる物については判定して除外する可能性
   2493 
   2494     然し cd を上書きしている場合等にはやはり問題になる。またコマンド毎に対応す
   2495     るのは大変なのでこれも progcomp, chroma の様に判定するシェル関数を用意する
   2496     可能性。ただ、問題なのは、単純コマンドでない時にコマンドの位置などの判定を
   2497     行う必要があるという事。そしてその為には構文解析を各項目に対して回す必要が
   2498     ある。という事を考えると重くて現実的でない気がする。
   2499 
   2500 2023-02-03
   2501 
   2502   * contrib: ble-import で contrib/ は不要なのではないか?
   2503 
   2504 2023-01-26
   2505 
   2506   * histdb: history の中から情報を取り出してそれを使って何かする機能
   2507 
   2508     これができなければそもそも実装する意味がない。例えば auto-complete で単語を
   2509     表示する等。
   2510 
   2511     * done: wiki: BLE_SESSION_ID, BLE_COMMAND_ID
   2512 
   2513     * 履歴を操作・編集(削除)する機能も欲しい。
   2514 
   2515       histdb [list]                 コマンド一覧
   2516       histdb list-session [options] セッション一覧
   2517       histdb delete [OPTIONS]       コマンド削除
   2518       histdb -s [.|session]         セッション指定
   2519       histdb -d [.|dir]             ディレクトリ指定
   2520       histdb -t [.|dir]             ディレクトリ指定(サブディレクトリも含める)
   2521       histdb -g glob                コマンドをパターンで絞り込み
   2522       histdb -c command_id          コマンドIDによる指定
   2523 
   2524 2023-01-25
   2525 
   2526   * complete: 英単語の曖昧補間やスペルミスの検出など
   2527 
   2528     この場合には一意確定だとしても挿入はしない方が良い。コマンド引数
   2529     (source:argument) についてその他の候補生成が全て生成に失敗した時にこれを実
   2530     行するのが良い気がする。そしてその場合には勝手に挿入しない事を表す flag か
   2531     何かを設定する事にすれば良い。
   2532 
   2533     英単語辞書は bash で処理すると遅いので awk か或いは外部コマンドを呼び出すべ
   2534     き。或いはこれまでに実行したコマンドから拾ってくる? これまでに実行したコマ
   2535     ンドに関しては変な切り取り方をしても仕方がないので、
   2536 
   2537     a 予めコマンド実行時の文法解析結果を元に単語を抽出してファイルに記録してお
   2538       く。これは comps との一致対象。記録は state ディレクトリの中にファイルを
   2539       作成すれば良い。~/.local/state/blesh/history.xword.txt 等。
   2540 
   2541     b 同様に単語がファイル名に一致する場合にはそのファイル名を記録する
   2542       (history.filename)。現在ディレクトリとの組にして記録するとより良いかもし
   2543       れない。これは compv に対して一致を試みる。
   2544 
   2545       x 現在ディレクトリとの組にするのだとしたら結局現在ディレクトリで普通にファ
   2546         イル名補完をするので十分なのではないか。逆にディレクトリに関係なくファ
   2547         イル名を記録するとしても何か用途はあるだろうか。結局単語補完と実質同じ
   2548         なのではないか。
   2549 
   2550     c 更に、simple-word の時には展開結果を記録する (history.vword.txt)?
   2551 
   2552       x 展開結果が長大になる可能性がある。
   2553 
   2554     d 更に c をスペース等で分割して単語を記録する (history.eword.txt)?  然しこ
   2555       れも変な物を記録しても仕方がないので bash special chars に関しては含めな
   2556       い様にする。もしくはそれらも分割子として取り扱う。これも compv に対して一
   2557       致を試みる (特にスペース等で分割した後の直近の文字列に対して判定する)。
   2558 
   2559     history に関しては ToDo 2021-05-17 に関連項目がある。
   2560 
   2561 2022-12-09
   2562 
   2563   * edit,complete: alias expansion で alias sudo='sudo ' 等による引数の展開に対応?
   2564 
   2565 2022-12-03
   2566 
   2567   * declare -f の出力は特殊関数名には使えないのではないか?
   2568     https://lists.gnu.org/archive/html/bug-bash/2022-12/msg00010.html
   2569     https://lists.gnu.org/archive/html/bug-bash/2022-12/msg00011.html
   2570 
   2571     取り敢えず、これは evaldef の時点で function を prefix すれば良い気がする。
   2572     今後の Bash の振る舞いの変更で function が追加されるかもしれないので、その
   2573     時にはそれを避ける様にする。
   2574 
   2575     更に変数代入の形の関数名は declare -f &>/dev/null でテストする事もできない。
   2576 
   2577   * colorglass: face から読み取る時に作用する色設定?
   2578 
   2579     現在は全ての出力に対して色を変更しているが、プロンプトのテーマを別に指定し
   2580     ている場合などを考えると、プロンプトの色には作用して欲しくない気がする。一
   2581     方で元々の colorglass のアイディアでは全ての色に対して作用する事を考えてい
   2582     た。両方の種類のオプションを提供するという手が考えられる。例えば、現在のオ
   2583     プションはそのままにして、colorglass_face_* という物も提供する。
   2584 
   2585     インターフェイスは別として実装は考える必要がある。
   2586 
   2587     a 現在は face は全くキャッシュしていないので、face 読み取り部分に filter を
   2588       挟むとなると遅くなる。或いはキャッシュするか。キャッシュするとしても将来
   2589       的に face 間に依存性を持たせる実装を考えると個別にキャッシュできない。
   2590 
   2591     b 或いは、別の colorglass domain の区分けとしてプロンプトを処理する時とそれ
   2592       以外で分けるという事も考えられるだろうか。しかしそれだと vim-airline の設
   2593       定は prompt に含まれるので既定の色を抑える等の調整ができなくなる。
   2594 
   2595 2022-09-15
   2596 
   2597   * vim terminal や neovim terminal における keymap-timeout に対応する設定は何
   2598     か。調べてみると ttimeoutlen や timeoutlen という物がある様だが、これの設定
   2599     を変更しても振る舞いに変化はない気がする。後でちゃんと調べる必要がある。
   2600 
   2601 2022-09-11
   2602 
   2603   * 何らかの拍子に P[0 q の様な謎の文字列がユーザーコマンドの実行後に出力される
   2604     様になる。
   2605 
   2606     これは DECSCUSR に関係しているのは確かだと思われるが、どうやって起こるのか
   2607     分からない。例えば _ble_term_Ss 関係の変数が変な値になっているのが原因かと
   2608     も思われたが別にこれらの変数に問題はない。P[0 q の様な文字列が含まれている
   2609     変数も存在しない様に見える。
   2610 
   2611     * bleopt term_cursor_external=1 を設定してみたらコマンドが始まる前にも変な
   2612       メッセージが出力される様になった。つまりやはり cursor-state の管理の部分
   2613       で起こっている問題なのだろうと思われる。
   2614 
   2615     * 新しい bash を開始すると別に問題は生じない。また、そもそも表示幅も狂って
   2616       いる気がする、と思ったがこれは本来端末に文字列として表示されない物が表示
   2617       されている事によって位置がずれているだけなので、元の問題を解決すればこれ
   2618       も解決する筈。
   2619 
   2620     コードを確認してみたら分かった気がする。quote-passthrough によって付加され
   2621     た P が表示されてしまっているのである。そして、端末の入れ子情報が壊れている。
   2622     実際に問題が生じている端末で C-xC-v で端末情報を出力してみた所、どうやら
   2623     screen が三重に入れ子になっていると勘違いしているようである。
   2624 
   2625     terminal: TERM=screen.xterm-256color wcwidth=14.0-emacs, screen:49900
   2626     (83;49900;0), screen:49900 (83;49900;0), screen:49900 (83;49900;0),
   2627     contra:0 (99;0)
   2628 
   2629     何故後になってこの様な変な状態になるのか分からないが、ble.sh を reload した
   2630     らちゃんと端末の入れ子状態の情報も正しくなって問題も起こらなくなった。
   2631 
   2632 2022-08-31
   2633 
   2634   * complete: 'a b c' というファイルがある状態で 'b [TAB] すると変な事になる。
   2635 
   2636     →今試してみると再現しない。bash-completion をロードしていてもしていなくて
   2637     も問題なく補完される。
   2638 
   2639   * complete: ~/b/c/スペースを含むファイル[TAB] としても requote されない。
   2640 
   2641   * complete: 変数名の曖昧補完が効かない。一旦候補を生成したら menu-filter によ
   2642     る曖昧絞り込みはできている。
   2643 
   2644 2022-08-29
   2645 
   2646   * DEBUG trap についても関数呼び出しの階層を再現する?
   2647 
   2648     user-handler#{load,has} がそれぞれの文脈で "現在の文脈での handler" を取得
   2649     しようとしているのか、或いは "何れかの文脈で handler があるか" を取得しよう
   2650     としているかをちゃんと区別する必要がある (というか関数を二種類作るべき?)
   2651 
   2652     また "現在の文脈" を正しく取得できているかどうかについてもちゃんと確認する。
   2653 
   2654     install-hook については top-level での hook があるかどうかを確認したい。結
   2655     局 trap - DEBUG されない限りは何処かの stackframe で定義されている DEBUG
   2656     trap が top-level に適用されると考えると、何れかの階層の handler があればそ
   2657     れで判定していると思って良い。但し、install-hook については、初期化時に
   2658     user が builtin trap で既に設定しているかどうかを判定する為に用いていて使い
   2659     方が特別である。何れにしても、何処かの階層で既に定義があればユーザーの設定
   2660     した builtin trap は無視するというので良い。[ しかし実はそもそも DEBUG は
   2661     install-hook 内に継承されないので extdebug/functrace が設定されていない限り
   2662     判定できないしその様に条件で弾いている ]
   2663 
   2664 2022-07-10
   2665 
   2666   * syntax: posix syntax check in posix mode?
   2667 
   2668     対応が面倒そう。本当にエラーになる訳では無いので普通のエラー着色とは少し異
   2669     なる着色にする?
   2670 
   2671   * complete: - で始まるファイル名には ./ をつける?
   2672 
   2673     * コマンドによっては + で始まるファイルについても ./ をつける必要がある事も
   2674       ある。そもそも + で始まるファイル名は普通ではないという事を考えると、+ で
   2675       始まるファイル名についても - で始まるファイル名と同様に一律で ./ をつける
   2676       様にしてしまって良い気がする。
   2677 
   2678     * './' を前置するという事は遡って書き換えるという事を意味する。どの様に取り
   2679       扱うべきか。
   2680 
   2681       a うーん。INSERT 時に suffix を付加するのと同じ要領で ./ を挿入するという
   2682         事にする? ./ は shell special characters を含んでいないので quote の状
   2683         態がどうであれ勝手に挿入してしまって良い。
   2684 
   2685       b オプション名及びファイル名の両方の候補がある場合に menu-complete で両方
   2686         選択肢を表示したい時にどうするのか。という事を考えると CAND の時点で ./
   2687         をつけてしまって独立な二つの候補にする必要がある。という事を考えると元
   2688         より CAND の時点で ./ をつけるべきなのかもしれない。
   2689 
   2690         然しこれだと実は filter されてしまうのでは?
   2691 
   2692       c a と b の両方を行うのが良い気がする。曖昧補間 (部分一致) の場合には b
   2693         の方法だと filter されてしまって出て来ないので、最終段階で ./ を挿入す
   2694         る様にすれば良い。一方で、先頭一致の場合にはオプション名候補と区別する
   2695         為に ./ は CAND の時点で付けておく事にする。
   2696 
   2697     * --prefix=filename の様に生成した場合には --prefix の前に ./ を付加してし
   2698         まわない様に、ちゃんと prefix 部分を認識して戦闘の [-+] 判定を行うべき。
   2699 
   2700     ble.sh builtin filename generation で ./ を付けるのは良いとして、progcomp
   2701     で生成された - で始まる単語で同名のファイルが存在する場合にどうするか?
   2702     progcomp で生成された物でファイル名に一致する物があった時に、それがオプショ
   2703     ンを意図した物なのか或いはファイル名を意図したものなのかを区別する手段はな
   2704     い。
   2705 
   2706     a bash-completion の _filedir 等に介入して ./ を付加する? 一方で、これでは
   2707       もっと細かい補間関数で個別に生成している物や、bash-completion ではない設
   2708       定に関しては対応できない。
   2709 
   2710     b 或いは同名のファイルがある場合には問答無用で ./ を付加する事にする?
   2711 
   2712   * complete: 空白で終わる alias の対応?
   2713 
   2714     空白で終わる alias は次の単語の alias 展開も引き起こす。然し一方でコマンド
   2715     さえ確定してしまえば後はそのコマンドの補完によって対応するべきという考え方
   2716     もある。うーん。それでも alias を設定するのはユーザーであり、そのコマンド自
   2717     身ではないと考えるのであれば、やはり ble.sh の側でその辺りを解決して補完を
   2718     呼び出すべきではないだろうか。
   2719 
   2720 2022-07-06
   2721 
   2722   * complete: func() TAB 及び function func TAB で関数定義を挿入する。
   2723 
   2724     bash-completion では function func [TAB] でこれに対応しているので。現在は
   2725     function aaa の時 aaa には単語を設置していないが必要があれば登録しても良い。
   2726 
   2727 2022-07-04
   2728 
   2729   * [保留] debug_xtrace を bash-4.0 以下でも対応する?
   2730 
   2731     debug_xtrace が bash-3.2 で動いていない。と思ったらそもそも BASH_XTRACEFD
   2732     は bash-4.1 以降の機能だったのだ。bash-4.0 以下では 2 を redirect する事に
   2733     よって実現する? と思ったが 2 は ble.sh が出力するのに使っている気がする。特
   2734     に ble/util/buffer.flush で使っている。更に他にも様々なエラーメッセージが 2
   2735     に出力されるのではないか。という事を考えると 2 を xtrace に使うのは余り良い
   2736     ことではない様な気がする。取り敢えず保留という事にする。
   2737 
   2738   * ext: trueline と組み合わせた時に問題が起こるとのこと。
   2739     https://github.com/lecramyajiv/Emptydeeds/commit/b57e8354cc350d71c655d93c32112427ec8addda#diff-0a1c1083789380c5f4b4aaebd19b6a4b2431ae808f8b456cf865825cfb93b9dfR2527
   2740 
   2741 2022-06-19
   2742 
   2743   * 履歴番号を検索やプロンプトで表示しているが、これは history の最初が 1 でな
   2744     い時にはずれるのではないか。後で確認する必要がある気がする。
   2745 
   2746 2022-06-14
   2747 
   2748   * cygwin: bash --norc, source すると C-xC-v 等の keybinding が動かない
   2749     bash_execute_unix_command のエラーが出る。
   2750 
   2751     これは元々存在している inputrc か何かが悪さをしている可能性? 然しそうだとし
   2752     ても普通に attach したら問題は生じない。なのでやはり違うのだろうか。
   2753 
   2754   * eterm: Emacs に実装されている M-x term 若しくは M-x ansi-term
   2755 
   2756     端末実装が色々滅茶苦茶である。infocmp にて対応している事になっている機能で
   2757     も振る舞いが変である。
   2758 
   2759     * 先ず、IL, DL は行の途中で実行するとおかしな事になる。IL はその位置に改行
   2760       を挿入して行を2つに分ける機能を持っている。DL は一方で emacs 内部で C-k
   2761       をするのと同じ機能である。即ちその位置以降の文字列を消去するか、行末にい
   2762       る場合には次の行と結合する。これは一応行頭に移動すれば問題ない気がする。
   2763 
   2764     * RI に関しては端末の一番下にいる時に全体を scroll down し、端末の一番上に
   2765       いる時には何も実行しない。
   2766 
   2767     未だちゃんと動かない。これは後でちゃんと調べる必要がある。
   2768 
   2769 2022-06-02
   2770 
   2771   * bash-4.4 crash (reported by notmike-5)
   2772     https://github.com/akinomyoga/ble.sh/issues/195
   2773 
   2774     source した瞬間に crash するという事だろうか?
   2775 
   2776     一方で別の問題を発見した。bash-completion scp の補完で 4.4 がcrash する。こ
   2777     れは ble.sh なしでも再現する。また、bash-5.0 以降では発生しない。
   2778     bash-4.2..4.4 の全てで再現する。これは後で bash-completion の側で対処が必要。
   2779 
   2780 2022-05-12
   2781 
   2782   * isearch: 現在行と全く同じ内容の行には一致しないというオプション
   2783 
   2784 2022-04-13
   2785 
   2786   * bash が `vi-edit-and-execute-command' を追加している。
   2787 
   2788     これは自分が以下で報告した事が元になっているのだろう。
   2789     https://lists.gnu.org/archive/html/help-bash/2022-02/msg00031.html
   2790 
   2791     d70b5339 で追加されている。つまり help-bash で発言した次の日には修正が入っ
   2792     ていたのだった。
   2793 
   2794 2022-03-19
   2795 
   2796   * 編集文字列に含まれる制御文字の反転表示の可能性
   2797 
   2798     現在は見た目には区別がつかない。プロンプトシーケンス \w, \W, etc に含まれる
   2799     制御文字については反転の toggle で対処している。
   2800 
   2801     一方で、現在の実装だと単純に編集文字列に含まれる制御文字の反転状態を変更す
   2802     る事はできない。着色に関係なく制御文字の表現を決めている、つまり地の反転状
   2803     態に関係ない escape sequence を決める必要があるが、地の反転状態が分からなけ
   2804     れば制御文字が終わった位置で正しく反転状態を復元することができなくなる。
   2805 
   2806     これについてはまた今後必要性を感じた時に実装すれば良い気がする。
   2807 
   2808 2022-03-03
   2809 
   2810   * 起動時の fork について
   2811 
   2812     * ble/base/adjust-builtin-wrappers/.assign (2 fork) ... 此処で builtin,
   2813       alias を保存する為に2回に分けて defs=$(...) を実行している。この時点では
   2814       初期化が終わっていないので ble/util/assign は使えない。
   2815 
   2816       これはそもそも勝手に上書きした builtin や alias を保持する必要があるのか
   2817       という事を考えるとスキップしても良い様な気がする。起動の高速化の為にこう
   2818       いった物を省略するオプションを用意して良い様な気はする。
   2819 
   2820     * ble/util/msleep/.check-builtin-sleep ... これはロードに失敗した時の事を考
   2821       えて subshell 内部で実行している。
   2822 
   2823       これも sleep の方法を予め引数等で指定する仕組みを用意しておけばスキップす
   2824       る事は可能である。また builtin sleep に頼り切るのも問題の気がする。という
   2825       か builtin sleep だと C-c が効かない等の問題がある。
   2826 
   2827       改めて plain Bash に builtin sleep を読み込んで動作を調べてみる。と思った
   2828       が再現しない。というよりそもそも ble.sh をロードしていても bash-5.0 でし
   2829       か再現しない。つまり bash-5.0 & ble.sh の時にだけ bultin sleep 3 で C-c
   2830       に対して即座に実行が中止されない。ble-detach していてもこの問題は発生する。
   2831       plain Bash で直接 enable -f /path/to/sleep sleep して sleep 3 に対して
   2832       C-c した時にはちゃんとすぐに終了する。
   2833 
   2834     * ble/builtin/bind/read-user-settings/.reconstruct ... これは記録されている
   2835       default bash の binding と、現在の binding を比較してユーザーが設定した
   2836       keybinding を抽出する為に awk を呼び出している。
   2837 
   2838       これは既存の readline 設定を読み取らない事にすればスキップはできる。実際、
   2839       ble.sh の読み込み時に --noinputrc を指定すればこれは実行されない。
   2840 
   2841     以上の物は何れもユーザーオプションで省略できる様な機能ではある。然し一方で
   2842     ロードのボトルネックは実は fork ではない。少なくとも Linux では。但し、
   2843     Cygwin では 50ms/fork かかるので 4 fork 省略できるだけで 200ms も時間を短縮
   2844     できるので大きい。
   2845 
   2846 2022-02-20
   2847 
   2848   * より一般の補完 framework に向けたインターフェイスについて
   2849     https://github.com/rsteube/carapace/issues/431
   2850 
   2851   * compopt 実装: 現在の実装では "name" や -DEI が与えられた場合には何もせずに
   2852     戻る様になっているが、本来現在の設定を変更するべきなのではないか。また、丁
   2853     度変更対象の補完が現在の補完と一致している時には現在の補完の振る舞いに影響
   2854     を与えるべきなのではないか。これについては実際の Bash の振る舞いを確認する
   2855     必要がある。
   2856 
   2857   * rsteube の記事
   2858     https://dev.to/rsteube/a-pragmatic-approach-to-shell-completion-4gp0
   2859 
   2860     filtering を description に対しても適用するという事が書かれている。それは確
   2861     かに便利そうである。現状の実装では対応が難しい様には思われるが。これは fzf
   2862     の様に一旦絞り込み専用の入力欄に移動するなどの事がないと使いにくいだろう。
   2863 
   2864   * trap (lastarg): 一応 heredoc 等を使えば eval の中から複数行の lastarg を設
   2865     定する事ができるのではないか。他に複数行で、eval されても余分な実行が起こら
   2866     ない様な方法はあるだろうか。不完全な引用符の場合には結局エラーが出力されて
   2867     しまう。
   2868 
   2869     Ref #D1853
   2870 
   2871   * [保留] exec: builtin sleep に対して C-c が効かない
   2872 
   2873     % 現在の実装だと bash-5.0 以下で C-c でループ中に走っている外部コマンドを止
   2874     % めた時に応答がなくなってしまう。bash-5.1 以上では一旦実行が停止するものの
   2875     % 一応応答はする。
   2876 
   2877     と思ったらこの問題は外部コマンドではなくて builtin sleep を呼び出している時
   2878     特有の問題だった。trap INT を設定しているのは問題なのだろうか。
   2879 
   2880   * edit: 現在の TRAPDEBUG の枠組みを拡張して try/catch/finally を実装できるのでは
   2881     Ref #D1783
   2882 
   2883     もしその枠組がちゃんとできるのであれば edit.sh から util.sh に移動する。
   2884 
   2885 2022-02-14
   2886 
   2887   * 全ての ble.sh session にコマンドを送る機能があれば screen に再 attach した
   2888     時の再調整等に役立つのでは。
   2889 
   2890     _ble_term_TERM の最初期かもできるし、或いは DISPLAY 環境変数の再設定もでき
   2891     る。チェックの頻度は history-share と同様で良い気がする。
   2892 
   2893   * ble/builtin/trap DEBUG は関数の入れ子や trace 属性などは考慮していない。こ
   2894     の事によって問題が起こる可能性もある。
   2895 
   2896 2022-02-12
   2897 
   2898   * highlight: ls -l ~/.c{onfig,a/b}
   2899     ブレース展開の中に / が含まれているとディレクトリパス着色が動かない。
   2900 
   2901     うーん。そもそも highlight の仕組み的に / が含まれているとどうしたら着色で
   2902     きるか謎という可能性がある? と思ったが恐らくそういう事ではない。何れにして
   2903     も全体を一番最初に一致した PATH に対する色で同じ色で着色する様になっている
   2904     筈。但し、その着色を実行する上で / で分割してから各 segment に対して着色す
   2905     る様になっている為に、brace 展開中に / があると / で分断されてしまって正し
   2906     く着色できないという事になるのだろう。
   2907 
   2908     ちゃんと対応する為には、"ブレース展開に対して最初の要素で着色をする" のでは
   2909     なくて、ちゃんと各要素に対して着色をするという方向に改める必要があるのかも
   2910     しれない。然し、それは実際の所面倒だし、そこまでする必要があるのかというの
   2911     も謎である。これは優先度は低いがもし実装できたら面白いだろうという事である。
   2912 
   2913 2022-02-08
   2914 
   2915   * [保留] compat: bind -x 実行後の再描画はプロンプト最後の行以降
   2916     https://lists.gnu.org/archive/html/help-bash/2022-02/msg00023.html
   2917     https://lists.gnu.org/archive/html/help-bash/2022-02/msg00031.html
   2918 
   2919     どうも bash で試して見た所 に於いてはプロンプトの一番最後の行以降だけが再描
   2920     画の対象らしい。現在の ble.sh の実装だと全体を再描画している。これだと
   2921     help-bash に投稿した様な hack が使えなくなる。
   2922 
   2923     a Bash と同様に途中から出力する様に調整すれば良い。と思ったが、よく考えたら
   2924       現在の実装では prompt は一気に出力する事になっているので一番最後の行だけ
   2925       出力するという話はない。
   2926 
   2927     b うーん。その場で clip すれば良いのかもしれない。然しそれは処理として重く
   2928       なる。また、clip した場合には結局描画する時にはカーソルを相対移動させる事
   2929       によってカーソルが本来の位置に戻ってしまう。つまり、hack は結局使えない。
   2930 
   2931     そもそも hack を使える様にするという発想がおかしいのだとも言える。特に件の
   2932     hack に関しては ps1_final で代用できる。それ以外の目的で描画を乱すとしたら
   2933     それはやはり対応外であるし、もしそういった描画に対する介入を想定しないので
   2934     あれば、結局全体を描画するという現在の振る舞いで特に問題は生じない筈である。
   2935 
   2936 2022-02-05
   2937 
   2938   * syntax: a=(%{1..10}) の % を '\x' に書き換える時文法構造が破壊 (?)
   2939 
   2940     $ bash
   2941     $ rep=(%{25,08,0A,2{0..2},24,2{6..9},3B,3C,3E,5C,5E,60,7C})
   2942 
   2943     として起動した直後に上記の文字列を貼り付けて、それから先頭の % を削除して
   2944     '\x' と入力したら文法構造が壊れてしまった。然し二度と再現しない。問題は '\x
   2945     迄入力した時点で発生していた。もしかすると ' か \ を入力した時点で既におか
   2946     しくなっていたのかもしれない。
   2947 
   2948 2022-02-03
   2949 
   2950   * キャッシュの判定でファイルを使って判定しているが、よく考えたら現在ロードさ
   2951     れているコードとファイルに含まれているコードが同じとは限らないのではないか。
   2952     もし、現在のシェルの起動時刻よりも比較に使っているファイルのほうが新しい時
   2953     は、ble.sh 自体を reload した方が良いのではないか。と思ったがそれによって失
   2954     われる設定も考えられる。という事から勝手に reload する訳にも行かない。
   2955 
   2956     起動時刻(というよりble.shロード時刻)を示す一時ファイルを使うという手も考え
   2957     られるが、それだと後になってロードした module の場合には不正確になる。と思っ
   2958     たが、古いコードを使って更新を実行してしまうよりは、新しいコードなのに古い
   2959     情報を更新せずに利用するという位の方が未だましである。
   2960 
   2961     実はロード時刻は $_ble_base_run/$$.load に既に存在しているのでそれを使えば
   2962     良い。
   2963 
   2964     検索してみると結構影響のありそうな箇所は沢山ある。一方で具体的にどの様に直
   2965     すのか。load time だけで判定すると毎回キャッシュを更新する事になってしまっ
   2966     て意味がない。(キャッシュが最新でない) & (load time よりも前に元のファイル
   2967     が更新されている) という条件で判定するのが良い気がする。
   2968 
   2969     * キャッシュが最新でないというのは必須の条件である。そうでなければそもそも
   2970       更新を実行する意味がない。load time が元ファイルより最近の場合にも何も問
   2971       題は生じないので今迄通りに何も気にせずに更新すれば良い。
   2972 
   2973     * 従って、特に判断が難しいのは (キャッシュ),(LoadTime) > (元ファイル) の場
   2974       合である。更に元ファイルを source した時刻は実は元ファイルよりも後の可能
   2975       性もある。その時にはメモリ上には最新版があるのでそれに従ってキャッシュを
   2976       更新しても問題ない。
   2977 
   2978     * よく考えたらここで対策をしても問題は生じるのではないか。元々キャッシュファ
   2979       イルが存在しなくて、メモリ上に古い version の関数があって、それに基づいて
   2980       新しくキャッシュを作成した場合、古い version のキャッシュがずっと残ってし
   2981       まう。
   2982 
   2983       うーん。load time で time stamp を書き換える様にすれば良いのだろうか。
   2984 
   2985 2022-01-23
   2986 
   2987   * "for ((i=0;i<10;i++)); do sleep 1; done" で C-c すると ble.sh 全体がその場で停止する
   2988 
   2989     これは外部コマンドを実行中にそのコマンドが SIGINT で終了した場合、trap INT
   2990     に登録されたハンドラーを介さずに即座に実行全体が終了してしまうのが原因であ
   2991     る。
   2992 
   2993     もしそれがトップレベルのコマンドであれば ERR を用いて捕まえる事はできる。但
   2994     し、それが SIGINT によって引き起こされたものなのか、普通のエラーとして返さ
   2995     れたのかを判定する方法はない。
   2996 
   2997     更に関数内で実行された場合には ERR でも INT でも捉えられない。RETURN を使っ
   2998     ても捕まえられない。これを解決する方法はない気がする。
   2999 
   3000 2022-01-08
   3001 
   3002   * mandb: echo のオプションの抽出 (help echo) がおかしい at fc35 vm
   3003     chatoyancy では問題は発生していない
   3004 
   3005 2021-12-22
   3006 
   3007   * ディレクトリ固有の local commands & aliases を可能にする?
   3008 
   3009     一方で、勝手に設定をロードする様にしてしまうと怪しいディレクトリに入っただ
   3010     けでそれが有効になってしまうという事が発生する。なので、一旦は enable する
   3011     操作を求めるべきだし、また内容が変更されたらその都度承認を求めるべきである
   3012     (過去に承認したものは hash か或いは実体を記録しておいて再度尋ねはしない様に
   3013     できる)。
   3014 
   3015     →direnv が丁度同じ事を目的としたプロジェクトの様である。
   3016 
   3017     2023-01-30 direnv が一体どういう事をしているのかについて調べる → #M0023 に
   3018     纏める事にした。
   3019 
   3020 2021-12-20
   3021 
   3022   * git-prompt, git-status 等の機能の模倣?
   3023 
   3024 2021-12-18
   3025 
   3026   * contrib/git: dirty で rps1 が更新された瞬間にカーソル位置がずれた。これは後
   3027     で調べる必要がある。
   3028 
   3029   * deprecated functions の枠組みを整える。
   3030 
   3031     散発的に deprecate して行くと毎回設定を変更しなければならず面倒なので、
   3032     version を指定して特定の version 以降になった時に限り初回だけ警告を表示する
   3033     様にするのが良い。
   3034 
   3035     ((_ble_version>=500)) && ..... と言った具合。
   3036 
   3037     ? reject: deprecation は version ではなくて独立な番号付を使う可能性?
   3038 
   3039       →omb において考えていたが、これは特定のバージョンを予め指定するよりは
   3040       deprecation level の様な 1 個ずつ増える整数にするのが良い。というのも、そ
   3041       もそもどの version で完全廃止するのかというのは廃止を決定した瞬間には分か
   3042       らないという事。そして、実際に廃止する瞬間には基本的には全て一度に廃止す
   3043       るのであって、機能によって廃止したり廃止しなかったりという事はない。なの
   3044       で基本的には、新しく廃止をマークする時には次の deprecation level を指定し
   3045       ておいて、deprecation level が上がる時に一斉に廃止するのが良いと思われる。
   3046 
   3047       一方で、もしかすると緊急で廃止したいという状況が現れるかもしれないので、
   3048       deprecation level は基本的には 100 の倍数にして置いて、細かい廃止を実行し
   3049       たい時に限って 1 ずつ上げる様にするというのも手である。と思ったがその様に
   3050       考えると結局それは _ble_version と同じになるのではないかという気もする。
   3051       但し、基本的に廃止等は master でしか起こらない気がするので patch level と
   3052       deprecation level に関してはずれが生じるだろう。
   3053 
   3054       また minor version とは無関係に廃止するという事があるのかも分からない。と
   3055       いう事を考えるとやはりその意味に於いても ble.sh に於いては deprecation
   3056       level と version は一致させて良いのではないか。という気がしてきた。
   3057 
   3058   * complete: FIGNORE と -o filenames
   3059 
   3060     どうやら元の bash では -o filenames が指定された時にのみ FIGNORE が使われる
   3061     様である。一方で、現在の ble.sh では FIGNORE が設定されている時には強制的に
   3062     fignore が実行される様になっている気がする。と思ったらこれは shopt -s
   3063     force_fignore の設定を参照しての事だった。よく分からないのは bash は
   3064     force_fignore が設定されていても、-o filenames が指定されていなければ
   3065     FIGNORE が有効にならない様だという事。
   3066 
   3067     * FIGNORE で全て候補が消えた場合には FIGNORE を無効化して全て採択するべきで
   3068       は? と思ったが元の bash ではその様な取り扱いはしていない。
   3069 
   3070     * Note: bash FIGNORE は glob は解釈しない。bash FIGNORE はそれが実際には存
   3071       在しないファイル名だったとしても、FIGNORE に一致すれば候補削除する。bash
   3072       FIGNORE は候補が FIGNORE で全滅してもそのまま。bash FIGNORE は単一候補だっ
   3073       た時にも FIGNORE を適用して候補を消す。
   3074 
   3075 2021-12-14
   3076 
   3077   * compat: RLogin で ble-detach した後に modifyOtherKeys の状態がおかしい。
   3078     bash --norc してもおかしい。RLogin である事は検出できている。
   3079 
   3080   * compat: terminator で status_line で表示が崩れる
   3081     →これは今確認した所再現しない。terminator ではなく terminology の可能性?
   3082     或いは古い vte の問題だった可能性もあるかもしれない。
   3083 
   3084   * compat: mlterm 起動時に表示が乱れる with statusline
   3085 
   3086     →これは単純に初期の char_width_mode,char_width_version が一致していない事
   3087     による問題だった。始めから east にしておけば乱れは生じないという事は確かめ
   3088     た。然し、auto で幅を判定する迄の表示の乱れは一般の問題ではないだろうか。
   3089 
   3090     乱れを最小限にするには文字幅を大きめに取るという意味で east で始めるという
   3091     手もあるかもしれないが、実際には west の端末の方が多いという事を考えると別
   3092     の問題が出てくる可能性がある。また、CPR に応答しない端末の場合ずっと east
   3093     という事になってしまって問題である。起動して暫くは east にしてそれから west
   3094     になるという様な感じの物を auto で判定中の幅にするべきだろうか?
   3095 
   3096   * C-backspace の問題 (端末自動判定?)
   3097     https://github.com/akinomyoga/ble.sh/issues/94
   3098     https://github.com/akinomyoga/ble.sh/issues/104
   3099     https://github.com/msys2/MSYS2-packages/pull/2490
   3100     https://github.com/microsoft/terminal/issues/755
   3101 
   3102     以前に色々の端末の動作を調べたと思ったが記録が全く残っていない。辛うじて上
   3103     記の MSYS2 にどのようなパターンがあったかが記されているが、それぞれどの端末
   3104     がどう振る舞っていたかの情報はない。改めて調べる。→ wiki にまとめた。
   3105 
   3106     うーん。^? と ^H が異なる形に bind されているという事は。。。どうしようもな
   3107     い。既定では両方とも backspace だと思って置くしかない。ユーザーが自分で設定
   3108     をする時にちゃんと判定するのが良い。
   3109 
   3110     もしくは端末を自動的に判定して C-h, C-_, etc を C-BS に置き換える設定を行う
   3111     という事も考えられる。
   3112 
   3113 2021-12-11
   3114 
   3115   * declare の引数チェックをもっと真面目に実装する。chroma のインターフェイス
   3116     設計の足がかりにする。
   3117 
   3118     * wattr=- (未着色) の時にのみ着色しているが、実際には一つでも未着色があった
   3119      らそれ以降の引数に対して与える影響を考慮に入れなければならない。但し、これ
   3120      を実行すると毎回ファイル名着色が全て計算されるなどの様な形になりとても遅く
   3121      なると思われるので、未だ実装しない。
   3122 
   3123       これは一般の問題なので別項目で議論するべき気がする。mandb_opts 等を用いて
   3124       指定する可能性。
   3125 
   3126     * declare: -f, -F が含まれる場合には関数名として任意の名前を含む事ができる。
   3127       というかオプション名も含む事ができる? (declare -F -f とした時の解釈はどちら
   3128       になるのだろうか?)
   3129 
   3130     * 変数代入の形式をしていない引数に関しては中身によってOKかもしれないし駄目
   3131       かもしれない。
   3132 
   3133   * refactor: highlight-variable というインターフェイスを作る。
   3134 
   3135     と、思ったが quote 等も考えるとそういった関数を提供する事に意味があるのか
   3136     分からなくなってくる。先に quote 除去した時の対応関係について解決する枠組
   3137     みが必要になるのではないかという気もする。
   3138 
   3139   * cmdspec: cd 関連の cmdinfo は core-cmdspec ではなくて contrib/cmdspec/* 辺
   3140     りに移動する?
   3141 
   3142   * PROMPT_COMMAND / trap DEBUG で問題が起こる? (found by rashad-moves)
   3143     https://github.com/rashad-moves/HomeConfigurationFiles/commit/efbac4153fd5021f1bc00d42c618fd9d6f4090b9
   3144 
   3145     2022-03-03 うーん。どうもこの問題は以下で報告されている物と同じの気がする。
   3146     timer_show が含まれている。
   3147     https://github.com/akinomyoga/ble.sh/issues/176
   3148 
   3149     実行時間の表示について Q&A にでも書いておくべきだろうか。
   3150 
   3151   * complete (source:rhs): 変数名依存の補完に対応しても良いのでは。
   3152 
   3153   * complete: ARGEX (eval 文脈) の補完
   3154 
   3155     現在は "variable:=, command:D, file" で生成しているが、本来は一番先頭の引数
   3156     を元にして argument (including progcomp, etc.) を呼び出すべきなのではないか。
   3157 
   3158   * complete: [[ の中の文法も考慮した補完。これは [[ の中の文法にちゃんと対応し
   3159     た後で考える事の気がする。
   3160 
   3161 2021-12-06
   3162 
   3163   * mandb: コマンドの名称を抽出して保持して置けば binary の呼び出し時に使える。
   3164     dnf や apt 等に問い合わせても良いのかもしれない。或いは、含まれているパッケー
   3165     ジを見るという手もある。
   3166 
   3167     然し各コマンドについて man 等を呼び出すのは高価である。
   3168 
   3169     rpm, dnf でファイルの所属する package と含まれるファイルを抽出するには。
   3170     https://linux-audit.com/determine-file-and-related-package/
   3171 
   3172     $ dnf -C repoquery --installed -f /usr/bin/git-lfs --qf '%{summary}'
   3173 
   3174     等の様にすれば良い。
   3175 
   3176     * resolved: しかしこれを呼び出すと package 一覧のダウンロード等を実行し始め
   3177       るので問題がある気がする。或いは、更新を無効化した状態で呼び出す事ができ
   3178       るだろうか →どうやら dnf -C とオプションを指定する事で cache から情報を
   3179       取得できる様だ。
   3180 
   3181     * background で生成するにしても時間がかかるので、複数の bash session で同時
   3182       に更新が実行されない様に注意が必要である。*.part.$$ に書き込んで、その後
   3183       でそれを mv するという形にすると良い。更に、他の session が既に生成を試み
   3184       ている場合には、background 生成を止める事にする。
   3185 
   3186     うーん。以下の結果を加工すれば一挙に全てのコマンドについて情報を抜き出せるのでは。
   3187        $ dnf -C repoquery --installed --whatprovides /usr/bin/\* --nvr
   3188        $ LANG=C dnf -C provides -q /usr/bin/\*
   3189 
   3190     * man -f ...
   3191 
   3192       というか man -s 1:6:8 -f command... を呼び出せばよいらしい。
   3193 
   3194       * linux では man -s 1:6:8 -f command 等として結果を得られる。whatis -s
   3195         1:6:8 command としても同じ出力結果である。というか whatis 自体が man に
   3196         よって実装されている疑惑 (-s オプションなどがあるので)。
   3197 
   3198       * cygwin で実行したら駄目だった。whatis sed awk とした時と全く同じ出力結
   3199         果になったので、whatis を使っているのだろう。
   3200 
   3201       * solaris では man -f sed は表示されるが、man -f sed awk や man -f sed -f
   3202         awk 等の様にして複数の結果を取得しようとすると何も表示されなくなる。1行
   3203         目は空行で、2行目に man ファイルの情報があって、3行目にようやく説明が表
   3204         示される。
   3205 
   3206       * minix では man -f sed で whatis を間接的に呼び出そうとしている。そして
   3207         whatis はデータベースがない等の文句を言って動かない。
   3208 
   3209       * freebsd でも whatis を呼び出している様だ。警告が出ているが、複数指定し
   3210         たら複数の説明をちゃんと出力してくれる。, 区切りで一行に複数の名称を出
   3211         す事もある。例えば man -f awk とすると "awk, nawk (1) - <説明>" という
   3212         具合の行を出力する。
   3213 
   3214   * complete: 文字列引数の中にファイル名を含めたい事もあるのでは。つまり "add
   3215     a.sh" の様な。特に complete -m '...' の編集で欲しくなる。
   3216 
   3217   * bash-completion: awk - で long option だけが生成される。調べてみると
   3218     complete -F _longopt が割り当てられているコマンドについては全てこのパターン
   3219     の様である。
   3220 
   3221   * bash-completion: 空文字列に対して最初からオプションも生成して欲しい。
   3222     そうしないと絞り込みの際に都合が悪い。
   3223 
   3224     うーん。bash-completion や他の補完の事を考えると一文字目に - が入力された時
   3225     点で候補を再生成するべきの気がする。或いは - から始まる候補も追加する? 追加
   3226     する場合には以前にあった物と重複する候補を削除しなければならない事に注意する。
   3227 
   3228   * syntax: for $(echo hello) に対しては着色しない。もしくはエラーとする。
   3229 
   3230     これは heredoc 単語と同様の問題である。因みに heredoc の単語に $() を含めた
   3231     場合には、終端位置判定が正しくできなくなっている。普通に入力すると終端位置
   3232     を逃す。終端を書いてから heredoc の中身を編集すると位置を正しく特定できる。
   3233 
   3234 2021-11-23
   3235 
   3236   * kitty shell-integration (requested by kovidgoyal)
   3237     https://github.com/akinomyoga/ble.sh/issues/110#issuecomment-976182311
   3238     https://github.com/kovidgoyal/kitty/issues/3948
   3239 
   3240     | [Check default shell-integration]
   3241     |
   3242     | * ok: 前のコマンドの内容を less で見る: C-S-g
   3243     |
   3244     |   vim-airline を表示している時に問題が生じる。中途半端に切れたりする。
   3245     |
   3246     | * ok: プロンプト移動(scrollback): C-S-{z,x}
   3247     |
   3248     | * マウスによるプロンプト内の移動:
   3249     |
   3250     |   遅い、vi_nmap の中にいると変な事になる。うーん。これはまた後で確認する。
   3251     |
   3252     | * xterm-title で現在ディレクトリを表示する。
   3253     |
   3254     |   これは別に何か新しい機能という訳でもないだろう。敢えて ble.sh で対応する
   3255     |   とするのであれば、bleopt prompt_xterm_title を用いるぐらいの事である。
   3256     |
   3257     | * これも特に変な事はない。但し、ble.sh 側でユーザーが何か設定している場合に
   3258     |   は、kitty integration の設定は off にすれば良い。
   3259     |
   3260     | * ok: winch glitch の解決。これは綺麗に動いている。
   3261     |
   3262     | * Sophisticated completion for the kitty command in the shell. これは
   3263     |   core-complete の領分であるが何か特別な事が起こるとも思われない。
   3264     |
   3265     | 結局 vim-airline を実行した事による問題点は C-S-g で閲覧する内容の切り取り
   3266     | 以外では特に問題になっていない様に見える。以下の三点を報告する。
   3267     |
   3268     | x subshell の中でちゃんと動作していない。従って tmux の内部でも動作しない。
   3269     |
   3270     | x 複数行コマンド編集時に vi_nmap で位置がずれる。他の keymap では問題は生じ
   3271     |   ない。
   3272     |
   3273     | x vim-airline を使っていると時々コマンド内容が切れる
   3274 
   3275     最初の項目については意図的なのだという返信が来た。だとしても tmux で空にな
   3276     るというのは変である。後で patch を作っても良い。問題にしているのは
   3277     invasive という事だったので SHLVL, SUBSHELL, $- 辺りを参照して本当に kitty
   3278     の中にいる時にだけ有効にするというのが良いのかもしれない。(と思ったが、元々
   3279     の kitty.bash でも kitty かどうかをチェックしているのではないか?)
   3280 
   3281     2つ目の項目に関しては仕方のない制限だという事。up/down を有効化する
   3282     sequence について提案した所、patch が送られてきたら見るとの事。これは忙しい
   3283     ので今は未だ。
   3284 
   3285     3つ目は調査中。
   3286 
   3287 2021-11-21
   3288 
   3289   * complete: インラインでヘルプ・次に期待する引数の種類を表示するという話
   3290     https://www.reddit.com/r/bash/comments/qrm3s2/hints_for_argument_types_in_bash/
   3291     https://github.com/fish-shell/fish-shell/issues/2201
   3292 
   3293   * やはりメモリを使うという事は明記するべきである。
   3294 
   3295     bash-3.2 16MB 19MB
   3296     bash-4.3 26MB 31MB
   3297     bash-5.1 33MB 40MB
   3298 
   3299 2021-11-05
   3300 
   3301   * vim の :term 内部で実行すると振る舞いが変だ
   3302 
   3303     * 先ず最初のロード時に行が一行ずれる。それ以降は発生しない。modifyOtherKeys
   3304       もしくは文字幅判定の為に出力している何かが問題を起こしているのかもしれな
   3305       い。
   3306 
   3307       →どうもこのずれは status_line に関係している様だ。
   3308 
   3309     * うーん vim :term の中だと NUL (C-@, C-SP) を入力することができない。C-wは
   3310       vim の側での操作に使われている様だ。これらは ble.sh の外側でも同様である
   3311       事から、ble.sh の問題ではない。寧ろ vim term の仕様と見るべきである。
   3312 
   3313   * bash-5.2 で builtin bind -Xs を観察するとところどころ \000 が余分に挿入され
   3314     ている。これは何か。bash-5.1 では問題はない。
   3315 
   3316 2021-10-26
   3317 
   3318   * winch: Window サイズを変化した時に menu の座標計算がずれる
   3319     (menu_style=dense)そもそも resize した時点で menu の再配置を実行しなければ
   3320     ならない筈である。
   3321 
   3322     或いはサイズが変わった時には menu-complete はキャンセルするべきなのではない
   3323     か? 特に大量の WINCH を送ってくる端末があって、大量のメニュー項目の後ろの方
   3324     のページを表示しているとすると、ほぼフリーズした様な形になってしまう。
   3325 
   3326     或いは次に TAB を押して他の項目を移動しようとした時点で改めて配置計算を実行
   3327     する? 例えば、WINCH を受け取った時点では info を単に非表示にしておいて、次
   3328     にメニューに対して表示の変更等を行う必要が生じた時に改めて計算を実行する。
   3329 
   3330     2022-03-04 そもそも ble/edit/info 自体が WINCH の時に再計算するべきなのでは
   3331     ないか。特に高さだけでなく幅についても考えて再計算しないと内容が乱れてしま
   3332     う。
   3333 
   3334   * スタートしてから数秒間は user input detection for C-m を off にした方が良い
   3335     のでは。スタートした直後にペーストを実行する事があるとは思われない…。
   3336 
   3337     と思ったが bash を含む大量のテキストを入力した場合にどうなるのかというのは
   3338     疑問である。とは言いつつも、その場合には親シェルの側でちゃんと paste
   3339     detection ができているべきではないかという気がする。
   3340 
   3341 2021-10-04
   3342 
   3343   * fzf を直接読み込んだ時に動かない問題について
   3344     https://github.com/akinomyoga/ble.sh/issues/126
   3345 
   3346     ble-update を実行すると動く様になるが最初から source ble.sh すると動かない。
   3347     ble-import contrib/fzf-key-bindings をすると動く様になる。
   3348 
   3349     というか改めて説明を読むが一体どういう操作をしようとして問題が生じているの
   3350     か謎である。C-r, C-s をしようとした時に問題が生じているという事だろうか。現
   3351     在の実装では補完については contrib/fzf を自動でロードする様にしている。
   3352     widget に関しては contrib/fzf-key-bindings 経由で呼び出さなければ駄目である。
   3353 
   3354     うーん。自動的に検出して補正する様にしようと考えたがそんなに単純ではない様
   3355     に見える。
   3356 
   3357     a 例えば bind する瞬間に fzf 関連であるかどうかを調べて fzf 関連であると分
   3358       かった時点で fzf-key-bindings を呼び出すという方法。
   3359 
   3360       x ユーザーが実行したい binding が fzf-key-bindings と同じかどうか分からな
   3361         い。ユーザーが自分で調整して binding のキーを変更しているかもしれない。
   3362         この場合には勝手に fzf-key-bindings を読んでしまうとユーザーの予期しな
   3363         い binding が定義される事になり問題である。
   3364 
   3365         一方で、諸々の関数は fzf/shell/key-bindings.bash に定義されているのだか
   3366         ら、そこに含まれている関数を使おうとしている時点で其処にある binding が
   3367         そのまま使われていると仮定して良いのではないか。もし、ユーザーが
   3368         fzf/shell/key-bindings.bash を自分でコピー・編集して使っているのだとし
   3369         たら、やはり contrib/fzf-key-bindings.bash についても同様に自分の設定に
   3370         合わせて編集するべきなのではないか。
   3371 
   3372       o bind で -x に fzf 関連を指定した場合に関数の中身を差し替える等の事をし
   3373         ようとしても、例えば inputrc キャッシュで初期化を誘導する等の事までは
   3374         キャッシュできない気がする。
   3375 
   3376         →これに関しては fzf-key-bindings では関数の中身を差し替えるのではなく
   3377         て、別名の関数を定義してそれに差し替える様にして、更にその別名の関数に
   3378         ついての autoload を def.sh 辺りに記述する事にすれば良い。
   3379 
   3380         x この方法だと __fzf_cd__ や __fzf_history__ をユーザーが直接自分で
   3381         bind した時に対策できない。
   3382 
   3383     b 或いは、bind -x を実行する時にコマンド名が __fzf_history__ または
   3384       fzf-file-widget だった場合にこれらの関数を上書きするという手法。
   3385 
   3386       x この方法だと __fzf_cd__ の検出ができない。__fzf_cd__ は、
   3387         fzf/shell/key-bindings.bash だとマクロ経由で呼び出される様になっている。
   3388         つまり bind -x ではないという事。かと言って accept-line に作用して、コ
   3389         マンド実行前にコマンド内容を調べて関数を上書きするというのも非現実的な
   3390         気がする。
   3391 
   3392       うーん。やっぱり現状の様に設定するべきなのではないだろうか。
   3393 
   3394 2021-09-28
   3395 
   3396   * fast-syntax-highlighting
   3397 
   3398     https://www.reddit.com/r/zsh/comments/oyege0/is_completionaware_syntax_highlighting_possible/
   3399     https://github.com/zdharma/fast-syntax-highlighting/tree/master/%E2%86%92chroma
   3400     https://github.com/Valodim/zsh-capture-completion
   3401 
   3402     どうやら programmable highlighting に相当する機能は
   3403     fast-syntax-highlighting で既に実装されていて "chroma" と呼ばれているらしい。
   3404     然し実のところそれ程沢山の実装がある訳でもない。
   3405 
   3406     他に zsh-capture-completion というモジュールに含まれる関数で capture.zsh
   3407     'command' を実行すると 'command[TAB]' とした時の補完結果を取得できるらしい。
   3408     これは ble.sh の上で作成する事も可能である。補完機能のテストで使うのに便利
   3409     な気がする。
   3410 
   3411     bash-completion のテストをコピーできたら良い気がする…。でも全て python で
   3412     定義されているというのは難点である。うーん。結局、その場で補完を実行する機
   3413     能を実装したとしても使う機会がないからテストされずに残って意味のない機能に
   3414     なりそうな気がする。
   3415 
   3416   * https://www.reddit.com/r/commandline/comments/pv1fm8/what_are_the_main_advantages_of_the_various_shells/
   3417 
   3418     fish の便利な機能について紹介している。
   3419 
   3420     * M-{right,left} でディレクトリ移動。これについては異なる keybinding で提供しても良い気がする。
   3421 
   3422       iswitchb の如く C-x C-b 等で探索するのもありではないか?
   3423       その際には menu の機能を有効活用できる気がする。
   3424 
   3425     * fish の Abbreviations の振る舞いが気になる。
   3426       zsh の zsh-abbr も気になる。
   3427 
   3428     然し、実際に ble.sh をロードさせてテストするというのは有効の気がする。
   3429 
   3430   * menu: C-x C-d で今迄に訪れたディレクトリの一覧。
   3431 
   3432     iswitchb と同様に絞り込みをしたいが入力した文字列は何処に表示するのが良いのか。
   3433     panel に表示するのが良いだろうか。或いは、そもそも表示しなくても良いのかもしれない。
   3434     何れにせよ太字で表示されるのであるから。
   3435 
   3436     太字ではなくてより強調した形にしても良いのかもしれない。これは face 経由で
   3437     設定できる様にするのが良い様な気がする。現在は太字固定になっているが。
   3438 
   3439   * menu: C-x C-j で job 制御用の TUI メニューを表示しても良いのかもしれないとも思う。
   3440 
   3441 2021-09-26
   3442 
   3443   * bash-5.2: array が sparse でない ./configure option が追加された。
   3444 
   3445     もしかすると sparse arrays に declare -gA を指定する必要があるかもしれない。
   3446     sparse かつ ordered な配列については簡単な workaround は存在しない。唯、そ
   3447     の様な配列を実際に使っているかは分からない。なければ気にしなくて良い。
   3448 
   3449 2021-09-22
   3450 
   3451   * edit: 複数行モードの時は prior/next でページ移動?
   3452 
   3453   * plug: git clone 用の判定:
   3454 
   3455     これは
   3456 
   3457     $ grep -q '^github\.com' ~/.ssh/known_hosts
   3458     $ grep -qEi '[[:space:]]*HostName[[:space:]]+([^[:space:]]+[[:space:]]+)*github\.com' ~/.ssh/config
   3459 
   3460   * 実は local rex=... [[ a =~ $rex ]] は関数に纏めたら良いのでは。
   3461 
   3462     速度的にはどうだろうと思って比較してみると4倍位遅くなる。もしくは 0.014ms
   3463     だけ遅くなる。70回の評価で1ms, 1400回の評価で20ms, 7000回の評価で100msの差
   3464     が出る。
   3465 
   3466     $ ble-measure "local rex=':point=([^:]*):'; [[ alpha:beta:point=end:b = \$rex ]]"
   3467          3.618 usec/eval
   3468     $ function ble/regex#match { [[ $1 =~ $2 ]]; }
   3469     $ ble-measure "ble/regex#match alpha:beta:point=end:b ':point=([^:]*):'"
   3470         17.402 usec/eval
   3471 
   3472     うーん。一般的には気にする速度低下ではないが、構文解析などの中心部では控え
   3473     た方が良いかもしれないというぐらいである。通常の場所ではどんどん使って問題
   3474     ないのではないか。
   3475 
   3476     →検索してみたが実は意外とそんなに沢山あるという訳でもない様だ。少しずつ置
   3477     き換えていけば数日で終わるぐらいの箇所しか無い。概算で140箇所程度である。然
   3478     し、そもそも其処までして置き換える必要があるのかという疑問もある。現状で動
   3479     いているのであればそれで良いのではないか。一応他のシェルに移植する時に一括
   3480     で動作を変更するのが楽という可能性はなくはない。
   3481 
   3482     2021-12-11 ble/string#match という関数名で追加した。
   3483 
   3484 2021-09-20
   3485 
   3486   * sabbrev: accept-line の時にも展開する可能性について (requested by pl643)
   3487     https://github.com/akinomyoga/ble.sh/discussions/138
   3488 
   3489     * zsh-abbr の振る舞いについても確認する。
   3490 
   3491     * 振る舞いについての考察
   3492 
   3493       a グローバルに全ての合致する単語を置換する。
   3494 
   3495         x 先ず、意図しない物まで展開されてしまう可能性がある。
   3496 
   3497         x 展開を意図する単語があったとしても、通常は magic-space によって既に展
   3498           開されていると期待するべき。なのでわざわざグローバルな展開を試みるま
   3499           でもない。
   3500 
   3501       b 或いはその場所にある単語だけを展開する magic-accept 的な物。
   3502 
   3503       元の要求が結局どのような物だったかは返事がないので不明だが、考えて見るに
   3504       b の方が良い。
   3505 
   3506 2021-09-15
   3507 
   3508   * haiku: ble/builtin/bind/.reconstruct-user-settings の gawk が無限ループになっ
   3509     ている? 或いは滅茶苦茶遅くなっている。gawk 4.2 である。bash-4.4.23 から呼び
   3510     出している。変な事が起こる様な余地はない様な気がするが…或いは正規表現エン
   3511     ジンなどが壊れているという事なのかもしれない。
   3512 
   3513   * solaris: ble-bind を bashrc 内部で呼び出した時点で未だ attach していないの
   3514     に色々と info を表示してしまっている。
   3515     $_ble_base_cache/decode.cmap.gdict.*.dump を削除した時に再現する。
   3516 
   3517   * grapheme: SpacingMark, Prepend の幅は一体どうなっているのだろうか [#T0008]
   3518 
   3519     現在の実装では幅を全く考慮に入れていないが、入れるべきの気がする。c2w で
   3520     combining に対して 0 を返す様にしたら Extend や Prepend に対しても c2w で値
   3521     を計算して加算する様にすれば良いだろうか。然し、絵文字の Emoji_Modifier な
   3522     ど組み合わせた時と単体の時で幅の異なる物も存在する。
   3523 
   3524 2021-09-06
   3525 
   3526   * menu: メニューの詳細表示を toggle できる様にするべきではないか。
   3527 
   3528     表示するか表示しないか完全に固定するのは微妙な気がする。
   3529 
   3530     後、desc-raw しか実際には使わない様な気がする。二種類の表示方法を用意したと
   3531     しても、そもそも説明を生成する側で二種類を分けて生成する訳にも行かないので、
   3532     どちらかに統一するべきではないか。速度が気になるというのはあるが、もしテキ
   3533     ストだと解釈するとしても、全角文字などが含まれる場合には結局位置計算は省略
   3534     できない。逆に ascii 文字だけで構成されているのであれば esc を解釈するとし
   3535     てもそんなに速度低下なく処理する事ができる。
   3536 
   3537     表示の toggle は各メニューが表示される度に行うか或いは一回変更したら暫くそ
   3538     の設定を保持するか。ユーザーの指定した設定を既定値として各 menu が表示され
   3539     る度に toggle を行うという事を考えたがそれは如何にも面倒である。それよりは
   3540     toggle は永続的な変更を引き起こすとした方が分かりやすい様な気がする。その場
   3541     合には、bleopt の設定を永続的に設定してしまっても良いのではないか。
   3542 
   3543     然し、それだと desc モードになっている時に align 等を設定した時にどの様に振
   3544     る舞えば良いのか分からない。一つの手は一旦完全に toggle 状態を clear して、
   3545     改めて既定の style として align を設定するというのが自然な気がする。
   3546 
   3547     * toggle するとしたらその表示切り替えのキーボード操作はどうするのか。C-m と
   3548       思ったがそれだと確定と同じ。C-d だと削除みたいな感じがする。insert は確か
   3549       に toggle だがやはり直感的ではない気がする。 ScrLk や CapsLock NumLock 等
   3550       も同様である (というか OS 側のキーボードの状態が変わってしまったりして大
   3551       変である)。
   3552 
   3553       後、実際に menu-complete に入らなくても切り替えられた方が良い様な気がする。
   3554       その場合には他と被らない様な操作にする必要がある。他で使われていない
   3555       single-key の操作はそうそう残っていない気がするし、残っているとしてもそれ
   3556       をたかが menu toggle に割り当てるべきなのかという問題もある。或いは、2
   3557       keys による操作としても良い様な気はしている。
   3558 
   3559       例えば C-x | 等。特に C-x は menu-complete やその他の complete に色々割り
   3560       当てているから丁度良い気がする。
   3561 
   3562       - "C-x d" は emacs では dired,
   3563       - "C-x ?" は emacs では keybinding 一覧,
   3564       - "C-x h" は emacs では全選択に割り当てられている。
   3565       - "C-x |" は emacs では割り当てがない。
   3566       - "C-x C-h" は前の文を削除する。
   3567       - "C-x C-t" は行の入れ替え。
   3568 
   3569       若干操作しにくい気がするが、うーん。一旦 menu-complete に入ってしまえば
   3570       "|" で入力できるようにすれば良いと思ったが…普通に "|" を入力したいという
   3571       時があるのでそれは駄目だ。やはり C-? の形の方が良い。
   3572 
   3573   * menu: preview 機能をつけても良い。preview に表示する中身は候補の種類に応じて色々。
   3574 
   3575     そもそも desc の内容自体その場に表示するのではなくて preview 的な小さな窓の中に
   3576     選択した時にだけ表示するという形式でも良いのではないかという気がする。
   3577 
   3578 2021-09-02
   3579 
   3580   * 改めて確認した所また Windows Terminal で動かなくなっている
   3581 
   3582     調べると Cygwin 経由で接続した時だけの問題の様である。
   3583     これは Cygwin の側の conpty の副作用という可能性もある。
   3584     というか最新版の Cygwin で直っている可能性もある。
   3585 
   3586     ? wt を path に加えて実行もできるのにも関わらず構文着色で赤になっている。不思議だ。
   3587       type wt とするとちゃんと成功する。
   3588 
   3589     ? Cygwin から起動した時とスタートメニューから起動した時で、Windows
   3590       Terminal の中で Cygwin タブを開いた時のプロンプトに含まれるシー
   3591       ケンスが異なっている気がする。と思ったが、これは Cygwin の
   3592       screen の中から起動すると、Windows Terminal の中の Cygwin も
   3593       screen の中にいると勘違いするからであろう。気にしなくて良い。
   3594 
   3595       取り敢えず環境変数が継承される事は確認したし、
   3596       CYGWIN=disable_pcon を指定していても指定していなくても Windows
   3597       Termianl - Cygwin では座標計算がずれるという事が確認できた。やは
   3598       り pcon は関係ないのかもしれない。
   3599 
   3600   * 起動時間を計測しているようだ
   3601 
   3602     ble.sh でかなり時間がかかっている様だという事。
   3603 
   3604     * ble.sh は background 処理を行う。特に ble-attach の末尾で行っている気がす
   3605       る。なので、ユーザーが何も入力しない限り background 処理を完全に終えるま
   3606       で ble-attach から抜けないのではないか。逆に、ユーザーが何か入力している
   3607       時にはより早く初期化できるのではないか。と思って試してみたがそうでもない。
   3608       というか殆ど変化がない。どういう事だろうか。
   3609 
   3610       ユーザー入力の検出ができていない? 或いはそもそも background 処理は最初は
   3611       行っていない? 後者の様な気もするが後で確認する必要がある。
   3612 
   3613       letsnote でも試してみたがやはりユーザー入力があっても殆ど変化はない。
   3614       GNU/LInux でも Cygwin でも同様にユーザー入力があっても変化はない様だ。
   3615 
   3616       実装を確認してみると確かに ble-attach の末尾で .tail を呼び出してい
   3617       て、.tail は idle.do を呼び出している。うーん。不思議だ。或いは .tail の
   3618       前後だけに注目すればより短くなっているかもしれない。
   3619 
   3620     * MSYS2 環境では ble.sh のロード及び attach にはかなり時間がかかる様だ。と
   3621       いうかこれは fork の回数に直結しているという気もする。MSYS2 で調べると
   3622       spawn が 10/s だった。
   3623 
   3624       一方で Cygwin だと 23/s 程度である。実は Cygwin の方が軽量である。或いは
   3625       最適化が施されていると見るべきか。或いは whitelite に入れていただろうか。
   3626 
   3627 2021-08-31
   3628 
   3629   * complete: -E (_EmptycmD_) に対応していない
   3630 
   3631     一方でこれは一体どの様に振る舞うものとして実装すれば良いのか分からない側面
   3632     がある。文字列が本当に空の時にはこれを使って補間するので良い。
   3633 
   3634     * ; で区切って未だ何も入力していない状況の時にはどう振る舞うべきか。元の
   3635       bash では本当に空文字列の時にだけ呼び出される様である。また -E の用途とし
   3636       て空の時のコマンド候補を生成するという役割もあるかもしれないが、
   3637 
   3638       というか改めて考えると ; で区切って未だの時には -I が対応する補完になるの
   3639       ではないか。という事を考えると -E はやはり完全に空の時に対応するのではな
   3640       いだろうか。実際に試してみるのが良い気がする。
   3641 
   3642       complete -F _initial -I, complete -F _empty -E で試してみると ; の次で呼
   3643       び出した補完の場合には _initial が呼び出される。完全に空の時には _empty
   3644       が呼び出されていて一文字でも入力されていれば _initial が呼び出される。入
   3645       力されているのが空文字列であっても同様である。
   3646 
   3647     実装するとしたらどの様に実装するべきだろうか。単に空の時には新しく -E で呼
   3648     び出す仕組みを作れば良いのだろうか。
   3649 
   3650   * msys2 での ble-update で変な動きをした。。
   3651 
   3652 2021-08-30
   3653 
   3654   * complete: overridden builtin 及び他の framework
   3655 
   3656     | * https://github.com/csdvrx/bash-timestamping-sqlite
   3657     |
   3658     |   この実装では history コマンドを上書きしている様な気がする。然し同時に
   3659     |   ble.sh との併用を推奨している。うーん。この時 ble.sh が history を上書きす
   3660     |   る、もしくはble.sh の history がこの枠組に上書きされるという事があったら何
   3661     |   が起こるのだろうか。何か悪い事が起きる気がする。
   3662     |   ble/function#push とかを使って何とかすれば良いのだろうか。
   3663     |   その場合にはこの interface を固定する必要がある。
   3664     |
   3665     |   と思って実際にコードを確認したが history を上書きしている訳でもない様だ。
   3666 
   3667     何れにしてもこれは注意点として README に記述しておくべきなのではないか。
   3668 
   3669   * complete: そもそも遡って書き換える補完候補と純粋な意味での補完候補は区別す
   3670     るべきなのかもしれない。TAB 補完では後者に基づいて補完を実行するが、メニュー
   3671     の表示には両方を表示するという手がある。その場合にはメニューの内部で
   3672     section を分けると良いだろうか。ページング等をちゃんと考慮に入れる必要があ
   3673     る。
   3674 
   3675 2021-08-29
   3676 
   3677   * bashrc に直接設定を書く方法についても説明する。
   3678 
   3679     但しこの場合には ble-reload をした時に設定が消えるという事に注意する。→うー
   3680     ん。この様な面倒な事が起こるのであればやはり記述しないほうが良いのではない
   3681     か。
   3682 
   3683     よく考えてみたら source ble.sh と ble-attach の間に書いた bind にも同様の問
   3684     題があるのではないか? と思ったが、ble-attach よりも前に書いているのであれば
   3685     ちゃんと readline の側にも反映されている筈で問題はない筈。
   3686 
   3687     ユーザーがコマンドラインから設定した設定は消えてなくなってしまうという事に
   3688     注意する。これらを記録して後で拾える様にするという手もあるかもしれないとは
   3689     思う。
   3690 
   3691 2021-08-26
   3692 
   3693   * CPU 100% in macOS (reported by killermoehre)
   3694     https://github.com/akinomyoga/ble.sh/issues/131
   3695 
   3696     CPU 100% になっている時に同時に gawk が待機している様である。
   3697     100% になっている時の gawk の引数について尋ねたら返答が来た。
   3698 
   3699     二つの bash について異なる gawk が呼び出されている。前者は
   3700     ble/history:bash/resolve-multiline/.awk で、後者は
   3701     ble/history:bash/load/.background-initialize である。両方とも
   3702     history に関係している。
   3703 
   3704     Q というかどちらの bash が CPU 100% になっているのだろうか。或いは両方?
   3705 
   3706     Q bash が起動した時に暫く 100% になるのか起動した後もずっと 100% のままなの
   3707       か。もし暫くしたら収まるのだとしたらどれぐらいの間 100% でいるのだろうか。
   3708       これがそんなに長くなければ少なくとも見た目の動作に影響がない限りはそのま
   3709       まにしておいても良い様な気がする。
   3710 
   3711     Q CPU 100% になっている間 bash は応答するだろうか。応答するとしたら
   3712 
   3713     Q いつでも現象は再現するだろうか。或いは確率的に発生するだろうか。
   3714 
   3715     ----
   3716 
   3717     取り敢えずやはり巨大な history が問題であるという事までは分かった。
   3718     自分の手許の linux では同じぐらいの巨大な history を用意したとしても
   3719     そんなに遅くはない。
   3720 
   3721     ? 一方で向こうの報告によると builtin history を実行しているプロセスが重いと
   3722       いうことの様である。自分の手許で確認しようとしているがすぐに処理が終わっ
   3723       てしまうので確認できない。
   3724 
   3725     * 終了時にもかなり待たされる。
   3726 
   3727       終了時の nawk が滅茶苦茶遅くなる。gawk だと遅くないとかあるのだろうか。と
   3728       思って改めて観察してみると最初に bash が 100% になって、その次に nawk が
   3729       100% になるという具合に処理が進行している。
   3730 
   3731       ble/builtin/history/.write で時間を消費している。
   3732 
   3733       A:1630043056.816931
   3734       B:1630043056.936962 0.12s ... history/.get-min
   3735       C:1630043056.942516 0.06s ... history/.get-max
   3736       D:1630043079.487224 13s ... builtin history >> file
   3737       E:1630043092.465937 13s ... nawk の処理
   3738 
   3739     Q hang と slow は区別しているのだろうか。自分的には hang というのは待っても
   3740       絶対に終わらないという意味である。然し、向こうは有限時間で終わるという事
   3741       を確認しているのにも関わらず hang と言っている可能性がある。よく分からな
   3742       い。
   3743 
   3744 2021-08-23
   3745 
   3746   * bash-4.2 では [[ ${arr[*]} == *" 2 "* ]] (where arr=(1 2 '')) が駄目
   3747 
   3748     一応該当しそうな物を検索すると以下の様な物がある。
   3749     何れも空白には関係なさそうなので問題は起こらなそうな気がする。
   3750 
   3751     $ grc '\[\[ \$\{.*\[[*@]\].*\} [!=]= .* \]\]'
   3752     ./ble.pp:145:    { ((${#BASH_SOURCE[@]})) && [[ ${BASH_SOURCE[${#BASH_SOURCE[@]}-1]} == *bashrc ]]; } ||
   3753     ./src/decode.sh:3632:    [[ ${keys[*]} != "$bind_keys" ]] &&
   3754 
   3755 2021-07-14
   3756 
   3757   * bash-it によるプロンプト設定が prompt attach で反映されない。
   3758 
   3759     PROMPT_COMMAND 経由で PS1 を設定していると反映されないのだろうかと思ったが
   3760     そういう訳でもない様だ。
   3761 
   3762     powerline-multiline で発生するとの事だが再現しない。
   3763     というか powerline-multiline で発生する固有の問題なのか、
   3764     それとも他の theme でも動作するのかの情報についても書いていない。
   3765 
   3766 2021-07-13
   3767 
   3768   * auto-menu: 一旦 (no items) が表示されるとそれ以降 auto-menu が動作しない
   3769 
   3770     auto-menu が有効になっている時に一旦 (no items) が表示されるとそれがそのま
   3771     まになって二度と auto-menu が起動しなくなる。
   3772 
   3773     またこの時に C-l で再描画すると info に何も表示されなくなる。実はこれは
   3774     menu が表示されている時には常に再現する問題である。
   3775 
   3776 2021-06-21
   3777 
   3778   * auto-menu が有効になっている時に複数行編集で座標が変になる
   3779 
   3780     2021-07-13 今試しても問題は再現しない。
   3781 
   3782     2021-07-18 再現した。履歴に複数行の項目が含まれている時に、その履歴が呼び出
   3783     されると問題が発生する。ble-bind ... と入力した時に発生した。というかこれは
   3784     本当に auto-menu の問題なのかどうか分からない。取り敢えず、textmap を再確認
   3785     する必要がある気がする。ずれの量的にも前回の textmap の時と似たような振る舞
   3786     いの様に見える。
   3787 
   3788     2021-07-19 chatoyancy の上では再現しない? vaiio2016 の上でも再現しない。
   3789 
   3790 2021-06-18
   3791 
   3792   * grapheme: ble/canvas/trace の lc lg の grapheme cluster 対応について
   3793     Ref #D1619
   3794 
   3795     基底文字だけを指定しても、最後の Extend を指定しても端末によって左の書記素
   3796     クラスターが破壊される可能性がある。書記素クラスター全体で出力する必要があ
   3797     る。lc lg の組ではなくて lcs lw lg の組で結果を返さなければならない。lc lg
   3798     はデバグ用なので其処まで配慮する意義は薄い。
   3799 
   3800     そもそも lc lg の枠組みはそろそろ削除しても良いのではないかという気すらする。
   3801 
   3802   * grapheme: 私用文字で置き換える事により書記素クラスター単位での編集を可能にする可能性
   3803     Ref #D1619
   3804 
   3805     現在の所その必要性は限りなく低いと考えられる。
   3806 
   3807   * grapheme: Unicode version 毎の振る舞いの違い?
   3808     Ref #D1619
   3809 
   3810     emoji_version と同様に grapheme_cluster についても version 毎の違いを考えて
   3811     も良いのかもしれない。
   3812 
   3813   * emoji: Emoji 対応状況自動判定
   3814     Ref #D1619
   3815 
   3816     | これも自動検出の対象にしても良いのでは。という気がする。というかそうする
   3817     | べきである。所で Zle は実は内部的にそういう事をしている可能性がある。
   3818     |
   3819     | と思ったが端末によって unqualified の取り扱いもばらばらだろうし ZWJ に対
   3820     | 応しているのかどうかも不明だし、という事を考えていくと単に
   3821     | legacy/extended を区別すれば良いという訳ではない。場合によっては ZWJ シー
   3822     | ケンスに対応しているかどうかと言ったフラグまで管理しなければならないかも
   3823     | しれない。とは言いつつ実際にそのように振る舞う端末が存在するのかどうかも
   3824     | 不明である。なので、これは実際の端末の振る舞いを整理しながら考える必要が
   3825     | ある。
   3826     |
   3827     | 端末ごとの絵文字の振る舞いについて調べる必要がある気がする。kitty/vte は
   3828     | unqualified はテキスト表示で EPVS によって絵文字になる。RLogin は
   3829     | unqualified は半角で表示される? 幅は VS で変化しないように見える。mintty
   3830     | は試した限りでは Emoji に対応していない。既定で off になっているという事
   3831     | だろうか。
   3832     |
   3833     | 以下の振る舞いも端末の対応状況に応じて実装する。
   3834     |
   3835     | * EPVS の時には emoji_width または 2 になる様にしている。然し、絵文字の表示
   3836     |   ができない端末では 2 にせずに普通の文字として求めた方が良い可能性もある。
   3837 
   3838     * legacy vs extended
   3839     * unqualified をどう取り扱うか。EPVS 及び TPVS がどう作用するか
   3840     * ZWJ sequence に対応しているかどうか
   3841 
   3842     現実の端末に於いてそれぞれどう対応されているか、そして三つの対応状況の組み
   3843     合わせはどうなっているかについても調べる必要がある。
   3844 
   3845   * test: ログを何処かに保存する機能? その場合には着色等は除外する
   3846 
   3847   * syntax_debug の時にコマンド実行すると実行位置が変だ
   3848 
   3849     うーん。info を削除する時のシーケンスが間違っている? menu の表示時には何も
   3850     問題がない。menu に関しては消去してから実行するからだろうか。或いは、変なタ
   3851     イミングで info が更新されて info が表示されてはいけないタイミングで表示さ
   3852     れているという事だろうか。
   3853 
   3854   * progcomp の出力に関する議論 (reported by oc1024)
   3855     https://github.com/akinomyoga/ble.sh/issues/121
   3856 
   3857     うーん。どうするのが良いのか微妙。Bash と同じ様に動作するべきなのか、或いは
   3858     出力を抑制するべきなのか。関連する議論が幾つかあった様な気がする。というか
   3859     最近抑制する様に変更した様な気がするが何故再発しているのだろう。実際に確認
   3860     してみた所、歴史的には常に出力を許している様にも見える。不思議だ。
   3861 
   3862     うーん。実は progcomp-helper-func ではなくて、compgen の時点で出力を抑制し
   3863     ていたのだったろうか。
   3864 
   3865     * 98835b5 2021-05-17 これは _ble_util_fd_stderr 等に保存した fd を使う様に
   3866       する変更。本質的には tty を使う様になっている。元から helper-func で tty
   3867       にリダイレクトしていた。
   3868 
   3869     * 9d4ad56 2021-05-06 うーん。以前の報告が見つかった。よく見たらこれも
   3870       oc1024 による報告である。この commit では stderr に関連する変更はない。
   3871 
   3872       https://github.com/akinomyoga/ble.sh/issues/97
   3873 
   3874       どうもこの時は個別にバグのある関数を置き換えたのだった。修正は 9d4ad56 で
   3875       ある。stderr/stdout に対しては全く変更していないし細かい議論もしていない。
   3876 
   3877     * 4fc51ae 2021-03-10 fzf に対する対策。これについては明示的に tty にリダイ
   3878       レクトしている。これより前は compgen 呼び出しの stderr への redirect の為
   3879       に stderr は抑制されていた。
   3880 
   3881     * 68f8077a 2020-04-06 これは compgen 呼び出しに builtin を付加しただけ。
   3882 
   3883     * 1ca53868 2019-01-01 これは complete -p の解析に機能を追加した物。この時点
   3884       で compgen の stderr は抑制している。
   3885 
   3886 2021-06-13
   3887 
   3888   * menu-complete: 末尾一致 (skip-completed-text) が考慮に入っていない
   3889 
   3890     これは最終的な挿入時に処理するべきか、或いはメニュー項目を一時挿入している
   3891     時から処理するべきか。メニュー項目を一時挿入している時から処理しないと振る
   3892     舞いとして不自然になる気がする。
   3893 
   3894   * 終了ステータスが 2 の時に前回のコマンドを再ロードするというのは面白い試みかもしれない
   3895 
   3896     最近人気らしい thefuck により修正後のコマンドが取得できればなお良い。
   3897 
   3898 2021-05-29
   3899 
   3900   * syntax: 単語が sabbrev に一致する場合には着色するのが親切だ
   3901 
   3902     これは sabbrev に対する仕様拡張を行ってからでも遅くないのではないか。
   3903     ble/syntax/progcolor/word:default 辺りに修正を加えれば良い。
   3904     本来は progcolor よりも上の枠組みで着色したい気もするが
   3905     それだと layer を増やす必要がある。処理が重くなりそうである。
   3906 
   3907     check-sabbrev 的な感じで付加的な処理として実装できれば良い。
   3908     そうすれば custom な着色関数からでも呼び出せる。
   3909     と思ったがちゃんと忘れずに呼び出すのも面倒である。
   3910     やはりもっと下の枠組みで提供するべきだろうか。
   3911     例えば、最終的に着色を格納する部分に介入してしまうという手もある。
   3912 
   3913 2021-05-27
   3914 
   3915   * wiki の更新
   3916     * done: \g{...} について記述する (2021-06-13)
   3917     * wiki: ble-import の -f オプション
   3918     * wiki: bleopt の wildcard, -r, -u
   3919     * wiki: blehook の -a
   3920     * 2021-06-12 wiki: bleopt -I
   3921     * 2021-05-24 airline: 使い方を説明に書く
   3922 
   3923   * やはり source_if() { source "$@"; } 等とすると引数が一つしかない場合に、自
   3924     分自身が引数であると誤認してロードがキャンセルされる。
   3925 
   3926     % これは実は簡単に判定できるのではないだろうか。つまり引数が唯一つでしかも
   3927     % 自分自身を指している場合には関数内で無引数でsource されたのであると判定で
   3928     % きる。と思ったが違う。これで見えているのは外側の関数の引数なのだから、必
   3929     % ずしもそういう形になっている訳ではない。
   3930 
   3931 2021-05-23
   3932 
   3933   * menu-complete: SIGWINCH による info#panel::invalidate の際にメニュー項目の
   3934     再配置を実行するべきである。
   3935 
   3936     * info 拡張: というか info の表示を担っている class を動的に変更するべきな
   3937       のではないか。現在の実装だと内容を変更する時には必ず info の関数を即時で
   3938       呼び出さなければならない仕組みになっている。然し、そうではなくて機に応じ
   3939       て丸ごと制御を移すなどの事をした方が良いのではないか。然し、一方でどの内
   3940       容が一番上に来るべきかなどの制御も必要になる。現在は default/non-default
   3941       の二層構造になっているがそれをもっと動的に変化できる様に改良するという手
   3942       も考えられる。
   3943 
   3944 2021-05-21
   3945 
   3946   * progcolor: 取り敢えず builtin から始めるのが良いのではないかという気がする。
   3947 
   3948     ble.sh の関数についても着色及び補完関数を定義して行きたい。
   3949 
   3950 2021-05-19
   3951 
   3952   * complete: [TAB] 補完の場合には、ユーザー入力があった時に即座にキャンセルす
   3953     るのではなくて timeout があっても良いのかもしれない。
   3954 
   3955 2021-05-17
   3956 
   3957   * 此処で思ったのだが nawk は Unicode の対象を取り扱えるのだろうか。。。UTF-8
   3958     ならば通常の制御文字はそのままなので問題は生じないのではないかという気もす
   3959     るが。文字数を数えて何かする様な処理では何か変な事が起こるかもしれないが、
   3960     そうでなければ大丈夫の気がする。
   3961 
   3962     問題が起こるかもしれないのは brace expansion の形式でファイル名一覧を挿入す
   3963     る処理。これに関しては UTF-8 だと例えば平仮名の途中で分断されたりして変な事
   3964     が起こる可能性がある。
   3965 
   3966   * global: /dev/null を $_ble_util_fd_null に置き換える?
   3967 
   3968     #D1552 で議論した。毎回 open するよりも dup した方が高速である。一方で
   3969     _ble_util_fd_null が上書きされたりした時は /dev/null の方が頑健である。
   3970 
   3971   * syntax: redirection が正しく解析できていない気がする
   3972     以下の手順で編集した時に着色が間違っている。
   3973 
   3974     $ exec {fd}>/dev/null
   3975     $ exec {}>/dev/null
   3976     $ exec {_ble_base_fd_null}>/dev/null
   3977 
   3978   * 色見本について探した
   3979 
   3980     多くのサイトは微妙である。そもそも sRGB とかの概念があるのかないのか不明で
   3981     ある。単純に RGB #XXXXXX の値を線形で CMYK に変換していたりしてかなり怪しい。
   3982     色用語の場所にも sRGB やガンマ補正などの単語は見られない。
   3983 
   3984     https://www.color-sample.com/popular/jiscolor/ja/
   3985 
   3986     このサイトはちゃんと sRGB/Adobe RGB 等について載っているので少なくともちゃ
   3987     んとその辺りの事を認識した上で作られたサイトであろうと思われる。然し権利関
   3988     係の記述もないし、連絡先もない。メールボタンがあると思って押したら単に "友
   3989     達にこのサイトを紹介する" メールを送る為のボタンだった。© 2021
   3990     Color-Sample.com. All Rights Reserved. という表記の右にあるアイコンがリン
   3991     クになっていたので押して見たが、単純にトップに跳ぶだけだった。Twitter アカ
   3992     ウントは https://twitter.com/color_sample で見に行ったら 2014 で更新が止まっ
   3993     ている。著作権が 2021 になっているのは機械的に置き換えているだけという事だ
   3994     ろうか。何だかよく分からない。というかよく見たらブラウザサポートというアイ
   3995     コンも古いブラウザが並んでいたりして更新が止まっている事を示唆している。
   3996 
   3997     https://triple-underscore.github.io/css-color-ja.html#rgb-to-lab
   3998 
   3999     w3 の CSS の仕様の翻訳。ここにちゃんと色々の知識が書かれている。この文書は
   4000     最初から最後まで読むべき。
   4001 
   4002     http://mezala.la.coocan.jp/pc/jiscolor/jiscolor.html
   4003 
   4004     このページは複数の情報源からの差異について見せているがそもそも CMYK, RGB の
   4005     変換式として異なるサイトから二種類持ってきていて (どちらかが間違っているの
   4006     に違いない) 更に、Wikipedia からの数値も比較していて、どれだけ見た目が変わっ
   4007     てくるかを見せているが。色には絶対的な基準はないのだとか色々言って納得して
   4008     いるが、これらは単に sRGB と RGB の解釈を間違えて変換しているから起こってい
   4009     る間違いのような気がする。(とはいいつつ画面の輝度やその他の要因もあるだろう
   4010     から一概には言えないのかもしれないが、少なくともどういう条件の元での変換を
   4011     行っているのか明示した上で、その差異について議論していなければ情報としては
   4012     使い物にならない)
   4013 
   4014     https://www.colordic.org/w
   4015 
   4016     このサイトは和色大辞典と言って 460 色掲載しているそうで一番大きい気がする。
   4017     然し、その RGB 値が sRGB なのかどうかとかも分からない。Q&A には再利用・再頒
   4018     布可能性などについては述べられていないし、各色の出典についても書かれていな
   4019     い。このサイトの RGB 値が実際に sRGB なのか何なのか確認して、その上で他の色
   4020     についても変換を確認するのが良い気がする。
   4021 
   4022 2021-05-15
   4023 
   4024   * AUR blesh-git のカスタム update について
   4025     https://aur.archlinux.org/packages/blesh-git/
   4026     https://aur.archlinux.org/cgit/aur.git/tree/blesh-update.sh?h=blesh-git
   4027 
   4028     * {PRE,POST}_VERSION を local で宣言する
   4029       これはもう既に修正してもらった。
   4030 
   4031     * _package.sh の属性は 644
   4032       これに関しては結局指摘する機会がなかったからそのままだが、まあ大して問題
   4033       はないだろう。
   4034 
   4035   * syntax
   4036 
   4037     1>&$fd- は使えない
   4038     1>&./- もエラーになる
   4039 
   4040     もっとちゃんと調べる必要がある。
   4041 
   4042 2021-05-09
   4043 
   4044   * Fedora の package にするには結構面倒な手続きが要りそうな感じである。
   4045     https://blog.jwf.io/2017/11/first-rpm-package-fedora/
   4046 
   4047     何れにしても ble.sh は頻繁に変更が加わっているし未だ 0.* の version の段階
   4048     なので未だ公式に提出はしない事にする。1.0 を出す時に一緒に提出を考えるのが
   4049     良いだろうと思われる。
   4050 
   4051   * v1.0 を出す迄に何か目玉の機能を実装したい所であるが、実の所、他のシェルに全
   4052     くない様な機能で便利そうな物は存在しない。
   4053 
   4054     * syntax-highlighting ... 文法もちゃんと追跡した物
   4055 
   4056     * error message ... これは他のシェルにはない機能である。fish にあったりする
   4057       かもしれないが。
   4058 
   4059     * vim mode ... これは highlighting も含めてなかなか気に入っている。
   4060 
   4061     * complete
   4062       * sabbrev ... 個人的にこれは結構便利だと考えている。
   4063       * auto-complete ... これは別に他のシェルと比べて何か良い訳でもない。
   4064       * auto-menu ... これはちょっと煩い。けれど他のシェルにもあるので。
   4065 
   4066     * bottom panel ... 一つは bottom panel かもしれないがそんなに便利なのかとい
   4067       うと微妙な所である。tmux の方の設定で似たような物を表示できる筈だし特に便
   4068       利でもない。見た目に派手なので最初は喜んで使う人がいるかもしれないという
   4069       位。
   4070 
   4071     * enhanced history ... 相対パスでファイル名を参照しているのを記録したい。そ
   4072       れを auto-complete の実装に役立てたい。
   4073 
   4074     * TUI configuration?
   4075 
   4076     逆に欠けている物。ex mode の :cmd が全然対応できていない。
   4077 
   4078 2021-05-06
   4079 
   4080   * progcomp: complete -C completer で改行のエスケープに対応していない
   4081 
   4082     man bash によると completer の出力した結果は行志向であるが \ によるエスケー
   4083     プで改行を含める事ができるらしい。然し、\ が特別な意味を持つのだとすれば行
   4084     末に \ を置きたい時にはどうすれば良いのか。行内全体に於いてエスケープが意味
   4085     を持つのだろうか。よく分からない事が多い。実際に試してみないと分からない。
   4086 
   4087     或いは read line で読み込む事ができる形式だろうか。
   4088 
   4089     →実際に動作を確認したところ、エスケープの除去は行われず \ も含まて補完文字
   4090     列とされる様だ。よく考えてみれば、実際に挿入した時に複数の単語として解釈さ
   4091     れてしまっては困る訳だから、確かにこの動作でなければならない。
   4092 
   4093     ? 末尾に \\ があったらどうなるだろうか → \\ であってもその後の改行は候補の
   4094       一部と見做される様だ。
   4095 
   4096     さて、具体的にどの様に実装するのが良いか…という事を考えようと思ったが難し
   4097     い。先ず標準出力を勝手に自分で COMPREPLY に代入するのは違う様に思われる。と
   4098     いうのも、呼び出し元の compgen で -S suffix 等の加工をしてもらわなければな
   4099     らないからである。だとすると、最終的な compgen の出力結果を解釈する時に行末
   4100     の '\' で行を繋げる様に処理しなければならないのだろうか。
   4101 
   4102     そもそも改行を含むファイル名があった時に compgen はどの様な出力をするのか。
   4103     うーん。普通にエスケープせずに改行を出力した様な気がする→確認した。確かに
   4104     そうなっている。なので '\' が行末にあるからと言って勝手に振る舞いを変更する
   4105     のも憚られる。
   4106 
   4107     或いは compgen の全ての機能を自前で模倣するという手もなくはない。その場合には区切りは全て制御下にある。
   4108 
   4109   * progcomp: -F もしくは -C で生成した候補に対しても dir/ 等の suffix を付ける
   4110     必要はあるのか。もし付けたければ completion 側で付けるべきなのではないかと
   4111     いう気がする。
   4112 
   4113 2021-05-04
   4114 
   4115   * robustness: ble.sh では exit を上書きしているが set -o posix の時にはそれが
   4116     無効になる。
   4117 
   4118   * util: builtins 復元、function#advice, etc. において functrace 属性は復元し
   4119     なくて良いのだろうか。復元という事を考えるとやはり declare -pf を使う必要が
   4120     あるのかもしれない。
   4121 
   4122     bash version, posix mode も含めてどういう方法があってそれぞれどの様に振る舞
   4123     うのか調べる必要がある。
   4124 
   4125     取り敢えず問題が起こらない事を確かめた上で getdef 自体を更新するのが良いの
   4126     ではないか
   4127 
   4128     →と思ったが実際は複雑である。getdef を使って関数を別名にコピーするのに使っ
   4129     たりしているが、その時に先頭部分だけを置換している。しかし declare -ft の部
   4130     分についても関数名を置換しなければならない。そういう事になるぐらいであれば、
   4131     個別に declare -ft かどうかを判定して、改めて declare -ft で属性を付加し直
   4132     す様にしないと行けない筈である。
   4133 
   4134 2021-05-03
   4135 
   4136   * rlfunc: fetch-history
   4137     8f485ff8 - new readline "fetch-history" bindable command
   4138   * rlfunc: C-x s, spell-correct-word
   4139     6be3a741
   4140   * rlvar: enable-active-region
   4141     b1965836 new "enable-active-region" readline variable
   4142   * rlbind: prior, next
   4143     65822e50 - alias expansion fix in case statements
   4144   * vi-undo
   4145 
   4146   * 5.2: LS_COLORS *.readline-colored-completion-prefix (bash e59452c7)
   4147 
   4148     rlvar colored-completion-prefix が on でかつ LS_COLORS の中に
   4149     *.readline-colored-completion-prefix という項目がある時、共通一致部分の着色
   4150     をそれに書き換える。
   4151 
   4152     実際に bash の振る舞いを調べてみようとしたがどうも有効にならない。調べてみ
   4153     ると、_rl_color_ext_list が初期化されていない。これを初期化する為には何かす
   4154     る必要があるのだろうか。_rl_parse_colors という関数で初期化しているようだが、
   4155     この関数はどこから呼び出されているのだろうか。
   4156 
   4157     うーん。分かった。readline.c:1327 で呼び出している。これは初期化部分である。
   4158     つまり、readline を初期化するよりも先に LS_COLORS を設定しておく必要がある。
   4159     更に言うと、bind 'set ... on' も事前にやって置かないと駄目。というか
   4160     colored-stats の時点で同じ問題があったのではないか?
   4161 
   4162     これは単純に _rl_color_ext_list が空だったらその場で _rl_parse_colors の呼
   4163     び出しを試みるという事と、それから LS_COLORS の値が変更される時に
   4164     _rl_color_ext_list をクリアする。と思ったが、これだと LS_COLORS が空の時に、
   4165     毎回 _rl_parse_colors が試みられて非効率的である。
   4166 
   4167     * 後、_rl_colored_stats = 0 が _rl_parse_colors の中で設定されている。
   4168 
   4169 2021-04-30
   4170 
   4171   * ble-reload: blerc 外のユーザー設定の保持
   4172 
   4173     外部のツールが呼び出した blehook PREEXEC+=... 等は別枠で保存しておくべきで
   4174     はないか。そうしないと ble-reload した時に設定が消えてなくなってしまう。或
   4175     いは、blerc の中から呼び出したか外から呼び出したかで取り扱いを変える。blerc
   4176     の中で呼び出した設定は消えてしまっても仕方がない。一方で、blerc の外側で実
   4177     行した物については保持しておくのが自然なのではないか。
   4178 
   4179 2021-04-29
   4180 
   4181   * robustness: main/init: readonly POSIXLY_CORRECT されていたらどうするのか。
   4182 
   4183     少なくともどちらの側の設定であっても ble.sh 的には困る。
   4184 
   4185     然し、readonly まで気にし始めるとあらゆる変数名で問題が起こるので気にしても仕
   4186     方がないのかも知れない。せめて全て大文字の変数だけが readonly になっていると
   4187     いう事を要請するのが妥当だろうか。ローカル変数で大文字を使っているというと
   4188     KEYS WIDGET ARG FLAG REG 辺りは危ないかもしれない。
   4189 
   4190     然し、ここまで行くと「ユーザーが自分で変な事をしたのだから責任は持てない」と
   4191     いうレベルの事の様な気がする。
   4192 
   4193   * robustness: main/init: 最初の bash version 判定も alias 対策可能かもしれない?
   4194     然し、return/exit が上書きされる場合等も考えると難しいかも知れない?
   4195 
   4196   * robustness: "builtin read -e" 対策?
   4197 
   4198     これは今迄考えて来なかったが関連する考察 #D1520 があったので記録として残し
   4199     ておく。但し、纏めた物を眺めるに総じて困難である様に思われる。
   4200 
   4201     a set -o emacs / set -o vi の切り替えを利用して read が使える様にする。つま
   4202       り、ble.sh は裏側の keymap に bind して、ユーザーコマンドを実行する時に反
   4203       転させるという方法。この方法には問題が多い。
   4204 
   4205       x 全てのユーザー関数 (補完関数、プロンプト、trap、blehook 等) で keymap
   4206         を反転する必要があるのではないか。
   4207 
   4208       x ユーザーが emacs/vi keymap を切り替える rl bindable function を実行する
   4209         と結局 ble.sh の bind している keymap が表に出てきてその時点で制御不能
   4210         になってしまう。勝手にそういった binding を削除するのも非現実的な気がす
   4211         る。
   4212 
   4213       x bash の version によっては keymap を切り替えると bind -x が中断した様な
   4214         気もする。
   4215 
   4216     b trap DEBUG 等を使って builtin read -e が呼び出されるのを検出して、ble.sh
   4217       で wrap した処理を行ってからそのコマンドの実行をスキップする。この方法に
   4218       も色々の問題がつきまとう。ちゃんと透過的に対応できるかというと困難の気が
   4219       する。
   4220 
   4221       x DEBUG のコストがある。
   4222 
   4223       x ユーザの設定した DEBUG の管理が面倒。結局 trap DEBUG を透過的に利用でき
   4224         る様にする枠組みは完成していない。(これはその枠組さえ完成すれば余り気に
   4225         しなくても良いのかもしれない)
   4226 
   4227       x 本当に実行するコマンドを入れ替える事が可能なのだろうか。例えば builtin
   4228         read -e の呼び出し元から見て、本当に関数実行が入れ替わった様に見えるの
   4229         か。exit status はどうなるのか。これは実際に実験してみないと分からない。
   4230 
   4231       x DEBUG の BASH_COMMAND を用いて元のコマンドを本当に再現できるのか。例え
   4232         ば $1 等が使われていた時にその内容を取得する事は可能なのか (BASH_ARGV
   4233         を有効にしておかなければならないのか? ユーザーが設定を変更してしまった
   4234         らどうなるのか)。また、引数の境界等もちゃんと BASH_COMMAND を見ただけで
   4235         分かる様になっているのか。これも色々実験しないと分からない。
   4236 
   4237     c builtin read -e に入った後で ble.sh の widget が呼び出されたら良い様に
   4238       状態を adjust して widget の振る舞いを変更できないだろうか。
   4239 
   4240       x C-c に明示的に対応して、C-c が呼び出された時には設定を restore して抜け
   4241         る様にする。これは面倒なだけで処理としては十分可能である様な気がする。
   4242         但し、外側に SIGINT を伝播する必要はあるのかもしれない。
   4243 
   4244     d ユーザーがコマンドを実行する度に realine 設定を完全 unbind して、終わったら
   4245       再度 bind し直す。でも、これは文法エラー等によってコマンド実行が中断された
   4246       時に、ble.sh session に復帰せずに通常の readline の状態に落ちてしまう。
   4247 
   4248 2021-04-06
   4249 
   4250   * logout も exit と同様に置き換えるべきなのではないか。
   4251 
   4252   * prompt を評価する時に $var が local 変数に被覆されている。
   4253 
   4254     然し $var だけならば良いが $() で呼び出された関数が更に内部で変数を使用して
   4255     いる可能性等を考えると下手に変な調整はしない方が良いかもしれない。PS1 に直
   4256     接 $var と記述するかしないかで $() の内部でも変数が見えるかどうかが切り替わ
   4257     るというのは不自然すぎる。それならば ble.sh 自体が変数を定義するのでそれに
   4258     よって被覆されてしまうと説明した方が自然である。
   4259 
   4260     グローバルでない変数を列挙する方法は存在するだろうか。
   4261 
   4262 2021-04-26
   4263 
   4264   * keymap/vi: vi における既定の keymap を imap ではなく nmap にするオプション
   4265 
   4266     現在の振る舞いではコマンド実行後に nmap であれば insert-mode に戻すという操
   4267     作をしていた筈である。その箇所を書き換えて、オプションに応じて変更先のモー
   4268     ドを切り替える様にすれば良い。それと ble-attach した時の最初の設定を行った
   4269     直後に、自動的に nmap に移動する様にする処理を加えれば良い。
   4270 
   4271   * ble-bind: ble-bind -P で、他のオプションで指定したタイプの binding だけを出力する?
   4272 
   4273     % -T を指定すれば -T の設定を出力する。--cursor を指定すれば --cursor の設
   4274     % 定を出力する。cmap 関連のオプションを指定すればそれに関連する設定を出力す
   4275     % る。と思ったが、-T, --cursor, --csi, -k, etc. はそれぞれオプション引数を
   4276     % 取るので、引数読み取りの段階で -P の後で振る舞いを変更する様にしなければ
   4277     % ならない。これはコマンドライン引数の解釈として不自然である。
   4278 
   4279     別のオプションを使って dump する内容を選別するのが良い。例えば、
   4280     --filter=timeout:cursor:csi:cmap:etc 等である。
   4281 
   4282   * decode: [refactor] _ble_decode_KEYMAP_kmap_@ ?
   4283 
   4284     いきなり KEYMAP ではなくてその前に何か挟みたい。例えば
   4285     _ble_decode_kmap_KEYMAP_@ に変更する等。この場合には KEYMAP の名称として紛
   4286     らわしい物が定義された時に問題になるのではないか。前の実装で KEYMAP の直後
   4287     に固定の文字列を挿入していたのは、末尾から KEYMAP 以外の部分を一意に切り取
   4288     る事ができる様にする為の設計だったのではないか。
   4289 
   4290     現在の実装は末尾からの一意性が保証される様になっている。_kmap_ が他で使われ
   4291     ていない限りに於いて、ちゃんと一意になっている。然し、名前空間として変であ
   4292     るというのも分かりにくい。なので、 _ble_decode_kmap_KEYMAP_xxxx_yyyy にして、
   4293     xxxx には yyyy に絶対に現れない文字列を指定すれば良い。例えば data 等。
   4294 
   4295 2021-04-04
   4296 
   4297   * history auto-save
   4298 
   4299 2021-03-21
   4300 
   4301   * robustness: 様々な基本的な変数が readonly でグローバルに固定されていたらど
   4302     うするのか。ロードした瞬間に様々な良くない事が起こる気がする。然し、それを
   4303     言い出すと、bash-completion や他のフレームワークにも強い影響が出てくるので、
   4304     ble.sh だけが対応しても仕方がないという考え方もできる。
   4305 
   4306 2021-03-07
   4307 
   4308   * edit: キーボードマクロで "M-d" が "M-d d" と記録されてしまっている
   4309     vi でも emacs でも同様に記録されてしまう。
   4310 
   4311 2021-02-28
   4312 
   4313   * canvas/trace: wordwrap に対応する。つまり、単語の途中で改行しない様にする。
   4314 
   4315     これは今の所具体的な用途もないので取り敢えずこの儘にしておく。
   4316 
   4317   * canvas/trace: より詳しい justify の仕様について設定できる様にする。
   4318 
   4319     #D1494 の案では "SEP*WEIGHT FILL SEP" を単位として指定するという話だったが、
   4320     これはやはり不自然な感じで分かりにくいのでもっと分かりやすい指定方法を考え
   4321     るべき。
   4322 
   4323     例えば、最低幅1重み2 '%1.2S{FILL}' という具合にするなど。こうすると % を
   4324     SEP に指定できないし } を FILL に指定できないが使う機会があるとも思えない
   4325     ので気にしない。或いは '%{1.2SFILL}' とする? うーん余計に分かりづらい。或
   4326     いは printf strftime を真似て '%1.2(FILL)S' という具合にする。
   4327 
   4328     空白は既定で '%1.0( ) ' に相当する。その他の文字は '%0.0()X' に相当する物
   4329     とする。
   4330 
   4331     2021-03-08 というより、各 sep の性質として登録するよりも、\q{...}  を通して
   4332     設定できた方が自然なのではないか。
   4333 
   4334     \q{hfill w=2 fill=...}... という具合に。その場合には \1\2 と同様に特別なシー
   4335     ケンスで fill を表現する必要はある。OSC か其処らを使えば良い気がする。或い
   4336     は ANSI seq に何かあった気がしないでもない。
   4337 
   4338 2021-02-27
   4339 
   4340   * /dev/tcp/... についても特別に着色を行いたい。
   4341 
   4342     例えば < /dev/tcp/.../.. において正しいパスであるのにも拘らず、存在しないファ
   4343     イルとしてエラーが検出される。
   4344 
   4345 2021-02-24
   4346 
   4347   * canvas/trace: trace の g0 は後で合成するのではなくて \e[m の段階で設定する
   4348     べきなのではないか。
   4349 
   4350     後、g0 という名前も余りよくない気がする。他の x0 y0 からの連想で初期の g の
   4351     値という雰囲気が出てしまう。然し一方で sgr0 からの連想で背景色という雰囲気
   4352     もある。実際に別の場所では sgr0 を指定する事によって背景色を設定できる様に
   4353     なっている。
   4354 
   4355     名前はさておきどの様に振る舞うのが良いのか。例えば \e[39m で既定色に戻すと
   4356     いう操作の場合は本当に端末既定色に戻すべきなのか、或いは g0 で指定した色に
   4357     するべきなのかというのは微妙な所である。g0 で指定した色にするべきの気がする。
   4358 
   4359     一方で、下線などの属性に関しては g0 で指定したものから解除できる様にするの
   4360     が自然な気もするし、或いは g0 で指定した物は常に設定されているのが自然の様
   4361     な気もする。どちらが良いのかは分からない。やはり現状の実装で良い様な気もす
   4362     る。
   4363 
   4364     うーん。単に設定のあるなしという捉え方ではなくて下線ありと下線なしという独
   4365     立したスタイルがそれぞれあるのだと思えば、やはり g0 を毎回上書きするのでは
   4366     なくて、\e[m 等に対応する操作の時にだけ g0 の値に設定するというのが正解の気
   4367     がする。
   4368 
   4369 2021-02-23
   4370 
   4371   * util: カーソルが bottom-dock にいる時の vbell の座標計算
   4372     Ref #D1495 ... 取り敢えずの対策
   4373 
   4374     現在の実装は vbell が sc..rc を自由に使える前提になっている。しかしカーソル
   4375     が bottom-dock に停泊している時に vbell が来るとvbell によって floating
   4376     panels の位置が分からなくなってしまい、表示がずれてしまう事になる。
   4377 
   4378     同じプロセス (親シェル) の中で vbell を処理している場合には、一旦 floating
   4379     panel の位置に戻ってから sc..rc をしてそれから再び bottom-dock に戻るという
   4380     手順を踏む事によって問題を回避できる。然し、サブシェルの中にいる場合には現
   4381     在の最新の配置情報にアクセスできないのでこの方法は取れない。
   4382 
   4383     現在は取り敢えずカーソルが bottom-dock に停泊している事はないとの想定で
   4384     sc..rc を実行しているが、例えば info_display=bottom にして vi_cmap を使って
   4385     いる時などにこの前提が破れてしまう。
   4386 
   4387     [解決方法]
   4388 
   4389     ちゃんと実装する為には、親シェルで全ての描画を行う様にする必要がある。その
   4390     時に問題になるのがどうやって visible-bell の消去のタイミングを親側で決める
   4391     かという事。idle を使う方法は bash-4 以降でしか使えない。シグナルを使う方法
   4392     には余り頼りたくないが、現実的にはそうするしかないのだろうか。bash-3 と
   4393     bash-4 で実装を切り替えても良い。何れにしてもサブシェルと通信を行う枠組みを
   4394     整える必要がある気がする。
   4395 
   4396 2021-02-22
   4397 
   4398   * cavnas: 描画の最中で status が高さを取得する時に textarea の内容を削り取る可能性がある
   4399 
   4400     現在の render 中に配置を決定する仕組みは問題があるので再考する必要がある。
   4401 
   4402   * cygwin: 下部での IL が動かない旨を報告する?
   4403 
   4404     後 DA2 応答をしてくれないか頼みたい。
   4405 
   4406     $ printf 'Line %s\n' {0..100}; /bin/sleep 1; printf '\e[L'; /bin/sleep 1
   4407 
   4408     最下部で DL を実行した時にも何か変な事が起こる。
   4409 
   4410     $ printf 'Line %s\n' {0..100}; /bin/sleep 1; printf '\e[M'; /bin/sleep 1
   4411 
   4412 2021-02-13
   4413 
   4414   * edit: C-x e に続いて e を連続して押した時にマクロ実行を繰り返す様にしたい
   4415 
   4416   * 実は bash の read -e は C-r でコマンド履歴を参照できる。ble.sh では read 専
   4417     用の履歴を独立に管理しているが、コマンド履歴にもアクセスできる様にするべき
   4418     なのでは。と思ったがやはり何だか微妙な気がする。
   4419 
   4420     read 専用の履歴を別に管理するというのもありなのではないかという気がする。
   4421     その場合には保存場所は何処にするべきだろうか。
   4422     ~/.local/share/blesh
   4423     ~/.config/blesh
   4424     ~/.cache/blesh
   4425 
   4426     https://github.com/fish-shell/fish-shell/issues/744
   4427 
   4428     fish は過去に config に置いていてユーザの文句によって local/share に移動し
   4429     た様だ。然し、local/share はそれはそれで何だか変な気もする。
   4430 
   4431   * gnuplot など他のコマンドに対して ble.sh によって編集機能を提供する事は可能
   4432     だろうか。少なくとも pty を自分で開いてその中で gnuplot を起動する必要があ
   4433     る? 或いは、gnuplot のリンク先の readline library を勝手に書き換えて bash
   4434     を起動させて、更にその中で ble.sh を使って readline 関数の振る舞いを模倣す
   4435     る?
   4436 
   4437     rlwrap 等を使うという手もある? rlwrap のじっそうはやはり pty を開くという物
   4438     のようである。rlfe という物もあるようである。
   4439 
   4440     どうも gnuplot の場合には普通に gnuplot & で起動しても操作できる様
   4441     な気がする。ble.sh で _ble_syntax_lang=gnuplot として更に
   4442     exec:gnuplot を提供したらそれだけで普通に動く様な気がする。
   4443 
   4444     - ble-edit/is-single-complete-line で syntax:bash を呼び出している
   4445       のをsyntax:$_ble_syntax_lang として呼び出す様に変更する必要があ
   4446       る。他にも accept-line が is-complete を呼び出している。
   4447 
   4448     * shell-expand 系統の widget は gnuplot モードでは無効にしたい。
   4449     * command-help 系統の widget も gnuplot モードでは別の実装にする。
   4450 
   4451 2021-02-10
   4452 
   4453   * main: 関数内で引数なしで source すると関数の引数がそのまま source の中から
   4454     見える。これらを区別する方法はあるだろうか。
   4455 
   4456     うーん。shopt -u extdebug であれば BASH_ARGC の数が二種類の source の仕方で
   4457     異なるようである (但しその具体的な数は bash-5 から変わっている。更に入れ子
   4458     source や関数呼び出しなどが絡んできた時にどうなるかは不明である)。然し、
   4459     shopt -s extdebug の時には両者は同じになる。
   4460 
   4461 2021-02-06
   4462 
   4463   * tui: TreeView
   4464 
   4465     以下の様な物があるのを見つけた。
   4466     https://gitlab.com/TheDalaiAlpaca/saturnon/-/blob/master/saturnon
   4467 
   4468     実際どんな物かは確かめていないが、TUI 要素としてファイルピッカーは定番である。
   4469 
   4470     その基礎として先ず TreeView を実装するというのは一つの方向性。TreeView は
   4471     List の拡張として作成するのが自然であろう。List の各要素の高さを変えられる
   4472     様にして、更に中にそれぞれリストを保持するようにしたものと解釈できる。問題
   4473     になるのはリスト項目が増えてきた時に高さの累積計算が重くなるという事。シェ
   4474     ルで実装すると成ると重み付きB木の様な複雑なデータ構造にもしにくい。或いは、
   4475     本気で重み付きB木をBash上で実装するという方向性もあるのかもしれない。
   4476 
   4477     Midnight Commander と同等の機能を ble.sh の内部で実装するというのも
   4478     demonstration として良いのではないかという気がする。
   4479 
   4480 2021-02-05
   4481 
   4482   * 他の bash プログラム
   4483 
   4484     * https://stackoverflow.com/q/41043916/4908404
   4485       history 候補を自動的に表示する可能性について議論している
   4486 
   4487       上記 StackOverflow の質問で提案されている。Google Chrome の search bar の様に、
   4488       幾つか文字を入力した時点でもう履歴から項目を拾って幾つか表示し始めるという可能性。
   4489       これは fzf の領分である様な気もするが shell integration を考えるとなかなか非自明である。
   4490 
   4491       というか普通の検索でも複数の候補を表示した方が分かりやすいのではないかという気がする。
   4492       例えば或る一定以上の時間が経ったら一致する候補を列挙するなど。
   4493       更に待っていると曖昧一致も列挙してくれる、という具合にする。
   4494 
   4495       2021-02-09 hstr が同様の機能を提供している。hstr の動作も参考にした方が良いのではないか。
   4496 
   4497     * https://github.com/dylanaraps/shfm/blob/master/shfm (file manager in POSIX shell)
   4498       これは dylanaraps の fff の再実装
   4499 
   4500     * これは README に乗せるバッジの話
   4501       https://img.shields.io/github/downloads/akinomyoga/ble.sh/total
   4502       ダウンロード数の画像を生成できる様だ
   4503 
   4504     * Incremental parsing:
   4505 
   4506       ble.sh で行っている構文解析は特殊な物であるが如何にも既存の例がありそうである。
   4507 
   4508       検索したら以下の様な物があった。
   4509 
   4510       [Tree-sitter|Introduction](https://tree-sitter.github.io/tree-sitter/)
   4511 
   4512       参考にしている論文を見てみると state matching で skip と書いているので、
   4513       やはり単に途中から始めるというだけでなく途中で解析を中断するという考えも
   4514       ある。寧ろ、完全に一致していなくても局所的な一致であれば解析を跳ばすとい
   4515       う事を実行していると思われ、より積極的な最適化である。
   4516 
   4517       恐らく先にこれを見つけていたら ble.sh の構文解析の実装ももっと複雑になっ
   4518       て、更になかなか完成しない日々が続いたのではないかという気がする。何事に
   4519       も一長一短があるのであって既存の研究だって参考にできる部分と捨て置いて良
   4520       い部分がある筈だが調べてしまうと完全に対応したく成るのが問題である。なの
   4521       で、取り敢えず持てる範囲の知識で何かやってみるというのは大切な事なのであ
   4522       る。
   4523 
   4524       oil 等は沢山調べすぎて行き詰まっているのではないかという気もする。或いは
   4525       逆に何だか Python -> C++ translator を開発するなど変な方向に走っていて、
   4526       それで余計に時間を取られているのではないか等等。やはりメンテナンス等を考
   4527       えると、Python は prototype として捨て置いて、C++ で完全に書き直した方が
   4528       得策なのではないか。Python -> C++ をずっと使う事にしていると、少しの機能
   4529       追加で毎回 translator にも大幅に手をいれなければならず、結局メンテナンス
   4530       が困難になる。特に第三者がコードに手を入れるのが極度に難しい。この構造を
   4531       保持したまま続けるには最初に完全なる translator を作って、その後は
   4532       translator の改良を行わないという決断が必要である (状況に応じて最適な翻訳
   4533       が異なりうる事まで考えていたら完成した translator があってもきりがない)。
   4534 
   4535 2021-02-05
   4536 
   4537   * evaluate-path-spec (by 3ximus)
   4538 
   4539     evaluate-path-spec の改良に挑戦してみるという事なので。先ずは説明が必要である。
   4540 
   4541     * notilde に関しては eval の側で処理するべきではないか
   4542     * 後で全体 path 以外については single を加える様にお願いする
   4543 
   4544     2021-12-31 詳細は以下にある。
   4545     https://github.com/akinomyoga/ble.sh/issues/82#issuecomment-773487368
   4546 
   4547     83.sh に実装を入れて試してみる事にする。
   4548 
   4549     と思ったが具体的にどの様に実装すれば良いのだろうか。先ず初めに短い物から長
   4550     い物まで順番にパスを構築する。その後に一番長い物から順番に一致を試みる。一
   4551     番長い物が一致すれば、後はその得られたパスを既存のパターンに当て嵌めれば良
   4552     い。と思ったのだが、どうやって当て嵌めるのだろうか。
   4553 
   4554     * extglob まで絡んで来ると余計に分からなくなる。と思ったが extglob は
   4555       simple-word の要件を外れるのでここでは考えなくて良い。
   4556 
   4557     うーん。glob を解釈して正規表現に変換すれば行けるかもしれない。或いは、
   4558     ${path#$pattern} または ${path%$pattern} 等として削って行けば良いのでは? と
   4559     思ったが、$pattern の場合には * も一致してしまうのではないか。。
   4560 
   4561 2021-02-03
   4562 
   4563   * edit: 例えばファイル一覧を表示する機能を付けても良いのではないだろうか。
   4564 
   4565 2021-02-01
   4566 
   4567   * complete: complete_timeout_compvar でタイムアウトした単語の glob 文字を quote しない?
   4568     Ref #D1457
   4569 
   4570     現在はグロブ文字も quote して COMP_WORDS と COMP_LINE を構築している。例え
   4571     ば **/*.txt に時間がかかった時に COMP_WORDS には "'**/*.txt'" という文字列
   4572     が格納されるが、これは本来 "**'/'*'.txt'" であるべきなのではないかという事。
   4573 
   4574     * 一方で、補完関数の方が複雑な quote に対応しているかという問題もある。
   4575 
   4576     * また、ここで quote しないと結局補完関数の方でも時間がかかってしまうのでは
   4577       ないかという恐れがある。
   4578 
   4579     という事など考えると、取り敢えずは完全に quote する実装にしておく。後で気が
   4580     向いたらまた考える。
   4581 
   4582   * highlight: failglob の時の a/b*/c/d.txt の着色が最後のファイル名になっている。
   4583     本来はどの時点で failglob になるか判定して着色するべきなのではないだろうか。
   4584 
   4585 2021-01-28
   4586 
   4587   * progcolor: ble/syntax/progcolor/eval-word を着色を跨いでキャッシュできないか
   4588 
   4589     特に展開結果を何処かに保存しておきたい。新しい配列を用意するか、或いは hash
   4590     にして記録するか。
   4591 
   4592     a hash にして記録すると一度評価した単語を再評価する機会が失われる。ファイル
   4593       が追加・削除された時に更新されなくなってしまう。
   4594 
   4595       やはり、単語単位でやはりキャッシュしたい。そうすると shift にも耐えうる仕
   4596       組みにしたい、という事で新しい配列を用意するか、或いは既存の配列に格納す
   4597       るという方法になる。
   4598 
   4599     b 新しい配列を追加する
   4600 
   4601       また shift 等の操作が増える。面倒である。
   4602 
   4603     c 既存の配列に要素を追加する
   4604 
   4605       既存の配列に格納する場合には任意の文字列を含める事ができないので、補助配
   4606       列にデータを格納する事にしてその添字を既存の配列に入れるという手がある。
   4607       特に単語に id を振っておけば今後の word に関するデータ拡張にも使う事がで
   4608       きる。
   4609 
   4610     →これに関しては ble/syntax:bash/simple-word/eval の側でキャッシュする様に
   4611     したので、今の所はここでは対応しなくて良い気がする。当初は simple-word/eval
   4612     では非常に短期のキャッシュしかしない方向を考えていたが、ファイルシステムが
   4613     そう頻繁に変わる訳でもないので、取り敢えずは行毎にキャッシュを保持する事に
   4614     した。なので、simple-word/eval のキャッシュは単語よりも寿命が長いので単語毎
   4615     のキャッシュは今の所は考えない事にする。
   4616 
   4617     * 但し、やはりファイルシステムの変化に追随したいという事であれば、適当にキャッ
   4618       シュを更新する必要がある気がする。或いは、globpat を含む様な場合にのみキャッ
   4619       シュを行うというのでも良い様な気がしている。
   4620 
   4621     * また、ここでの実装手法は例えばエラーメッセージの記録等の場合にも使えるの
   4622       ではないだろうか。という気がする。
   4623 
   4624 2021-01-22
   4625 
   4626   * highlight: 引数が沢山あると cygwin で滅茶苦茶遅い
   4627 
   4628     これは様々な種類のパス名展開を試そうとするのが原因だろうか。
   4629     command 名と同様にキャッシュする様にしても良いのではないだろうか。
   4630     でも少しずつ微妙に異なる引数が沢山ある場合には結局遅い。
   4631     それよりは着色自体の高速化について考えた方が良いのではないか。
   4632 
   4633     * chat でも遅くなるかどうかについて確認する。
   4634       やはり微妙に遅い様な気がする。
   4635 
   4636     何が遅くなっている原因化について確認する必要がある。
   4637     例えば fork している可能性はあるだろうか。
   4638 
   4639 2021-01-08
   4640 
   4641   * syntax: 算術式の quote が変である
   4642 
   4643     x echo $((a['$hello'])) の $hello は展開対象なのに着色されない。
   4644       →然しこれは文法上の問題なので寧ろ着色しない方が自然である様に思われる。
   4645       (これは eval の引数を着色するのかという問題にも通じる)
   4646 
   4647     x ((a["$index"])) がエラー着色になっている
   4648       →どうもこれは bash-5.0 から振る舞いが変わったという事の様である。
   4649 
   4650     x bash-5.1 からは (()) でも ' は quote ではない。
   4651 
   4652     x 更に言うと a['...'] の ' は a が連想配列の時には必ずしもエラーではない。
   4653       現在はエラー着色になっているがこれは修正するべきの気がする。
   4654 
   4655 2020-12-19
   4656 
   4657   * Note (#D1435): blehook WINCH を処理している最中に終了したユーザのジョブがあ
   4658     るとその通知が画面に表示されない可能性がある。これは実際に起こりうるのかど
   4659     うか確認していない。
   4660 
   4661 2020-12-14
   4662 
   4663   * progcomp: progcomp で生成された補完候補を現在 quote している。
   4664 
   4665     * 生成された候補が既に quote されている場合や展開を含む場合に、
   4666       意図したのと異なる結果になってしまう問題がある。
   4667     * 更に既に入力済みの部分に一致しなくなるので遡って書き換わる可能性もある。
   4668     * 生成された候補が複数の単語に分かれる場合に、
   4669       それが blesh の quote によって一つに結合されてしまう問題もある。
   4670 
   4671     理想的には生成された候補を改めて simple-word/eval して、
   4672     その結果に基づいて単語を再度挿入し直すという事が考えられるが、
   4673     x 全ての候補に対してこれを実行する事を考えると処理が重くなってしまう。
   4674     x また、\**\* 等を展開すると *** になってしまうので
   4675       その quote を復元する方法についてもちゃんと考えなければならない。
   4676 
   4677     或いは simple-word element を一つずつ抽出して処理すれば良いのかもしれない。
   4678 
   4679 2020-11-30
   4680 
   4681   * tui: face editor の TUI の様な物を作っても良いのかもしれない [#T0007]
   4682     というより fish の Web interface の様な物を TUI で提供しても良いのでは。
   4683 
   4684     2021-04-25 @Alyetama から似たような提案を受けた。
   4685     https://github.com/akinomyoga/ble.sh/issues/80#issuecomment-826194833これは
   4686     初期設定 wizard の様な物を想定している様だが、TUI config ではもっと自由にい
   4687     つでもどの設定でも選んで設定できるのでより自由度は高い。そう言った物でも良
   4688     いかという事を一応確認はしてみる。
   4689 
   4690     作るとしたら先ずは Color Picker?
   4691     その前に layout engine? 或いは画面の切り替え?
   4692 
   4693     Window system がどうのこうのという計画があったような。window system に関し
   4694     ては内部バッファだとかスクロールだとか textarea だとか様々の物を内包する物
   4695     であった筈で、此処で必要になる物は其処まで複雑な物ではない。でも一緒に実装
   4696     してしまっても良い様な気もする。
   4697 
   4698     - Windows system に必要な物。control, window, layout-engine,
   4699       background-buffer, redraw, resize, etc.
   4700 
   4701       既にある panel, textarea 等を拡張する感じに考えても良いのかもしれない。但
   4702       し、これ以上の ble.sh の肥大化を避ける為に canvas ではなくて新しく
   4703       lib/core-forms.sh 的な物を追加して其処で実装するのが良いのではないか。
   4704       textarea に関しては、forms が或る程度形になってから対応するという形で良い
   4705       気がする。
   4706 
   4707       control に属する変数の記録方法? これは textarea と同様にしたいが、
   4708       textarea の方も forms に対応しようとすると調整が必要になると考えられるの
   4709       で、最初は既存の枠組みに捕われずに実装するので良い気がする。
   4710 
   4711     - window: overlay を実現する方法として二つの可能性が考えられる。
   4712 
   4713       a redraw 関数の方で clip 等を処理する方法。
   4714 
   4715         これは各 control の実装が複雑になってしまう。というより任意の clip
   4716         region の形状に対応しようとしたら非現実的な実装になってしまう。
   4717 
   4718       b もう一つは Window の側で buffer を内部に保持し、最終的な描画の際にそれ
   4719         を適当に clip して出力する方法。
   4720 
   4721         これに関しては内部 buffer の表現方法に工夫が必要になる。
   4722 
   4723     取り敢えず何も考えず少し実装してみた。clip に関しては redraw の側で適当に処
   4724     理する事にした。また、trace に於いても clip 機能を実装した (#D1493)
   4725 
   4726     invalidate 範囲を記録できる様にしたい。
   4727 
   4728     更に、要素のサイズが変更された時、移動した時には親の該当範囲も一緒に
   4729     invalidate する必要がある。
   4730 
   4731 
   4732     自身の内容が変化した時、自身に被っている別の要素も一緒に更新する必要が出て
   4733     くる事に注意する。
   4734 
   4735     a 上に物が被っていない時には clip 領域を勝手に広げて描画しても良いのではな
   4736       いか。描画範囲を広げても良いかどうかについては render.draw の呼び出し元か
   4737       ら指定できる様にすると良いのかもしれない。
   4738 
   4739     c 或いは、そもそも被らない様にするか、被っている時には更新しない様にすると
   4740       いう手もある。
   4741 
   4742     d 或いは、render.draw の呼び出し元で一旦シーケンスを取り出して、その上でそ
   4743       れを再度 trace によって clip するという手もあるかもしれない。然し、これは
   4744       描画内容が大量にある場合にとても遅いので実は避けたい。
   4745 
   4746 2020-11-20
   4747 
   4748   * bash: declare -c や ${var~} 等は 5.2 で削除するとしているが本当だろうか
   4749 
   4750 2020-11-13
   4751 
   4752   * complete: bash progcomp と ble.sh progcomp の競合問題
   4753 
   4754     現在は complete:* の方が builtin complete の設定よりも優先される様になって
   4755     いる。これは ble.sh がロードされていない時はbash-completion を使い、ロード
   4756     されている時は ble.sh 様に特化した補完設定を使うという状況を考えると自然で
   4757     ある。
   4758 
   4759     然し一方でユーザーが自分の好きな設定を builtin complete で設定してもそれが
   4760     反映されないという問題が生じる。やはり builtin complete の方を優先させるべ
   4761     きだろうか。或いは、complete:cd は既定ではロードしない様にして、contrib か
   4762     何かに入れてユーザにロードさせる様にするのが良いのではないかという気もする。
   4763     然し、ユーザにロードさせるとしてもコマンドを一つ一つロードするのではなくて、
   4764     まとめてロードするという状況も考えられる。その場合には、やはり builtin
   4765     complete と complete:* の競合が起こってしまいどちらを優先させたら良いのか分
   4766     からなくなる。
   4767 
   4768     或いは ble.sh に特化した設定も builtin complete 経由で呼び出す様にする?
   4769     しかしそうすると ble.sh から ble-detach した時に動作しなくなってしまう。
   4770 
   4771     attach/detach の際に設定を保存・復元するという方向性も考えられる。
   4772 
   4773     complete を上書きして両方の設定を行える様にするという手もある。この場合には
   4774     attach/detach する時に既に設定した内容を読み取る等の工夫が必要になる?
   4775 
   4776 2020-11-11
   4777 
   4778   * syntax: $HOME 等の変数展開があるパスに対して simple-word/eval が重い問題
   4779 
   4780     中でグローバル変数の復元等の複雑な処理をしている。一回呼び出すだけならば良い
   4781     が $HOME/.mwg/src/ble.sh/archive/layers ... 等の様なパスの着色で各ディレクト
   4782     リの階層で展開を試みている場合に、何度も呼び出す事になると遅さがかなり目立つ
   4783     ようになる。
   4784 
   4785     単語着色では determine-separated-path -> locate-filename ->
   4786     highlight-pathspec という具合に三段で処理していて各段で毎回 eval しているの
   4787     で特に重い。これは処理を統合して高速化する余地もある。コードが汚くなるという
   4788     問題はある。よく考えたら現在の実装では locate-filename は特に eval は実施し
   4789     ていない。単に : で区切っているだけである。なので locate-filename に関しては
   4790     気にしなくても良い。
   4791 
   4792     或いは複数のパスを一度に eval する機能があっても良いのかもしれない。その場合
   4793     に結果をどの様に返すのかは難しい。複数単語に展開される事を考えて既に一つの
   4794     eval の時点で ret が配列だからである。各パスの最初の単語だけを返す事にするか、
   4795     或いは全ての単語を全部混ぜて一つの配列に返すか。一つの配列に格納する場合には
   4796     各パスに対応する index の範囲を返す事ができるがインターフェイスとしては分か
   4797     りにくい。
   4798 
   4799   * bashbug: builtin で while という名前の builtin を load すると他の builtin が
   4800     使えなくなる。
   4801 
   4802     ? 使えなくなるのは、同じ dll の中の物のみなのか或いは全ての dll の loadable
   4803       builtin が使えなくなるのか。
   4804 
   4805     ? while 以外にも問題を起こす名前は存在するか。
   4806 
   4807     ? 影響を受ける builtin はキーワードと一致する名前の物のみか或いは全てか。
   4808 
   4809 2020-11-07
   4810 
   4811   * complete: PATH=path1:path2:path3 の補完
   4812 
   4813     PATH=path1:path2:path3 の時に着色が最後の要素にしか適用されないし、また補完
   4814     は全然働かない。全く動かないのならばまだしも中途半端に動くのは変なのでちゃん
   4815     と対応したい。
   4816 
   4817     →着色に関しては #D1409 で議論する。
   4818 
   4819     complete に関しては元の bash ではちゃんと動いているので尚の事問題である。
   4820 
   4821   * highlight: 条件コマンドの中での着色が効かない。着色しても良いのではないだろうか。
   4822     今まで実装していなかったのは正しい文法解析や入れ子などの処理が面倒だったから。
   4823 
   4824     今確認してみると 条件コマンドの中でも ( && || ) などは特別な意味を持つ様であ
   4825     る。更に & や | を使うとエラーになる。<< 等のリダイレクトもエラーである。必
   4826     ずしも空白で単語が区切られる訳ではない様なので、これに関しては文法解釈のレベ
   4827     ルで修正が必要になる。
   4828 
   4829     今試すと ; も途中に現れると区切りとして取り扱われてエラーになる。
   4830 
   4831     * |&;<>() は特別に取り扱う必要があるという事。単体の < と > に関しても正し
   4832       い演算子の文脈に現れれば大丈夫だが、二項演算子の現れない場所で使うと構文
   4833       エラーになる。この様な構文エラーまでチェックする必要があるだろうか。或い
   4834       は演算子の結合まではチェックしない事にするか。
   4835 
   4836     * 括弧の途中で ]] が現れた場合にもエラーになる。
   4837 
   4838 2020-11-06
   4839 
   4840   * complete/mandb: progcomp で生成したオプションに関してもできれば desc を表示する様にしたい。
   4841     progcomp に候補を生成させてもしオプションが含まれていて、
   4842     かつそれが mandb の中に含まれているという事が分かった時に desc-raw を表示する。
   4843 
   4844     * git 等の場合には man git で得られるオプションと
   4845       サブコマンドで得られるオプションは異なるので注意する。
   4846 
   4847   * complete/mandb: bash の場合にはビルトインコマンドのオプションまで混ざって列
   4848     挙されてしまって駄目。bash 固有のオプションについてまとめたファイルを用意し
   4849     ておくべきである。
   4850 
   4851     bash builtins のオプションに関しては builtin ... --help を使用すれば取得でき
   4852     る。これはこれでまた解析の為のコードを書かなければならないが、bash の
   4853     builtin に限れば形式が定まっているので解析のコードを書くのは難しくはない。
   4854 
   4855   * complete/mandb: 何と man git は .PP ... .RE 4 ... .RS でオプションを説明している。
   4856     この様に .TP を用いない様な場合にも対応するべきなのだろうか。
   4857 
   4858   * complete/mandb: 同じ意味を持つオプションについて。
   4859     同じ意味を持つ複数のオプションを分ける時に、
   4860     分けてから sort するのではなくて sort してから分けるべきではないか。
   4861     同じ意味を持つオプションは連続されて表示されて欲しい。
   4862 
   4863 2020-09-07
   4864 
   4865   * complete: メニュー絞り込みが働いている状態で単一確定ができない場合がある
   4866 
   4867 2020-09-03
   4868 
   4869   * main: attach 戦略再考 [#T0004]
   4870 
   4871     attach の戦略に関する議論は以下にある。
   4872       #D1382, #D1124, #D0940, #D0737
   4873 
   4874     | a 即attach。PS1 表示
   4875     |   x PS1 が後で変更された時に問題。
   4876     |   x 後の設定の出力が消滅する
   4877     |
   4878     | b 即attach。PS1表示はする。出力抑制はしない
   4879     |   x PS1 が後で変更された時に問題。
   4880     |   x 後の設定の出力と混ざる
   4881     |
   4882     | c 即attach。PS1表示はpromptまで遅延
   4883     |   x keymap初期化に時間がかかる
   4884     |
   4885     | d 即attach。PS1表示する。出力は記録して後でdump
   4886     |   x 後の設定が対話的なインターフェイスを起動した時に問題
   4887     |   x 後の設定が /dev/tty に対して出力したら防げない
   4888     |   x 後の設定が初期化進捗などを出力するとそれが実時間で反映されない
   4889     |
   4890     | e PROMPT_COMMAND。trap DEBUG/RETURN を用いて変更検知
   4891     |   関連: #D1124, #D0737
   4892     |   x DEBUG はコマンド直前の実行なので最終行での書き換えは防げない
   4893     |   x RETURN は rcfile 末尾では発生しない
   4894     |
   4895     | f PROMPT_COMMAND の読み書きを hook する(非ネイティブな)手法はあるか?
   4896     |   x ない
   4897     |
   4898     | g 他の hook/trap を用いて適切なタイミングを検出?
   4899     |
   4900     |   a EXIT はシェルが終了する時なので使えない
   4901     |   b command_not_found も使えない
   4902     |   c kill -USR2 $$ によるハンドラは?
   4903     |     x 試すと rcfile 終了を待たずに次のコマンドですぐに実行される
   4904     |     x kill ... & として別プロセスから投稿しても同様
   4905     |   d bash (execute_prompt_command) を確認したが介入点は他になさそう
   4906     |   e PS1 に kill 等を埋め込んで通知させる
   4907     |     x これは PROMPT_COMMAND よりも信頼できない
   4908     |
   4909     | h PROMPT_COMMAND の中の最初のコマンドを DEBUG で検出?
   4910 
   4911     可能性があるとすれば h の手法である
   4912 
   4913     * trap DEBUG/RETURN の性質を熟知していないとユーザの設定した
   4914       DEBUG/RETURN と干渉しない様にするのは難しいと考えられる。
   4915       これは DEBUG/RETURN の枠組みを整えてからにする必要がある。
   4916 
   4917     rcfile で ble.sh をロードした時には rcfile を抜けた後の
   4918     PROMPT_COMMAND 直前でアタッチを行う。
   4919 
   4920     * "PROMPT_COMMAND の最初のコマンド" は恐らく判定可能である。
   4921 
   4922       rcfile 及び最初の PROMPT_COMMAND 内にいる時は BASH_LINENO の最後の
   4923       要素は0 になっている。rcfile 内にいる時は FUNCNAME の最後の要素は
   4924       "source" になっている。更に bash-4.4 以降では rcfile から
   4925       PROMPT_COMMAND に移る時に $- に s が追加される。
   4926 
   4927       PROMPT_COMMAND で何か実行するならば、最初のコマンドは必ず
   4928       FUNCNAME[-1] != source になっている筈である。
   4929 
   4930     対話シェルで ble.sh をロードした時は "bashrc を抜けた直後" という戦
   4931     略は使えないが、HISTCMD, ${_histcmd@P} を用いてユーザコマンドか
   4932     PROMPT_COMMAND かの判定が可能である。
   4933 
   4934     * HISTCMD は ユーザコマンドを実行している時には $(history 1) の最初
   4935       の要素に一致する。PROMPT_COMMAND を実行している時には常に 1 になる。
   4936 
   4937     * HISTCMD が unset されている場合には代わりに _histcmd='\!';
   4938       "${_histcmd@P}" が使える (bash 4.4)。HISTCMD が unset されているか
   4939       どうかは HISTCMD=A して値が変化するかどうかで判定できる。
   4940 
   4941 2020-08-27
   4942 
   4943   * 真面目に宣伝など考えるべきなのかもしれない。
   4944 
   4945 2020-08-03
   4946 
   4947   * README: bashrc 設定方法の更新
   4948     関連: #D1382, #T0004
   4949 
   4950     最終的には bashrc の何処に ble.sh を記述しても動くようにしたい。取
   4951     り敢えず、比較的信頼できる手法が確立するまでは README の load 方法
   4952     はそのままにしておく。
   4953 
   4954   * macOS で遅いという話 (reported by tigger04)
   4955     https://github.com/akinomyoga/ble.sh/issues/58
   4956 
   4957     チェック項目は…
   4958 
   4959     * complete -r の代わりに
   4960       shopt -u progcomp を指定したら改善するか?
   4961 
   4962     問題になっている可能性がある処理は
   4963     ble/complete/progcomp/.compgen の builtin compgen 経由で呼び出される。
   4964     特にユーザの定義した関数・コマンドは以下の関数経由で呼び出される。
   4965     - ble/complete/progcomp/.compgen-helper-func
   4966     - ble/complete/progcomp/.compgen-helper-prog
   4967 
   4968     上記の関数に benchmark を設定して stackdump なり何なりを計測する?
   4969 
   4970     ble/function#advice \
   4971       around ble/complete/progcomp/.compgen-helper-prog \
   4972       ''
   4973 
   4974     * 対策としては auto_complete の時には progcomp を実行しない
   4975       というオプションを追加するというのが一つの可能性。
   4976       bleopt complete_auto_progcomp=1 という事にするのが良い。
   4977 
   4978       実現可能性について。
   4979       現在の呼び出し文脈が auto_complete かどうかを判定する必要がある。
   4980       確認してみると comp_type に auto を含めている様である。
   4981       実際にそうなっているのか確認する。
   4982 
   4983     情報をメールで貰った。
   4984     メールではどの期間だけ complete -r を除いていたか分からないとしているが。
   4985 
   4986     2020-08-05 05:12:50 IST
   4987     2020-08-05 05:13:27 IST
   4988     2020-08-05 08:43:54 IST
   4989     2020-08-05 08:43:57 IST
   4990     2020-08-05 11:02:53 IST
   4991 
   4992     まあ、どの期間だけ有効になっていたのかという情報は実はそんなに重要ではない。
   4993 
   4994     眺めていて気づいた事。
   4995 
   4996     最後にユーザが入力を行ってから auto-complete が起動するまでに一定の時間がかかっている。
   4997     大体 200ms の様な気がするが、しかし時間帯によって変わっている気もする。
   4998     TAB 補完の場合にはこの delay が存在していない (0.06s) 事を考えると、
   4999     これは history 補完にかかる時間という事だろうか。
   5000     history 補完を無効にしたらこの delay は少なくなると判断して良いだろうか。
   5001 
   5002     補完が走らずに入力できている部分は history に match している入力であろう。
   5003 
   5004     どうも後半で時間がかかっているのは history の様に思われる。
   5005     TAB 補完の時には 150ms 程度の遅延だが自動補完の時には 600ms に増えている。
   5006     然し、その後で 200ms 程度に減少したりもしている。
   5007     うーん。或いは単語の展開に時間がかかっているのかもしれない。
   5008 
   5009     * reject: 取り敢えず history 展開について高速化できないか確認する。
   5010 
   5011       | search-history-heavy について改善できないか考える。
   5012       |
   5013       | a 特に bash-5.0 以降では history -d range を用いて削除した上で
   5014       |   history -p を実行すれば高速に過去の履歴を読み出す事ができるのではないか。
   5015       |   →と思ったがよく考えたらどの範囲を削除したら良いのか不明である。
   5016       |
   5017       |   !string で一致させてその後その候補が当て嵌まらないと分かったとする。
   5018       |   この時その候補以降の履歴項目を全て削除してから再度 !string で
   5019       |   一致させれば良い様に思うが、最初に一致した候補が何番目の履歴項目か
   5020       |   という情報がないのでどの範囲を削除したら良いのかが分からない。
   5021       |
   5022       |   a 例えば二分法で探索する? と思ったがこれだと二分の一の確率で
   5023       |     サブシェルを生成しなければならない。明らかに非効率的である。
   5024       |     或いは履歴展開に履歴番号も一緒に展開させる方法があったろうか。
   5025       |     ない気がする。
   5026       |   b やはり履歴番号を抽出できないかと思ったが、その様な履歴展開はやはりない。
   5027       |     !string で一致させて単語指示子で履歴番号に置換できれば良かったが
   5028       |     その様な単語指示子は存在しない。
   5029       |   c 或いは、番号を指定しなくても一致した項目以降を削除する方法があれば良い?
   5030       |     然し、history -d の引数はやはり数値であって履歴展開ではない。
   5031       |
   5032       |   この方針は難しいのではないかと思われる。
   5033       |
   5034       | b 或いは、history | grep を用いて最後に一致した項目を取り出す事ができるのではないか。
   5035       |   但し、grep の時の問題は行区切りをどうするのかという事。
   5036       |
   5037       |   grep -z を用いれば NUL 区切りで判定する事が可能。
   5038       |   然し、これは GNU extension である。安易には使えない。
   5039 
   5040       →うーん。調べてみたがちゃんと history search を呼び出す時に
   5041       stop_check を指定しているのでユーザの入力があった瞬間に復帰する筈である。
   5042       つまりこれ自体に時間がかかっていたとしても動きが遅くなる事はない筈?
   5043 
   5044       そもそも complete -r で解決したという事を考えると明らかに history は関係ない。
   5045 
   5046       然し、実際に timing log を見るとユーザの入力が待機されている…という事はない様な気がする。
   5047       やはり現在の情報では history からの自動補完が問題になっていると考える根拠がない。
   5048       従って、(不自然な方法を取ってでも) history 展開の高速化方法について考えるのは不毛である。
   5049 
   5050     * 再び報告があった。コンピュータ自体の処理が重くなっている時に動かなくなるという事らしい。
   5051       普通に bash を動かしている時には問題ないという事を考えるとファイルアクセスが怪しい。
   5052       ファイルアクセスしている箇所は沢山ある。特に着色のためのパス名展開である。
   5053 
   5054 2020-06-04
   5055 
   5056   * 行数が極端に少ない時の動作 (横スクロール)
   5057     bash-5.1 では横スクロールモードに移行するそうだ。
   5058 
   5059     そもそも現状で一行しか使える行がない時に何が起こるか。
   5060     実際に試してみると (line 1) という表示だけになって
   5061     更にその上に何か表示しようとするのでまともに表示できない。
   5062     2行の場合にもまともに動かない。vi-mode の mode name で 1 行消費している為である。
   5063     3行の場合にようやくまともに動く様になるが、それでも vbell が上に被ってしまう。
   5064 
   5065     横スクロールまで実装しないとしてもまともに動作する様にはしたい。
   5066     そもそも (line N) という表示を省略する様にする?
   5067     現状の実装ではプロンプトは必ず表示する様になっている。
   5068     然し、プロンプトを表示するからこそ変な事になっているのである。
   5069 
   5070     a 行数が 1 になった時にはそもそもプロンプトを表示しない?
   5071       然し、それだとプロンプトが何も表示されなくなってしまってそれはそれで変だ。
   5072 
   5073     b プロンプトは固定で残りの部分で文字列を編集する?
   5074       これだとプロンプトが画面よりも長い時に何もできなくなる。
   5075 
   5076     c プロンプトも一緒に横スクロールする?
   5077 
   5078       | これに対応する為にはプロンプトの内部の各文字の配置を追跡する必要
   5079       | が出てくる。
   5080       |
   5081       | Bash native でも \[...\] を使っている場合にどうやって数えるのだ
   5082       | ろう? という疑問が残る。
   5083       | →bash の動作を見たところ、prompt も一緒にスクロールする。しかし
   5084       | prompt の途中位置でスクロールが止まる事はない。つまり、prompt は
   5085       | 全体が表示されるか全く表示されないかのどちらかである。
   5086       | →prompt 自体の長さが画面の横幅よりも大きい時には、常に横スクロー
   5087       | ルした状態になってしまい、コマンドの1文字目は常に '<' に隠れて表
   5088       | 示されない状態になる。また表示の乱れも発生する。
   5089 
   5090       Bash は横スクロールによってプロンプトが表示されるか、全く表示さ
   5091       れないかのどちらかの状態になる。中途半端にプロンプトが表示されて
   5092       いる状態はない。プロンプトの長さが画面の長さよりも大きい場合は対
   5093       応しきれていない。
   5094 
   5095     * プロンプトが範囲内に収まらない場合には何が起こるのか?
   5096       プロンプトの trace の時に高さを制限していただろうか。
   5097       →駄目。制限はしていない。そもそも制限する事自体が自然な動作なのかも分からない。
   5098       リサイズした時に上に流れた情報を参照したいという場合を考えれば、
   5099       プロンプトは制限せずに上に流れてしまうという振る舞いが自然の気がする。
   5100 
   5101     現在のスクロールの実装はプロンプト行の次以降で実施する前提になっている。
   5102     つまり画面の高さが1行しかない場合には色々弄らなければならない。
   5103     プロンプトが複数行ある場合にはそれだけ多く画面の高さが必要になる。
   5104 
   5105     * プロンプトの出力は気にせずに実施する。画面がスクロールしても気にしない。
   5106       →これを実行するとその他の panel の描画位置もずれてしまう事になる。
   5107       他のpanelの内容を上書きしないように事前に空行を挿入しようにも、
   5108       空行を挿入した時点で他の panel の内容が反対側の端から流れてしまう。
   5109       という事を考えると、行数が厳しい時には他の panel は全て潰すのが現実的。
   5110 
   5111       潰す条件がプロンプトの高さが一行に収まりきらない場合、というのは
   5112       プロンプトとして変な物を指定する場合を考えると制限が強い気もするが、
   5113       その様な場合は余りないと考えればそれでも良い気もする。
   5114 
   5115       因みにプロンプトの高さが1行に収まらない状況としては、
   5116       プロンプト自体に改行が含まれている場合以外にも、
   5117       プロンプト内に長い文字列が含まれていて何度も折り返す場合を含む。
   5118 
   5119   * util: ble/dict#* を用意する可能性?
   5120 
   5121     設定ファイルの自動アップデートの実装に関連して
   5122     ble/dict#* という物を作成しても良いのかもしれないとも思う。
   5123     既に辞書的な構造は ble.sh の各所で個別に実装して使用している。
   5124 
   5125     辞書の bash-4.0 未満における最適の実装は何だろうか。
   5126     任意の key を取り扱える様にする必要性を考えると、
   5127     : 等を区切りにして scalar に key を格納する訳には行かない。
   5128     そうすると配列に key を格納する必要が出てくる。
   5129     配列が巨大になってくると重くなってくる。
   5130 
   5131     a 簡単な hash を作るという手もあるだろうか?
   5132       例えば配列サイズが小さい時には最初のバイトだけを使って、
   5133       要素が増えてきたら n 番目のバイトまで使って hash を生成する。
   5134       と思ったがそれだと共通の接頭辞を持つ key が沢山ある時に hash が衝突する。
   5135       例えば /home/murase/... という物が沢山ある場合。
   5136 
   5137     b 或いは全ての文字を用いて hash を計算する?
   5138       という事にすると今度は長い文字列に対して各文字について文字コードを取得する手間がかかる。
   5139       特に bash-4.0 未満では色々面倒な事をする。何れにしても ble/util/assign を使うので遅い。
   5140       (実際にこれでキャッシュをしていないのは下手にキャッシュするよりも ble/util/assign
   5141       を実行した方が高速であるという事からであろうという気がする。)
   5142 
   5143     c key の sorted list を管理する。
   5144       文字列で辞書順でどちらが速いかについては [[ str < str ]] で判定できる。
   5145       後はアクセスの度に二分探索を実施すれば良いのである。
   5146       挿入には結構時間がかかりそうな気もするが、まあ、大丈夫。
   5147       然し、よく考えたら bash-4.0 未満の配列はアクセスが線形時間だった気がする。
   5148       という事を考えると二分探索よりも線形探索の方が実は良いのかもしれない。
   5149 
   5150     使用ケースによって色々なので汎用的な実装はやはり難しい気がする。
   5151 
   5152     * key が整数の場合には普通に配列を使えば良い。
   5153 
   5154     * key が有限の単語 (識別子) の集合であれば、
   5155       local apple=1 banana=2 pineapple=3 orange=4 等の様にして、
   5156       普通に arr[apple]=red 等とという風にすれば良い。
   5157 
   5158       或いは普通に変数に保存すれば良い。
   5159       eval "arr_$key=red" という具合である。
   5160       この場合大量の変数が散らかってしまうが、
   5161       それが気にならなければ最良の気がする。
   5162 
   5163     * key に ":" が含まれない場合には
   5164       keys にコロン区切りの key の集合を保存しておいて、
   5165       head=${keys%%:$key:*} head=${head//[!:]} 等とすれば
   5166       key が何番目の要素であるかというのを取得する事ができる。
   5167 
   5168     * key が文字である場合も同様にして
   5169       head=${keys##"$key"*} 等としてから ${#head} で文字数を見れば
   5170       それが何番目の要素であるかというのを判定する事ができる。
   5171 
   5172     * 辞書をメモ化に用いている場合には実は関数自体の計算時間が
   5173       bash による辞書の模倣よりも速い可能性を考えるべき。
   5174       例えば ble/util/s2c については ble/util/assign printf %d '$c の方が
   5175       下手な辞書よりも高速なのである。
   5176 
   5177     * key の種類がそんなに沢山でない場合には、
   5178       key を配列に格納して線形探索するというので良い。
   5179       これが最も単純で自然な実装になる。
   5180 
   5181       key を sorted list に入れて二分探索するという可能性もあるが、
   5182       Bash-4.0 未満の配列のランダムアクセスは線形なので、
   5183       それよりは普通に線形探索で舐めた方が良い気がする (実測すると違うかもしれない)。
   5184 
   5185     結局使用ケースによって最適な実装方法が異なるという事から統合は難しい。
   5186     ble.sh の内部で使わない以上は用意しても仕方がない様に思われる。
   5187     そもそも ble/dict#... の形式による配列アクセスは文法的にそんなに綺麗でもない。
   5188     等の事を色々考えると、ユーザの為に用意する程でもない。
   5189 
   5190 2020-05-20
   5191 
   5192   * 破壊的変更と後方互換性
   5193 
   5194     * done: keymap_vi_nmap_name は keymap_vi_mode_nmap_string 等に改名するかもしれない。
   5195       或いはもっと別の名前? やはり keymap_vi_mode_normal で良いだろうか。
   5196       改名するとしたら complete_stdin_frequency と同様に別名に書き換える様にする。
   5197       実はオプションの改名について枠組みにしてしまっても良いのかもしれないという気がする。
   5198 
   5199     * 勝手に古い設定を書き換える機能を作っても良いかもしれない。
   5200       毎回一行ずつ書き換えを実行するのではなくて、
   5201       書き換えを実行する sed スクリプトを貯めておいて、一括で書き換えを実行する。
   5202       cp a a.bk && sed "$script" a.bk > a 等の様に実行する。
   5203 
   5204       sed スクリプトは何処に貯めて於けば良いのだろうか。
   5205       書き換え対象のファイル名と一対一に対応するファイル名にする必要がある。
   5206 
   5207       a 辞書にファイル名を記録するか或いは hash を用意するか。
   5208         hash は計算に時間がかかるので辞書にファイル名を記録するのが良い気がする。
   5209         然し、bash-4.0 未満ではどの様にするのが良いのか微妙である。
   5210 
   5211       b 或いは、別に辞書など作らなくても直接ファイルシステム上に書き出しても良い気がする。
   5212         つまり、 "$file.sed" に書き出して置いて、それを適用して削除する。という具合にする。
   5213         問題はファイル名が被らない様にするという事。乱数で決定する事にすると駄目。
   5214         "$file.__BLE_REWRITE__.sed" 的なファイル名にするのが良いのではないか。
   5215 
   5216     * ble{-edit => }/prompt/{print,process-prompt-string,backslash} についても
   5217       警告を表示する様にする仕組みが必要になる気がする。
   5218 
   5219 2020-05-16
   5220 
   5221   * TERM=alacritty で何か変な事が起きるらしい。
   5222     https://github.com/rux616/init/commit/b03e7ef3dab5171d1f60aa61323ef823401217d5#diff-0af95dc8119f1c458b7a0fd76dfe8042R37-R39
   5223 
   5224     調べてみると alacritty:extra/alacritty.info が terminfo らしい。tic -x extra/alacritty.info で入れる。
   5225     然し、何も問題は起きていない様に見える。256color もちゃんと動いている。ずっと使っていると発生する問題だろうか。
   5226     これは時間があれば rux616 に何が起こるのか尋ねても良い。
   5227     所で、いつの間にかに alacritty は jwilm/alacritty から alacritty/alacritty に移動したらしい。
   5228 
   5229     →cache/alacritty.term を確認した所 ich, ech, dch が空になっている。
   5230     然し、ble.sh は ich, dch は使っていない。ech を使う場合でも、
   5231     [[ $_ble_term_ech ]] の時にのみ有効になる様になっている。
   5232 
   5233     他に気付いたのは 8-15 の着色が 0-7 と同じになっているという事。
   5234     然し実際に tput で tput setaf 15 とすると CSI 9 7 m になる。
   5235     何かが間違っている。再度実行してみた所、問題なく初期化された。
   5236     と思ったら alacritty.term と xterm-256color.term の内容が同一になった変だ。
   5237 
   5238     続けて何度試しても問題は発生しない。何が起こったかは謎である。
   5239 
   5240 2020-04-25
   5241 
   5242   * trap: DEBUG trap を用いて DEBUG trap を再現できるか? [#T0003]
   5243     参考: #M0016
   5244 
   5245     つまり関数呼び出し毎に DEBUG trap が設定されるというのを実装する必要がある。
   5246     ble.sh が使っていなければ特に問題は発生しないが、
   5247     INT を受信した時に ble.sh が DEBUG trap を設置する事になっている。
   5248     従って、実装できれば実装するのが良いという様に考える。
   5249 
   5250     要件は以下の通り
   5251 
   5252     * 何も DEBUG trap が設定されていない時には overhead 0 にする。
   5253       つまり builtin trap で何も設定されていない状態にする。
   5254       ユーザか ble.sh のどちらかが何か設定している時に有効にする。
   5255 
   5256       実のところ、ble.sh の使い方は一時的な物なのでユーザの trap と
   5257       同レベルの取り扱いで良いという気がする。唯単に trap で列挙されない、
   5258       ユーザの設定した trap も保持する、という事が異なるだけ。
   5259 
   5260     * 関数呼び出しでの継承・非継承を再現する。
   5261       実はこれはそのまま bash の継承・非継承に従うだけで良い気がする。
   5262 
   5263     * 呼び出し元への影響についても再現する。
   5264       これは新しく trap DEBUG が呼び出される時に、
   5265       builtin trap DEBUG もやり直せば良い?
   5266       と思ったがそもそもそんな事をする必要もない気がする。
   5267       現在のフレームに既に何か設定してあるという事は
   5268       呼び出し元ではそれが必ず有効という事だから。
   5269 
   5270       bash-4.3 以下では何れにしても呼び出し元に影響を与える事はできない。
   5271       うーん。bash-4.3 以下では trap DEBUG で保存した trap handler を
   5272       関数が抜ける時に削除する必要があるという気もする。
   5273       これについては実装時に注意深く実装すれば良いだけ。
   5274 
   5275     * DEBUG trap の中で DEBUG trap は設定できるが発火しない。
   5276       BASH_COMMAND は書き換わらない。
   5277 
   5278     実の所、DEBUG は C-c の時にしか設定していないので、
   5279     取り敢えず気にしない事にする。
   5280 
   5281     先ず試験的な実装を作成して見るのが良い気がする。
   5282 
   5283   * trap: INT
   5284     現在の実装ではユーザの設定した INT で握りつぶしても、
   5285     ble.sh の設定したハンドラによって実行が中断される。
   5286     ユーザが INT を設定している時には握りつぶさない様にするという手もある。
   5287 
   5288   * [保留] bash-4.4 trap 内無引数 return の修正
   5289 
   5290     ref #D1350
   5291 
   5292     bash-4.4 以降では trap 内の無引数 return は trap handler が開始する直前の $? を返す。
   5293     強制的に trap handler の内部での直前の $? を返す様にする方法はあるだろうか。
   5294 
   5295     * return() { builtin return $?; } とする案
   5296       x 本来の return を実行する方法がない。
   5297         RETURN trap を使って return 関数呼び出し後に builtin return できないか?
   5298         x RETURN trap は抑も終了しようとしている関数内の文脈で実行される。
   5299         x RETURN trap 内部では RETURN は発火しない。
   5300     * alias return で何とか無引数の場合を $? に置き換える事は可能か。
   5301       x 引数がある場合とない場合の両方に alias で対応するのは難しそう。
   5302 
   5303 2020-04-19
   5304 
   5305   * history: 履歴の管理の枠組みで欲しい物
   5306 
   5307     1 実行したコマンドを追記で記録する仕組み (勝手に編集したりしない)
   5308       他のシェルと同様に追加の情報も記録する?
   5309 
   5310       * 実行したディレクトリ。実行した時刻。$$.$LINENO
   5311 
   5312       * コマンドラインに含まれる有効なファイルパスの集合
   5313 
   5314         | fish はこの情報を用いて history autosuggestions の時に
   5315         | コマンド履歴のフィルタリングを実行する様だ。
   5316         | 然し疑問なのは echo > a.txt で a.txt など出力ファイルが元から存在していた時には、
   5317         | 新しくファイルを作成したいという時にその履歴が候補に出てこない、
   5318         | という事態になってしまうのではないかという事。
   5319         |
   5320         | その様に考えるとやはり実は個別のコマンド毎に判定した方が良いのではないか。
   5321         | 例えば cd の場合には使い方が決まっているので、
   5322         | 実際にそのコマンドラインを実行した時に成功するか失敗するかはすぐに判定できる。
   5323 
   5324         自動補完のフィルタリングに関しては完全な判定はできないので
   5325         取り敢えず core でサポートしなくても良い。
   5326 
   5327       * zsh は実行にかかった時間も記録する様である。
   5328 
   5329         | 然し、これは微妙。何故ならば bash ではコマンドの実行開始前に履歴を追加するから。
   5330         | 実行後に書き換える仕組みが必要になる。或いは開始の記録と終了の記録を別々にする?
   5331         | そうすると複数のセッションで実行している時に互い違いになってしまう。
   5332         | なので実行するコマンド毎に ID を設定する必要がある気がする。
   5333         | と思ったが ID は $$.$LINENO 等で良い気がする?
   5334         | x と思ったが同じ PID でシェルが起動する事もあるのでは?
   5335         |   o と思ったが同じ PID で複数のコマンドを同時に走らせるという事はないので問題ない。
   5336 
   5337         開始と終了をそれぞれ記録する。$$.$LINNO でコマンド毎に ID を設定して対応を取る。
   5338 
   5339     2 記録されたコマンドとは別に bash の履歴で遡れるコマンドのリストを管理する仕組み。
   5340       こちらは長いコマンドを自由に削除したりできる様にする。
   5341       倍加したりすると嫌なので枠組み 1 で得た差分に基づいて更新する?
   5342       差分を取る方法を気をつけないと結局倍加するので、
   5343       ちゃんと同期して差分を取れる様な枠組みを整理する。
   5344 
   5345 2020-04-09
   5346 
   5347   * 別の bash の枠組みについて
   5348     https://github.com/sio/bash-complete-partial-path
   5349     https://github.com/mgalgs/fuzzy_bash_completion
   5350     https://github.com/brujoand/sbp
   5351 
   5352 2020-04-02
   5353 
   5354   * test: テストフレームワークの追加機能
   5355 
   5356     * 単体テストの機能
   5357       * テストを直接本体の関数の近くに書き込める様にする?
   5358         これは mwg_pp.awk の枠組みを用いた対応が必要である。というか出力
   5359         先が ble.osh と分かれている場合を考えると、#%$> の右辺に変数を指
   5360         定するべき? と思ったが #%$> を含む行自体をマクロに入れれば良い。
   5361 
   5362     * テスト集合の管理
   5363       * 集計・サブシェルで実行した結果も扱える様に。
   5364       * テスト結果のキャッシュ
   5365       * 並列テスト
   5366       * 様々な bash の version の結果を集計
   5367 
   5368     * 他のフレームワークの機能を確認
   5369       * bats
   5370       * oil/test
   5371       * shellspec
   5372         kcov を用いて coverage が計測できる
   5373         skip を設定できる。前回成功したものをスキップできる。
   5374 
   5375     * GitHub 用に Travis を設定する。
   5376 
   5377 2020-03-22
   5378 
   5379   * read -t や read line の戻り値が変だ
   5380     →今試してみると別に変な事はない。-e が入っていても入っていなくても。
   5381 
   5382     一応 C-c で read -e を止めた時の終了ステータスは 130 の所が
   5383     ble.sh の実装では単に 1 になっているという違いはある。
   5384 
   5385   * bash-3.0 が malloc array.c botched というエラーが出てクラッシュした。
   5386     これは bash のバグである。そして古いバグなので治りそうにない。
   5387     更に言うと再現性もあるのかどうか微妙である。
   5388 
   5389   * oilshell で色々説明を行った。
   5390     それらの説明へのリンクを作成して後で纏めるのが良い気がする。
   5391     これは後で実行する。
   5392 
   5393   * decode: 大量の貼り付けの高速化4 (report by dylankb)
   5394 
   5395     現状の ble.sh の枠組みの中では大幅に改善した。
   5396     然し、やはり decode を自前でやっている。
   5397     そもそも decode の結果を整数の列にする時点で遅い。
   5398 
   5399     bracketed paste だと分かった時点で、
   5400     stdin から文字列として読み取って、
   5401     文字列としてそのまま挿入する等の事が可能な筈なのではないか。
   5402     そうすれば無駄な処理をする事なく即座にエディタを起動できる。
   5403 
   5404     現在の nonblocking-read の実装に
   5405     bracketed paste を検出する機能をつけて
   5406     bracketed paste の処理中にはそれを使って
   5407     良い感じに実行すれば良いのだろうか。
   5408 
   5409 2020-03-11
   5410 
   5411   * __line_limit__ の実装の制限
   5412 
   5413     1 replace-limited を直接呼び出している箇所については確認したが、
   5414       replace-limited が .replace-range を通して呼び出している時、
   5415       外側で ind, mark を設定していると計算がずれて範囲外になる可能性がある。
   5416       特に vi で .replace-range を多用しているが面倒なので細かくチェックしていない。
   5417 
   5418     2 容量超過でもコマンドラインが短縮されていない場合
   5419       (これは isearch の途中などで起こりうる)
   5420       複数のキーから為るキーシーケンスが間に入る __line_limit__
   5421       によって無効化される。
   5422 
   5423       これの対処方法として mouse_move と同様に特別に
   5424       __line_limit__ を keyseq に属さないキーとして取り扱う方法がある。
   5425       然し、現在ではチェックが非効率になるので対応していない。
   5426       或いは keyseq に属さない keycode の範囲を定義して、
   5427       その範囲で判定できる様にするのが良い気がする。
   5428       (その様なキーは実は沢山ある)
   5429 
   5430   * history: fish の autosuggestions はファイルが存在しない履歴項目はスキップする (suggested by cole-h)
   5431     https://oilshell.zulipchat.com/#narrow/stream/121540-oil-discuss/topic/autosuggestions
   5432 
   5433     うーん。どうやら fish は履歴を保存する時にその時に使った有効なパスも一緒に記録する様だ。
   5434     Bash はそれを記録しない。という事は ble.sh が代わりに記録する等の工夫をする必要がある。
   5435     然し、ble.sh が代わりに記録するという事になると履歴の一貫性を保つ為に工夫が必要になる。
   5436     或いは、ble.sh の履歴を本体として bash の history は全部それを元に再構築する?
   5437     その様にするしかない気がする。
   5438 
   5439     或いは cmdinfo:color の実装が完全であれば、わざわざ履歴を見て
   5440     ファイルパスかどうかを判定しなくても、それが有効な履歴かどうかを判定する事が
   5441     可能になる。特に cd に関しては簡単に判定する事ができる筈である。
   5442     という事を考えるとわざわざ実装する必要はないのかもしれないとも思う。
   5443 
   5444 2020-02-02
   5445 
   5446   * vi mode の時は read も vi mode になっているべきではないのか?
   5447     と思ったが vi mode にはコマンド実行等の色々と
   5448     危ない機能も沢山ついているので、寧ろ cmap を使うべきで、
   5449     然し、cmap を使うのだとしたらそれは殆ど現状の read の様な物だ。
   5450 
   5451     これはその内に request があるかもしれない。その時に対応する。
   5452 
   5453     と思ったが既定の readline では vi-map が使える様になっている。
   5454     コマンド実行等はどの keymap に定義されているだろうか。
   5455     或いは accept-line や edit-and-execute-command の意味を差し替えられる様にするか。
   5456     そちらの方が現実的である様な気がする。
   5457 
   5458 2020-01-26
   5459 
   5460   * progcolor: 非同期で実行できる様にする可能性?
   5461     場合によっては重い計算が必要になるかもしれないし、
   5462     実は非同期で実行しても良いのではないかという事。
   5463 
   5464   * progcolor: redirect の場合にも対応したい
   5465     実は補完の時にも redirect をプログラム補完しても良いのでは。
   5466     但し、補完と着色で違うのは補完は一つの単語について呼び出されるのに対して、
   5467     着色は一度に複数の単語を着色する事があるという事。
   5468     補完に関しては引数とリダイレクトを別々に処理すれば良いが、
   5469     着色の場合には一度に処理できる様にしたい。
   5470 
   5471   * progcolor: here document にも対応したい。
   5472     here document に対応するコマンドを抽出する事は可能か?
   5473     →here document は開始部分に対する参照を確か持っていたのでできる筈。
   5474 
   5475     実際にユーザは何を提供すれば良いのか。
   5476     ble/cmdinfo/color:XXX を呼び出す様にするのか。
   5477     然し、それだとそのコマンドの引数が変更される度に、
   5478     対応する heredoc を抽出する必要が出てくる。それは面倒だ。
   5479     或いは、heredoc に変更があった時に着色するだけで良いのでは。
   5480 
   5481     というか heredoc は単語ではない。でも一つの nest ではある。
   5482     うーん。然し wrange に登録しているかは謎。
   5483     その辺りも整理しつつ実装すると良い。
   5484 
   5485   * progcolor: コマンド自身が書き換えられた時には
   5486     全ての引数について再度着色の確認が必要になるのではないか。
   5487 
   5488 2020-01-23
   5489 
   5490   * 前々から発生していたが曖昧補完などを実行すると時々ごみが残る。
   5491     これは何故だろうか。そもそもカーソルよりも右に何か文字列が入るはずがないのに?
   5492 
   5493     再現させようとしても再現できない。
   5494     これは実際に起った時に再度確かめる必要があるのである。
   5495 
   5496 2020-01-21
   5497 
   5498   * lmorg/murex という新しいシェルの対話環境
   5499 
   5500     https://github.com/lmorg/murex
   5501 
   5502     このシェルは POSIX 互換でないので微妙。
   5503     パス名展開をするのに面倒な指定をしなければならない。
   5504     既存の様々なツールと相性が良いかというと微妙な気がする。
   5505     しかし fish や PowerShell よりは unix shell よりである。
   5506 
   5507     一方で対話インターフェイスに関しては色々工夫している。
   5508     入力していくと一行下に現在入力しているコマンドの説明が表示される。
   5509     何も入力していない場合は git リポジトリの情報を表示している。
   5510     (然し、なにか入力するとすぐに消えてしまうので何処まで使いやすいかは分からない)
   5511     kill まで入力すると補完候補としてプロセス ID を表示してくれる。
   5512     プロセス ID に対してコマンドラインを説明として表示している。
   5513 
   5514     * 所で ble.sh ではメニューの形式は事前にユーザの側で指定する事になっている。
   5515       然し、これは微妙な気がしてきた。というのも説明文があるかどうかの情報は
   5516       補完生成側が知っている事である。なので、補完候補生成器の側で、
   5517       メニューの表示形式を上書きできる様にするべきなのではないかという気がする。
   5518 
   5519 2020-01-17
   5520 
   5521   * Minix で無限ループになっている?
   5522 
   5523     echo と入力しようとすると確率的に無限ループになる。
   5524     (それでも可也高い確率で無限ループになる。)
   5525     auto-complete を off にしても発生する。
   5526     menu-filter を off にしても発生する。
   5527     という事は着色か或いは。。
   5528 
   5529     調べてみると暴走しているプロセスは別の Bash だという事が分かった。
   5530     恐らく子プロセスで暴走している。何が悪いのだろうか。履歴?
   5531     →履歴はちゃんとロードできている。その後で暴走する。
   5532     →再度確かめたらやはり子プロセスの暴走としか思えない。
   5533       と思ったがよく見ると親プロセスの暴走だった。両方で起こる?
   5534 
   5535     2020-02-03 新しい ble.sh を実行しているが固まるという現象が再現しない。
   5536     これは新しい ble.sh のお陰だろうか、それとも偶だろうか。
   5537     →暫く使っていたが全く再現しないので以前の ble.sh の問題と思って良いだろう。
   5538 
   5539     と思っていたら実は裏でちゃんと無限ループになっていた。
   5540     どうも ssh が予期せず切断すると無限ループになる?
   5541 
   5542     気になるのは暴走していたプロセスは stderr にリアルタイムで
   5543     データを出力し続けていたという事。
   5544 
   5545     | -rw-r--r--  1 murase  users  14174140 Feb  3 21:58 5726.stderr
   5546     | -rw-r--r--  1 murase  users  14324924 Feb  3 21:59 5726.stderr
   5547     | -rw-r--r--  1 murase  users  14504088 Feb  3 22:01 5726.stderr
   5548     |
   5549     | 出力内容は以下の通り 0d 1b 5b 4b の 4B を繰り返し出力している。
   5550     |   $ < $_ble_base_run/5726.stderr od -t x1
   5551     |   0000000   0d  1b  5b  4b  0d  1b  5b  4b  0d  1b  5b  4b  0d  1b  5b  4b
   5552     |   *
   5553     |   67250220   0d  1b  5b  4b  0d  1b  5b  4b
   5554     |   67250230
   5555     |
   5556     | 0d 1b 5b 4b とは何か? \r\e[K である。CR EL である。うーん。
   5557     | ble.sh の該当しそうな部分を調べてみる。
   5558     |
   5559     | * canvas:344 (negative cup:el)
   5560     |   ble/canvas/put-cup.draw 1 $((x0+1))
   5561     |   ble/canvas/put.draw "$_ble_term_el"
   5562     | * canvas:1928 (negative sgr0:cr:el)
   5563     |   ble/canvas/panel#goto.draw "$index" "$x" "$y"
   5564     |   ble/canvas/put.draw "$_ble_term_el"
   5565     | * edit:1520 (negative sgr0:cr:el)
   5566     |   ble/canvas/panel#goto.draw "$_ble_textarea_panel" "$fminx" $((fminy-new_scroll))
   5567     |   ((new_scroll==0)) &&
   5568     |     x=$fminx ble/textarea#render/.erase-forward-line.draw # ... を消す
   5569     | * edit:1680 (negative sgr0:cr:el)
   5570     |   ble/canvas/panel#goto.draw "$_ble_textarea_panel" $((cols+1)) "$y"
   5571     |   ble/canvas/put.draw "$_ble_term_el"
   5572     | * edit:1696 (negative sgr0:cr:el)
   5573     |   ble/canvas/panel#goto.draw "$_ble_textarea_panel" "${pos[0]}" "${pos[1]}"
   5574     |   ble/canvas/put.draw "$_ble_term_el"
   5575     | * edit:3869 (negative cuf:sp:sp:el)
   5576     |   ble/canvas/put-cuf.draw "$advance"
   5577     |   ble/canvas/put.draw "  $_ble_term_cr$_ble_term_el"
   5578     | * edit:7322 (negative cr:el:sgr)
   5579     |   ble/canvas/put.draw "$_ble_term_cr$_ble_term_el${_ble_term_setaf[9]}"
   5580     |
   5581     | うーん。何れも関係なさそうな気がする。
   5582     | もしかして _ble_term_el2 に CR EL が入っている?→確認したがそうでもない。
   5583     | 上の中で一番怪しいのは panel#goto.draw だと思ったが、
   5584     | sgr0 が消滅している理由が分からないし、
   5585     | 一度 CR を出したら _ble_canvas_x=0 になるのだから、
   5586     | 何度も CR を出力し続けるのは変だ。
   5587 
   5588     暴走した bash は何れも console ではなくて pty だった。
   5589     接続が途中で落ちると無限ループになるのだろうか。
   5590     hp2019 側及び vmminix 側で nc/sshd を kill -9 しても再現しない。
   5591 
   5592   * 英語圏のニュースサイトに投稿する可能性 (suggestion by dylankb)
   5593     Hacker News を紹介されたがここが適切なんだろうか?
   5594 
   5595     reddit に投稿した話がある。
   5596     https://rcmdnk.com/blog/2014/02/23/computer-bash-zsh/
   5597 
   5598     単にリンクを貼るというのでも良いけれども。
   5599     やはり様々な機能を惜しげもなく紹介する
   5600     長い記事を書くのが良い気がする。
   5601 
   5602     →返信で自分の作品を投稿する時のルールの頁があった。
   5603       なるほど。やはりルールがあったのである。危ない所である。
   5604       https://news.ycombinator.com/showhn.html
   5605 
   5606       これによると作品の紹介は一度きりしかできないとの事。
   5607       > The community is comfortable with work that's at an early stage.
   5608       と書かれているがまさかこれは初期の作品でなければならないという訳でもあるまい。
   5609       > Blog posts, sign-up pages, and other reading material can't be tried out
   5610       と書かれているが…。使い方の説明記事の様でも駄目なのだろうか。
   5611       Blog posts でなければ良い? 或いは README を派手に改造してしまうという手もある。
   5612 
   5613     https://news.ycombinator.com/shownew
   5614     ここを観察していると "Show HN: 作品名 ― 説明" という名前の物が多いが、
   5615     実は "Show HN: 今〇〇なのを作っているんだけど" というタイトルの物の方が upvote が多い。
   5616     "作品名 - 説明" だといかにも宣伝という感じで入る余地がない気がする。
   5617     一方で "〇〇なんだけど" みたいに書くと "自分も何か貢献できるんではないか" と錯覚して人がたくさん来る。
   5618     そういう仕組になっているんだろうという気がする。
   5619 
   5620     * reject: "Show HN: Bash Line Editor -- syntax highlighting, autosuggestions, etc. in Bash"
   5621       これは普通。つまらない
   5622 
   5623     * "Show HN: I am developing a line editor in pure Bash script. I'd like to hear your comments!"
   5624       これだと面白そうとは思ってくれるかもしれないけれど使ってくれる人は少なそう。
   5625       後 explicit にコメントが欲しい! という事をタイトルに書いても良いのだろうか?
   5626       眺めてみるとそういう投稿はない。やはり雰囲気が分からないのである。
   5627 
   5628     * reject: "Show HN: I made syntax highlighting, autosuggestions, etc. in Bash"
   5629       これも普通。つまらない
   5630 
   5631     * "Show HN: "Bash Line Editor" with syntax highlighting, autosuggestions, ... written in pure Bash!"
   5632       やはり宣伝っぽい。
   5633 
   5634     * "Show HN: Bash Line Editor -- syntax-highlighting, autosuggestions and vim emulation written in pure Bash"
   5635       vim と書くと他のエディタを使っている人やシェルでは別に vim は使わないという人が敬遠してしまわないか?
   5636       然し話題に乗るという事だけであればその辺りを無視して投稿しても良い気がする。
   5637 
   5638     * reject: "Show HN: I wrote a line editor (syntax highlighting, autosuggestions, vim amulation, etc.) in pure Bash script"
   5639     * reject: "Show HN: I wrote a line editor in pure Bash script which provides syntax highlighting, autosuggestions, vim emulation, etc. to Bash"
   5640     * reject: "Show HN: Bash Line Editor written in pure Bash script for syntax highlighting, autosuggestions, vim emulation..."
   5641       長い
   5642     * "Show HN: Bash Line Editor totally written in pure Bash script"
   5643       案外これぐらいの方が気を引けるのかもしれないと思う。
   5644     * "Show HN: Bash Line Editor -- a next-generation Bash configuration"
   5645       或いはこんな感じに煽った感じのタイトルにしても良い。zplug の真似
   5646       でも技術的に面白いのは pure Bash script であるという事。
   5647 
   5648       "with syntax highlighting, autosuggestions, vim emulation" 等は書かなくてよい。
   5649       書かない方が煽りになるのである。本当か? と思ってみんなリンクを開く。
   5650       そしてどんな機能があるのかとみんな確認する。
   5651       少なくともこれだけの物があるのだからがっかりする事はないだろう。
   5652 
   5653       でも落ち着かなければならない。Bash configuration と書くと、
   5654       従来の PS1 や aliases や functions を包含する物と考えられてしまう。
   5655       その様に考えると、Bash plugin と書いた方が良いか?
   5656       或いは、plugin manager として突貫で他の物を取り込める様にするか、
   5657       或いは README に強調しておくことにするか。
   5658 
   5659       というか Bash configuration というのが良くない。違う。
   5660       もっと土台になるものなのである。
   5661       実のところ "a next-generation Bash Line Editor" なのだ。
   5662       然し line editor という意味では全然 next-generation ではない。普通だ。
   5663       つまり Bash の設定にしては next-generation なのであって、
   5664       line editor として next-generation な訳ではない。
   5665 
   5666       a next-generation Bash interface/infrastructure/extension/framework
   5667 
   5668       Framework としての側面も強調してよいのかもしれない。
   5669       (或いは真面目にライブラリとして独立させても良い。
   5670       decode 部分に関しては大幅に手を入れる必要があるかもしれない?)
   5671 
   5672     * "Show HN: I wrote a featureful line editor in pure Bash scripts"
   5673       みたいな単純な物の方が気を引けるのではないかという気がする。
   5674 
   5675     調べるとスタートアップという文字が頻りに見える。
   5676     投稿してみた感想を観察してみるとやはり何かのお誘いがある様である。
   5677     タイトルに文字数制限は在るのだろうか。
   5678 
   5679     何れにしても今は忙しいので沢山の要望などが来てしまっては困る。
   5680     従って暫くはこのまま放置するというので良い気がする。
   5681 
   5682 2020-01-05
   5683 
   5684   * Homebrew の設定を作成する?
   5685 
   5686     先ず Linuxbrew (Homebrew for Linux) を ~/opt/linuxbrew に入れた。
   5687     普通と違う場所に入れようとしたので色々問題が起こって時間を食ってしまった。
   5688 
   5689     * brew tap について調べてみる事にする。
   5690 
   5691       % brew tap akinomyoga/ble.sh を実行すると https でダウンロードしようとする。
   5692       % brew tap akinomyoga/ble.sh git@github.com:akinomyoga/ble.sh.git とすれば良い様だ。
   5693       % それから brew install を試そうとするがどうやっても動かない。
   5694       % どれをやってもそんな formula は見つかりませんのエラーになってしまう。
   5695       % もしくは tap を確認すらしない場合もある。不思議だ。
   5696       % $ brew install akinomyoga/ble.sh
   5697       % $ brew install akinomyogable.sh
   5698       % $ brew install akinomyoga/homebrew-ble.sh
   5699       % $ brew install homebrew-ble.sh
   5700       % $ brew install brew-ble.sh
   5701       %
   5702       % $ brew tap
   5703       % を実行してみると。自分が登録した物の他に homebrew/core がある。
   5704       % homebrew/core は中に formula を沢山入れた repo の筈である。
   5705       % もしやと思って調べてみる。
   5706       %
   5707       % https://qiita.com/wkentaro/items/d4981582e08b134f1e1d
   5708 
   5709       どうも user/name に対応して github.com:user/homebrew-name を作成して、
   5710       その中に formula.rb を入れて置くという事になっている様だ。
   5711       面倒なのでそれよりは直接 core に取り入れてもらった方が楽だ。
   5712 
   5713     * 自分で formula を作ってみるのを試す
   5714 
   5715       仕方がないので自分で formula を作ってみるのを試す事にした。
   5716       $ brew create --set-name blesh
   5717 
   5718       全て自分で記入しなければならない様だ。適当に formula を作成してみる。
   5719       sha256 は何の sha256 を記入すれば良いのか分からないのでコメントアウトする。
   5720       結局分からないので以下を参考にして埋めてみる事にする。
   5721       https://github.com/10sr/homebrew-pkg/blob/813de30c121e8dea970f11e7c1e63e57d3a6a0ed/Formula/ble-sh.rb_
   5722       * ビルドは gawk に依存しているので gawk に依存させてみる。
   5723       * gmake については調べてみた所 macOS ではデフォルトで GNU make だそうなので不要?
   5724         然し、mac ではデフォルトで make が入っているのだろうか。
   5725         或いは自分で追加で入れる必要があったりするのだろうか。よく分からない。
   5726 
   5727       と思ったが何処にも *.rb が作られていない。
   5728       $ find ~/opt/linuxbrew/ | grep blesh
   5729       で調べてみたら ~/opt/linuxbrew/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/blesh.rb
   5730       に新しく blesh.rb が作成されていた。これを使う事にする。
   5731       試しに $ brew install blesh としてみたら動き出した。
   5732       gawk を入れるためにその依存関係まで全てダウンロードしてインストールしようとしている。
   5733 
   5734     ? brew では自分で何処かで入手した formula を使うにはどうすればよいのか?
   5735 
   5736     * homebrew-core に登録する為には test を用意しなければならないようだ。
   5737 
   5738 2019-12-31
   5739 
   5740   * progcolor: 引数の中の着色 (zsh -c '...' の ... の部分)。
   5741 
   5742     いつか実装しようと思っていたら fast-syntax-highlighting が既に実装している。
   5743 
   5744     | fast-syntax-highlighting
   5745     | →引数の中も着色すると思ったら '$(...)' の中も着色を行っている。
   5746     | 然し、zsh -c '...' に関してはちゃんと zsh や -c を認識して着色している様だ。
   5747     | 調べてみると awk もちゃんと文法的なチェックを行っている。
   5748     | (→ うーん gawk --source '...' で文法チェックをできる様だ。)
   5749     | sed に関しては行っていない。何れにしてもコマンド毎の着色を実現している。
   5750 
   5751     * コマンド毎の着色設定を指定できる様にした #D1245
   5752 
   5753     | 次に例えば awk に対応する事を考える?
   5754     | 或いはそれよりは sh もしくは bash に対応する方が楽?
   5755     | 色々考えてみたがちゃんと対応するのは可也大変である。
   5756     | 先ず単語が単純単語でない場合にどの様に実装するか。
   5757     | 等、色々難しい。既にある文法構造を利用して何とかできる可能性はある。
   5758     |
   5759     | awk に対応するとしても awk の様々な実装によってオプションなど異なる。
   5760     | このオプションが異なっていると異なった着色になって、
   5761     | ユーザに混乱を齎す。従って対応するとしたら完全に対応している時にだけ有効にする。
   5762     | 何れにしても面倒である。awk よりは先に bash で対応した方が懸命ではないか。
   5763     | awk の対応に関しては自分の blerc の中だけに留めておく。
   5764     | その自分の blerc の中での awk の着色の設定で必要になると
   5765     | 思われる補助機能をble.sh の方で実装する。
   5766 
   5767     * awk の着色対応を通じて ble.sh 側で支援の必要な機能を実装する。
   5768 
   5769     * 単純単語に関して。評価値を求める方法。
   5770       評価値の各文字が元の単純単語のどの位置に対応するか。
   5771       或いはその逆? どちらの方が適切だろうか。
   5772 
   5773       例えば引用符等に関しては対応する文字はないのでそのままの色が良い。
   5774       従って評価後の文字に対応する評価前の範囲を取得すると良い気がする。
   5775       然し、逆に評価前の $a が評価後に沢山の文字列になる事もある。
   5776       その場合には評価後の各文字の色を評価前に割り当てるのは難しい気がする。
   5777 
   5778     * 対応する物がない文字をそのままの (下の層の) 色にする事は可能だろうか。
   5779       恐らく getg 等で取得しなければならない。面倒である。
   5780       或いは ble/highlight/layer:syntax では少し違う様に処理していた気もする。
   5781 
   5782     * 複雑な単語に関しては文法構造を利用する事も考える。
   5783 
   5784     * 現在の layer:syntax の枠組みでは一旦着色情報を wattr に格納してから、
   5785       それを word table に対して適用するという仕組みにしている。
   5786       この様にする事に何の意味があったのだったか?
   5787 
   5788       直接 word table に適用した方が早いのではないか?
   5789       →これは何度も単語着色を求め直すのを省略する為である。
   5790       つまり、単語着色を決定する部分と実際に適用する部分を分けて、
   5791       前者をできるだけ省略する様にしている。
   5792 
   5793       実際に適用する必要がある場合でも前回求めた値を
   5794       そのまま使えば良い場合があるという事なのである。
   5795 
   5796   * fast-syntax-highlighting の機能を確認する
   5797     https://github.com/zdharma/fast-syntax-highlighting
   5798 
   5799     * コマンド毎の着色。オプションや引数が正しいかのチェックも行う。
   5800       これは丁度 ble.sh で将来的に対応したいと思っている機能である。
   5801     * 括弧の対応に応じた着色
   5802     * gawk --source による文法チェック?
   5803 
   5804   * theme: 流石に theme を作った方が良い気がしてきた。
   5805     少なくとも枠組みだけでも作って置くと良い気がする。
   5806     と思ったが実際に例がないと枠組みの良い設計も分からない。
   5807     zsh-syntax-highlighting はどうしているのだろうか。
   5808     zsh-syntax-highlighting theme で検索してみる。
   5809 
   5810     どうも zsh-syntax-highlighting は theme を提供していない様だ。
   5811     https://highlightjs.org/static/demo/
   5812     ここは dark/light の両方を提供している theme があって参考になる。
   5813     但し、ファイル名着色に使う色は色々調整しなければならないが。。
   5814 
   5815     fish の theme はあるだろうかと思って探すと。
   5816     https://github.com/oh-my-fish/oh-my-fish/blob/master/docs/Themes.md
   5817     どうもシェル業界では theme というのはプロンプトの事を指す様で。
   5818     然し、fish のブラウザ設定画面ではタブは colors となっている物の、
   5819     色々な設定の部分には theme という文字も見える。
   5820     何れにしても theme というのは紛らわしいかもしれない。
   5821     注意書きを書いておく必要があるかもしれない。
   5822 
   5823   * tui: TUI 設定画面?
   5824     fish はユーザフレンドリーを謳っている。
   5825     ブラウザで設定できるなど (リモートの場合には使えない気がするが)。
   5826     ble.sh ではブラウザでなくても TUI で設定画面を用意しても良いのかもしれない。
   5827     マウスサポートまですればブラウザでなくてもOKなのである。
   5828 
   5829     →fish の web 設定画面を確認してみた。
   5830       実は theme と prompt が選べるだけだった。
   5831       他は関数・変数・履歴・束縛・略語展開の一覧が見えるだけで、
   5832       何も設定することはできないのだった。
   5833       但し履歴項目の削除はする事ができる。
   5834       略語展開も実は編集することができた。
   5835     →theme に関しては配色が選べるだけで、
   5836       具体的にどの色がどの意味というのは余り考えられていない気がする。
   5837       適当に順番に割り当てただけなのではなかろうか?
   5838 
   5839     その様に考えると履歴の着色でも良いのかもしれない等と。
   5840 
   5841   * complete: 重い補完関数に対する対策
   5842 
   5843     * 曖昧補完の為に何度も progcomp を呼び出していて非効率的
   5844       →無駄があると思ったが実際にどういう補完を行っているか調べると
   5845       様々な補完点を試しているのだった。うーん。
   5846       自動補完の補完候補がすぐに見つかる場合にはそんなにたくさん呼び出されない。
   5847       補完交互が見つからない時には自動補完によって何度も補完が実行されて遅くなる。
   5848 
   5849       もしかすると自動補完を off にしたいという人は時間のかかる
   5850       補完関数を使っているという事なのかもしれない。
   5851       よく考えたら peco の類を設定している場合大変に面倒な事になるのでは?
   5852       自動補完が実行される度に選択メニューが表示されてしまう。
   5853       そもそも補完に peco を設定している時点で変ではあるが。
   5854 
   5855       色々な補完点で試すとしても現在の単語を 0 文字または 1 文字しか
   5856       入力していない場合には、同じ状態で呼び出す事もあるだろうという気がする。
   5857       その場合の為に compgen の呼び出し結果をキャッシュする利点はあるだろうか。
   5858       つまり、同じ補完状態で再度呼び出される事を見込めるかどうかが問題になる。
   5859 
   5860     * 或いは、処理を非同期で呼び出すというのが良いのかもしれない。
   5861       その場合には計算結果を何処かファイルに書き出す様にしなければならない。
   5862 
   5863       非同期で呼び出すのは -CF が設定されているときだけで良い。
   5864       と思ったが -F の中で環境を変更したいという場合にはどうするのだろう。
   5865       非同期で呼び出すという事にすると環境に対する変更が適用されない。
   5866       これは bleopt で変更できる様にしても良いのではないだろうか。
   5867 
   5868   * complete: menu-complete 中の通常文字挿入は
   5869     絞り込みに戻すのが良いのではないか。
   5870     というか普通にキャンセルして挿入すれば絞り込みになるのでは?
   5871     と思ったが menu-complete 状態からは抜ける事になる。
   5872 
   5873     後、suffix を挿入せずに確定する方法がなくなる。
   5874     これについては別の操作方法について考えると良さそう。
   5875     例えばスペースを押すと suffix 挿入を抑制して確定する等。
   5876 
   5877     →やはりこれは分かりにくいのではないか。
   5878       fish, zsh の動作を確認してみたが menu-complete 中に
   5879       新しい文字を入力すると何れも現在の選択肢を確定させた後に
   5880       続きの文字が入力される様になっている。
   5881       これらのシェルと異なる振る舞いをするのは良くない。
   5882 
   5883       だとすると絞り込みをする為には明示的に
   5884       絞り込みのモードに入るキーを設定するべきなのでは。
   5885       例えば M-e 等?
   5886 
   5887       因みに emacs で試してみると M-e, M-a は end/beginning of
   5888       sentence 的な動作をしている様に見える。
   5889       なので上書きしてしまっても良い様な気がする。
   5890       うーん。でも end of line の代わりに使っている人がいるだろうか?
   5891 
   5892       因みに現在の ble.sh では M-e は何にも紐付いていない。
   5893       うーん。M-e を勝手に補完の絞り込みモードに割り当てる事にする。
   5894       絞り込みモードにいる時にはカーソルの動く範囲と編集範囲を制限する。
   5895       と思ったが vi の様な複雑なモードの場合にそれを実現することは可能か?
   5896       移動だけならば __after_widget__ で範囲外に出た時に
   5897       強制的に範囲内に移動させる事が可能であるが、編集まで入ると困難である。
   5898       編集を禁止しなければならないがそれは難しい。
   5899 
   5900       だとすると新しいプロンプトで編集させるというのが現実的だろうか。
   5901 
   5902 2019-12-29
   5903 
   5904   * color: term_true_colors=auto
   5905 
   5906     自動判定は難しい。screen-4.99.0 が truecolor on/off
   5907     のオプションを持っているので実際にユーザが有効にしているかどうかは
   5908     TERM や DA2 を使っても分からない。結局試しに色を設定して、
   5909     その色を読み出すという事をしなければ判定できないのだろうか。
   5910     然し、これも端末によって問い合わせができたりできなかったり
   5911     (セキュリティ上の都合から)無効になっていたりする気がする。
   5912 
   5913     以下の優先順位で試すというのが妥当な実装方法の気がする。
   5914     然し 1 の判定を非同期に行わなければならないので面倒である。
   5915 
   5916     1. 色を設定して問い合わせる
   5917 
   5918       http://nanno.dip.jp/softlib/man/rlogin/ctrlcode.html
   5919       https://qiita.com/kefir_/items/c2bd46728364bdc7470b
   5920       OSC 10 ; ? ST で前景色RGB問い合わせ、
   5921       OSC 11 ; ? ST で背景色RGB問い合わせの様である。
   5922       応答は OSC 10 ; "rgb:rrrr/gggg/bbbb" ST の形式?
   5923 
   5924       よく考えたら現在の実装では ESC-[ (CSI) しか特別扱いしていない。
   5925       これに対応する為には "ESC ]" (OSC) についても処理する必要がある。
   5926       これは ble-decode-char/csi/consume の辺りを拡張する必要がある。
   5927       特に BEL または ST (ESC \) で終端する様に処理を書く事に注意する。
   5928 
   5929     2. DA2 を元に判断する
   5930       然し https://gist.github.com/XVilka/8346728 のページには
   5931       各ターミナルの対応 version が書かれていないので使えない。
   5932       自分で調べ上げるしかないのだろうか。
   5933 
   5934     3. TERM を元に判断する (*-24bit *-24bits *-truecolor)
   5935     4. terminfo を元に判断する (setf24, setb24, tc, RGB)
   5936 
   5937 2019-10-21
   5938 
   5939   * ずっと起動していると段々と遅くなっていくのは何故か。
   5940 
   5941     Ubuntu bash-4.3 (song437) で動かしていて気づいた。
   5942     bash として新しく起動すると速い。
   5943     ble-update や ble-reload をしたり、
   5944     ble-detach / ble-attach しても直らない。
   5945 
   5946     カーソル移動だけでも遅くなって行くので描画が関係しているとは思われない。
   5947     また、reload しても直らないという事から考えられる事は何か。
   5948     履歴がどんどん溜まって重くなるという事でもない様な気がする。
   5949 
   5950     或いは変数のアクセスが遅くなって行くという事なのだろうか。
   5951     変数に代入するスクリプトを回してみたが特に遅いという事はない様だ。
   5952     (それにそもそも使用している時間に比例して変数が増えていくという物でもない)
   5953 
   5954 2019-09-24
   5955 
   5956   * ble.sh で export PATH=aaa:bbb:ccc で最後の部分しか着色されない。
   5957     それぞれ着色するべきなのではないか。
   5958 
   5959 2019-09-22
   5960 
   5961   * complete: = を含むファイル名を補完すると = 以前の部分が重複して挿入されてしまう。
   5962 
   5963     →今確かめてみると再現しない。\= としていても = としていても同じ。
   5964 
   5965     2019-12-31 ./configure の引数で --prefix= を補完している時に
   5966     = が \= になったり --prefix= も丸ごと置換されたりなど変な動作をする。
   5967     一方で、complete -r で progcomp を消してやると変な事は起こらない。
   5968     これは要するに progcomp の仕様の微妙な違いに起因して変な事が起こっている。
   5969 
   5970 2019-07-16
   5971 
   5972   * complete: パス名展開で複数語に展開される場合の補完に関して
   5973     現在の実装ではパス名展開が起こったとしても展開された最初のファイル名を使って補完を実行する。
   5974     然し、実際には展開された各パス名について補完を実施しても良いのではないだろうか。うーん。
   5975 
   5976     更に failglob の場合には続きを入力したら一致したかもしれなくても常に展開に失敗してしまう。
   5977     というか現状でそもそも failglob だった時にそれを検出しているのかどうかすら怪しい。
   5978     確認する必要があるのである。
   5979 
   5980     既に COMPV には複数の値が入る仕組みになっていた。
   5981     それならばと COMPV に入っている値の数だけ source を呼び出せば良いのかと考えたが、
   5982     実際に試してみると全く同じ候補が何度も生成されるだけに終わってしまった。
   5983     よく考えたら progcomp では独自に展開を行っていたのではあるまいか。
   5984     調べてみたらやはりそうである…。これに対応するのは面倒である。
   5985 
   5986     或いは複数語に展開される場合には先ず始めにその内のどれか一つに絞らせるという可能性もある?
   5987     然しそれはそれで不便な気もする。
   5988 
   5989 2019-07-09
   5990 
   5991   * history.mlfix: bash-3.0 で実現する方法?
   5992     history -s が使えないので複数行の履歴を登録する事が不可能である。
   5993 
   5994 2019-07-02
   5995 
   5996   * menu: 複数選択を可能にしても良いのではないか
   5997     C-@ で toggle をする等。抜ける時に全てを挿入する?
   5998     然し使いみちがよく分からない。使いたくなったら追加するというので良い気がする。
   5999 
   6000 2019-06-18
   6001 
   6002   * history: interactive な history 編集に対応できたらする
   6003     つまりメニューを表示して其処で選択したり削除したりする。
   6004     検索などもできる様にする。遅延で着色をする。
   6005 
   6006     core-complete に実装されている既存のメニューの枠組みは、
   6007     menu item を配列に格納する。従って容量を食う。
   6008     更に重そうである。これは独自に新しく実装した方が良いだろうか。
   6009 
   6010 2019-05-27
   6011 
   6012   * 次に機能を追加するとしたらマウスなのだろうという気がする。
   6013     fish は未だマウスに対応していない。
   6014     zsh はそういう拡張があるらしいがちゃんと動くのかは知らない。
   6015 
   6016     zsh extension: https://unix.stackexchange.com/questions/444601/any-terminal-shell-with-mouse-support
   6017     fish suggestion: https://github.com/fish-shell/fish-shell/issues/4918
   6018     question: https://superuser.com/questions/322367/are-there-any-unix-shells-that-support-mouse-reporting
   6019 
   6020     マウス対応の問題点はマウスが有効になっていると、
   6021     従来の端末に対するマウス操作(端末に表示されている内容のコピー・ペーストなど)が使えなくなる事である。
   6022     端末に表示されている内容まで全て ble.sh の管理下であればそういう事もできたかもしれない。
   6023 
   6024     部分的なサポートとして何らかのモードに入っている時だけマウスを有効にするというのはあるかもしれない。
   6025     例えば補完のメニューを出している間だけ、など。然し、それもなかなか分かりにくい気はする。
   6026     或る特定の範囲だけでマウスを有効にするという制御機能があった様な気がする。
   6027     それが使えればそれを使ってマウスを有効にするというのが可能になる気がする。
   6028     何れにしてもこれは考察が必要になるのである。
   6029 
   6030     2019-07-22 どうも既存の端末では Shift を押しながら操作すると
   6031     Mouse report ではなくてローカルでの端末上でのマウス操作になる、
   6032     というのを採用している物が多い、という話を何処かで見かけた。
   6033     何処で見掛けたかは忘れたし実際にそうなのかの確認はしていないが。
   6034 
   6035 2019-04-21
   6036 
   6037   * 実は背景色を判定する方法はなくはない様だ。
   6038     https://qiita.com/kefir_/items/c2bd46728364bdc7470b
   6039     しかしそうだからと言って暗い背景用に配色を調整する必要があるので、
   6040     それを実行するまでは対応しても仕方がないかもしれない。
   6041 
   6042     % というか、調べていたら DECSCNM (SM/RM(?5)) が背景が暗いか明るいかの設定の様だ。
   6043     % という事は DECRQM して DECRPM を受け取れば普通に背景が明るいか暗いか分かるのでは。
   6044     % そして Poderosa や screen の側でもそれを設定すれば良かったのではないか…。
   6045     % と思ったが xterm は明るいか暗いかが反転している。
   6046     % つまり、DECSCNM は飽くまでその端末の既定の背景と比べて反転しているかどうかしか分からない。
   6047     % 既定の背景色が明るいか暗いのかの情報は取る事ができない。
   6048 
   6049     一方で、背景色の問い合わせで返ってくる色が DECSCNM の影響を受けるのか
   6050     は気にして置かなければならない。
   6051 
   6052 2019-03-23
   6053 
   6054   * menu: alias select='while myselect $# "$@"' 等として select を上書きできるのでは
   6055 
   6056     というか現在の ble.sh で select を実行すると悲惨な事になる気がする…。
   6057     と思ったが select は別に readline は使っていない様子だ。
   6058     元の bash でも全然行編集できない感じの入力になっている。
   6059     なので現状で問題が発生しているという訳でもない。
   6060 
   6061     もし置き換える事ができるのであれば便利かもしれないという程度である。
   6062 
   6063   * menu: 今後の拡張性
   6064 
   6065     * 因みにフィルタリング機能は menu-filter を統合・整理する形で実装したい。
   6066       フィルタリング文字列の入力に関しては isearch や iswitchb の様な、
   6067       単に文字を入力するか BS で戻るかだけしかできない様なものでも良い事にする。
   6068 
   6069       フィルタリングに関してはフィルタリングを実行する関数と、
   6070       フィルタリングを誘発する為の機能を分離して実装する事にする。
   6071       既存の menu-filter の機能は自動的にフィルタリングを呼び出す。
   6072       明示的なフィルタリングの場合には keymap にフィルタリングを紐付ける。
   6073 
   6074     * cdhist では更にリスト編集機能までついている。
   6075       つまり項目を並び替えたり削除したりと言った事ができる。
   6076 
   6077       うーん。これをどの様に返すかは微妙かもしれないが、
   6078       _ble_complete_menu_items にある物を呼び出し元で参照してもらうというので良い気がする。
   6079       或いは callback でどの様に並び替えたかを返すという手もあるが分かりにくいだろうか。
   6080       両方という事で良い気がする。使う側で便利そうな方を選んでもらう。
   6081       どの様に並び替えたかの操作が欲しければ callback を使うし、
   6082       最終的な結果だけ欲しければ _ble_complete_menu_items を参照してもらう事にする。
   6083 
   6084     * callback という事で思ったが、実は accept だとか cancel だとかも
   6085       全て menu_class 経由で定義した方が良いのではないだろうか。
   6086       一つずつ全て callback を変数に設定していくのは面倒である。
   6087       更に、並び替えの callback だとかどんどん増やしていくと際限がない。
   6088 
   6089 2019-03-22
   6090 
   6091   * menu-filter の使い心地が微妙なのはもしかして
   6092     menu-complete を実行中に絞り込みができないからなのではないか。
   6093     現在は menu-complete を実行している途中に入力をするとその場で確定してしまう。
   6094 
   6095     では bash の振る舞いはどうなっているだろうか。
   6096     確認してみた所、bash の menu-complete はもうその場所に挿入してしまう。
   6097     そして文字を入力すれば続きに挿入される事になる。
   6098 
   6099     現在の ble.sh の振る舞いはどうだろうか。
   6100     その場で入力すると addtail 等の処理をせずにいきなり続きから入力されてしまう。
   6101     少なくとも addtail ぐらいはするべきなのではないか。
   6102     また、絞り込みを実行しても良いのではないかという気もする。
   6103     然し、それでも何か違う様な気がする。
   6104 
   6105     絞り込みの入力欄と現在選択されている内容というのは別に一致している必要はない。
   6106 
   6107 2019-03-19
   6108 
   6109   * complete: 実装されていない補完関連の rlvar は以下の通りである。
   6110     実際に対応するかどうかも含めて考察する必要がある。
   6111 
   6112     - set completion-map-case off
   6113     - set disable-completion off
   6114     - set expand-tilde off
   6115     - set horizontal-scroll-mode off
   6116     - set page-completions on
   6117     - set completion-display-width -1
   6118     - set completion-prefix-display-length 0
   6119     - set completion-query-items 100
   6120 
   6121     うーん。これらの設定は bash の既定値では余り便利ではなかったりする。
   6122     ble.sh で折角実装してもユーザに使ってもらえないのでは仕方がない。
   6123     それならば最初から ble.sh の bleopt として提供してしまった方が良いのでは。
   6124     元々 bash を普通に使っていて設定している人の為に、
   6125     bash の規定値と異なる値を敢えて選択している時に限り
   6126     ble.sh でその効果を再現する様にすれば良い。
   6127 
   6128 2019-02-09
   6129 
   6130   * main: --attach=prompt の問題は何だったか
   6131     ref #D0940
   6132 
   6133     何か問題があって現在はこれを使っていないが、それは何だったろうか。
   6134     何処かに記録されていて良い筈なのに何処にも記述がない。
   6135     対応した時の記録は #D0737 にある。
   6136     動かしてみた所、ちゃんと動いている様に見える。
   6137 
   6138     →恐らく、先ず古い ble.sh の version では使えないという事。
   6139       それから PROMPT_COMMAND を上書きすると使えなくなってしまうからという事。
   6140       ユーザに PROMPT_COMMAND を設定しないように要求するのは面倒である。
   6141 
   6142 2018-09-21
   6143 
   6144   * [保留] 2018-09-15 complete: 文脈の変更範囲で end0 だけ負になるバグ (ref `#D0818`)
   6145   * [保留] 2018-09-11 complete: 端末が操作を受け付けなくなるバグ (ref `#D0817`)
   6146 
   6147 2018-08-16
   6148 
   6149   * complete: オーバーレイによる実装?
   6150 
   6151     現在の実装では仮挿入しているが、
   6152     これによって現在の入力内容でエラー着色するべき所が、
   6153     補完が実行された後の着色になってしまっていて、
   6154     補完前の現状でエラーなのかどうなのかが判別できなくなっている。
   6155 
   6156     やはり仮挿入ではなくて overlay で実装するべきなのではないか。
   6157     しかし overlay の仕組みを実装するのは面倒である。
   6158     どの様な仕様にするのが良いのかの吟味から実装まで。
   6159     しかし、これについては後回しで良いだろう。
   6160 
   6161     以下に仮入力の4種類の方法について言及がある。
   6162     https://mattn.kaoriya.net/software/vim/20170905113330.htm
   6163 
   6164     リンク先は消えている。web archive のリンクを追記 (2018-09-23)。
   6165     https://web.archive.org/web/20110630165743/https://www.mozilla-japan.org/projects/intl/input-method-spec.html
   6166 
   6167     * 2018-09-23 自動補完時の着色について
   6168       cmplstofB さんからも指摘があった。
   6169       https://github.com/akinomyoga/ble.sh/issues/5
   6170 
   6171       自動補完の候補文字列は実際に挿入しているので構文着色に影響を与える。
   6172       "現在の内容" で着色するべきなのではないか、ということ。
   6173       そうしないと例えば今入力したコマンドが実際に存在するコマンドなのかどうかが分からない。
   6174 
   6175 2018-08-05
   6176 
   6177   * edit: set blink-matching-paren on に相当する機能
   6178     対応するならカーソル移動ではなくて着色でやった方が良い。
   6179 
   6180     | 括弧の対応と region が両方走っていると分かりにくい。
   6181     | 既に region には複数箇所を highlight する機能がある。
   6182     | そういう意味で region を使うという手もある。
   6183     | と思ったが、分かりにくい問題に関しては region の方を上に配置すれば良い。
   6184     | 複数箇所を highlight する機能は実装を参考にするだけで良い。
   6185     | 論理的には全く異なる (region は _ble_edit_mark を参照する) し、
   6186     | それぞれ独立に on/off する事を考えれば別の highlighter にするべき。
   6187 
   6188     region の複数箇所着色の実装を参考にする可能性も考えつつ、
   6189     region とは独立な highlighter にしたい。
   6190     その時は region の一つ下の層に挿入したい。
   6191 
   6192     また対応する括弧はどの様に検出するのが良いだろうか。
   6193     やはり文法構造を参照する実装にするしかない様に思われる。
   6194     しかし、括弧の対応には色々ある。引用符の対応、
   6195     括弧の対応、if then else などのキーワードの対応、
   6196     ヒアドキュメントの始まりと終わりの対応である。
   6197     それらは必ずしも記録されていないし、また、記録されているとしても
   6198     様々な形式で記録されている。取り敢えず一番簡単な対応として
   6199     nest に記録されている物を着色するというのが良さそうである。
   6200 
   6201     2023-03-26 https://github.com/akinomyoga/ble.sh/discussions/308
   6202 
   6203     対応する request が来た。うーん。もっと最近にも関連した考察をした気がするが、
   6204     メモに記録があるかどうかは覚えていない。
   6205 
   6206 2018-07-29
   6207 
   6208   * complete: メモ
   6209 
   6210     - 生成候補のキャッシュを行うとすれば source 内で実装するべきである #D0705
   6211 
   6212 2018-07-19
   6213 
   6214   * ble-decode: 'set convert-meta on' 的な操作
   6215 
   6216     ref #D0699 (LANG=C bash で ble.sh をロードすると全く操作できない)
   6217 
   6218     ble.sh の内部環境では set convert-meta off にしているが
   6219     (そうしてないと特殊文字の受信時に無限ループになる)、
   6220     外部環境で set convert-meta on だった時に、
   6221     それをエミュレートする様な動作を行っても良い。
   6222 
   6223     外部環境における set convert-meta の状態は
   6224     変数 _ble_term_rl_convert_meta_external に記録してある。
   6225 
   6226   * 現在の `LC_CTYPE` で表現できない文字を入力した時の `self-insert` の振る舞い
   6227 
   6228     ref #D0699
   6229 
   6230     self-insert で入力するのは逆符号化したバイト列であるべきでは?
   6231 
   6232     というのも LC_CTYPE が正しくない場合でもファイルシステムのファイル名などは
   6233     そのまま謎の文字列として取り扱われるからである。
   6234     然し逆符号化したバイト列は文字列として正しくないかもしれない。
   6235     逆符号化したバイト列を更に一バイトずつ現在の LC_CTYPE に変換すると意味がない。
   6236 
   6237     これは文字列を編集などしようとすると分からない事になりそうなので、
   6238     取り敢えず現段階では \u???? を出力するという現状の振る舞いを維持する。
   6239     後で落ち着いてから再考する事にする。
   6240 
   6241     以下の c2s 使用箇所は一貫している必要がある。
   6242 
   6243     ble/widget/self-insert 編集文字列の入力
   6244     ble/widget/vi-command/search-char.impl/core 検索文字列の入力
   6245     ble/widget/vi_xmap/visual-replace-char.hook 置換に使う文字の入力
   6246     ble/lib/vim-surround.sh/get-char-from-key 囲み文字の入力 (あらゆる遅延入力)
   6247 
   6248 2018-02-21
   6249 
   6250   * vi-mode: nmap (, ), {, }
   6251 
   6252     カーソルを N 文元に戻す or 先に進める。N 段落元に戻す or 先に進める。
   6253 
   6254     これは operator:d,c で "- ではなく "1 に記録するという例外の対象であるので、
   6255     対応したらその例外のリストに登録する必要がある。
   6256 
   6257     2020-08-27
   6258     https://www.youtube.com/watch?v=hIJh-KlQ7io
   6259     この動画で zsh/bash の vi mode に (){} がない事を嘆いている。
   6260     然し、"文" をどの様に定義するのか。文法的なコマンドで定義するのか、
   6261     或いは、元の vim と同様に . の位置で判断するのか。
   6262     シェルの機能としては . の位置で判断するのは使いようがない。
   6263     一方で、シェル文法の . で移動する様にすると
   6264     vim に使い慣れた人に取っては混乱の元である。
   6265 
   6266 2018-02-12
   6267 
   6268   * [保留] vi-mode: operators 保留項目 [#tmp0002]
   6269 
   6270     * 領域折り畳み zf には対応しない。
   6271 
   6272     * gq の formatexpr, formatprg には未対応である。
   6273 
   6274 2018-02-11
   6275 
   6276   * [保留] keymap/emacs: 連続する delete-backward-char の場合 undo の記録をまとめる可能性?
   6277 
   6278     現状では一文字ずつ記録しているので一文字ずつ undo される。
   6279     現在の振る舞いの方が良いのか emacs と同様にまとめた方が良いかは微妙な所である。
   6280 
   6281 2017-11-21
   6282 
   6283   * syntax: for^J で改行にエラーが設置されるが見えない [#T0005]
   6284 
   6285     改行のエラーは何らかの方法で見える様にするか、
   6286     或いは、改行位置にエラーがある様な時は、
   6287     その前の文字でエラーが発生する様にチェックを行うべき。
   6288 
   6289     Note: これは端末によっては表示されたりする。端末による。
   6290     エラー着色はどの様に行われているのか。for の後には FARGX1 に入る。
   6291 
   6292     これは ble-syntax:bash/ctx-command/.check-delimiter-or-redirect の冒頭部分が怪しい。
   6293     と思ったが FARGX1 に関してはチェックが入っていないのでやはり関係ないだろうか。
   6294     うーん。調べるとやはり文法レベルでの着色になっている。
   6295 
   6296     2019-03-11
   6297 
   6298     | rps1 で表示している時に EL を空白で代替していると、
   6299     | 改行の着色が空白に反映される。これでも良いような気がしてきた。
   6300     | 然し、右側が全て着色されるというのもうるさい。
   6301     | 最初の1文字だけ着色して SGR(0) するかと思ったが、
   6302     | そうするとその次にある文字の着色も消えてしまう。
   6303     |
   6304     | それの対策のために _ble_textmap_ichg があるのでは。
   6305     | と思ったが、実装を見てみると違っている様に見える。
   6306     | _ble_textmap_ichg は着色の調整に使っている事は確かだが、
   6307     | _ble_textmap_ichg に登録されている文字の着色を計算しているのであって、
   6308     | _ble_textmap_ichg に登録されている文字の次の文字の着色は計算していない様に見える。
   6309     | うーん。_ble_textmap_ichg は他の箇所では全く使っていない。
   6310     |
   6311     | そうだ。思い出した…。_ble_textmap_ichg に登録されている文字は、
   6312     | 配置の場所によって中身が変わるので、shift が使えないという事だった。
   6313     | 特に、中身が変化している場合には文字を取り出して変更を行うのだった。
   6314     | では以前 ichg に登録されていて、現在位置では ichg に登録されていない文字はどうなるのか。
   6315     | と思ったら既定の文字形は別の所で決定されている様だ。
   6316     | ble/highlight/layer:plain/update/.getch である。
   6317 
   6318     a 右側の1文字だけ着色される様にする?
   6319 
   6320       x 問題点はコピーペーストした時に必ず余分な空白が入る事である。
   6321         これは右側の全てを着色させる場合にも同様の問題が生じる。
   6322 
   6323         また、エラーが有る時にだけ (着色の必要がある時にだけ)
   6324         右側に空白を入れるという方法もある。
   6325         しかし、その為にはその位置にエラーが有るのかないのかを
   6326         外部から取得しなければならない。
   6327 
   6328         ble/textmap#update は edit.sh だとかの仕組みに依存しない、
   6329         独立した枠組みにしたいので余り変な機能は取り付けたくない。
   6330 
   6331       x また実装上の問題点として、rps1 が表示されている時に、
   6332         _ble_term_ech を使わない場合、2文字目以降の空白文字を SGR(0)
   6333         でクリアしなければならない事である。この場合、
   6334         改行の次の文字の SGR を復元する為には…
   6335 
   6336         _ble_textmap_ichg に次の文字の番号も追加するか、
   6337         或いは現在の改行文字の SGR 状態を復元する必要がある。
   6338         しかし textmap の処理をしている間は、
   6339         未だ着色が完了していないので SGR 状態を取得できない。
   6340 
   6341         或いは着色部分だけ textmap#update よりも前に持ってきても良いのだが、
   6342         その様にしたとしても色情報を textmap#update に伝達する手法が必要である。
   6343         例えば getg なる関数を textmap#update から呼び出してもらう事にするのか。
   6344         或いは呼び出す関数名も外から指定できる様にするのか。
   6345 
   6346     b やはり改行の前の1文字を描画時に強制的に着色するという手もあるのではないか。
   6347       と思ったが…エラー着色だけ特別扱いするというのも変な話である。
   6348 
   6349     c その様に考えると初めから改行にはエラー着色はしないというのが正しい気がする。
   6350 
   6351       改めて調べると ble/syntax:bash/ctx-command-compound-expect がエラーを設置している。
   6352       うーん。for だけの問題では無い様である。他に select, case の時にも同様である。
   6353 
   6354       ('for'|'select'|'case')
   6355         [[ ${text:i:1} == $'\n' ]] &&
   6356           ((_ble_syntax_attr[i-1]=ATTR_ERR))
   6357         case $word_expanded in
   6358         ('for')    ((ctx=CTX_FARGX1)) ;;
   6359         ('select') ((ctx=CTX_SARGX1)) ;;
   6360         ('case')   ((ctx=CTX_CARGX1)) ;;
   6361         esac
   6362         processed=begin ;;
   6363 
   6364       実際に上記の様にして見たら見える様になった。
   6365       しかし rps1 が有効になっている時はやはりうるさく感じられる。
   6366       また端末に依っては rps1 が無効になっていても行全体が赤く着色される。
   6367       そういう端末 (mintty など) どういう発想なのかはよく分からないが…。
   6368 
   6369       更に here documents も行末にエラーを設置する。
   6370       これについても対策したいが、here documents に関しては、
   6371       nest の終端がない事によるエラー着色である。
   6372       これは nest の範囲を変更しないと着色を変更できない。
   6373 
   6374       何だか中途半端な実装の気がしてきたので取り敢えずこの変更はなかった事にする。
   6375 
   6376     d うーん。右側の内容の消去は実は改行文字を使って行うのではなくて、
   6377       描画した後に消去するという方法にした方が良いのだろうか。
   6378       しかし、その様にすると、今度は urange の中にある行末というのを列挙して、
   6379       それから各行末について位置を計算して実行するという事をしなければならない。
   6380       textmap さえあれば指定範囲内の行末は二分法によって特定する事が可能である。
   6381       しかし面倒である事に変わりはない。もっとまともな方法はないのだろうか。
   6382 
   6383     結局実装の面倒さを考えなければ三種類の仕様が考えられる。
   6384 
   6385     a 右側に1文字赤く表示する
   6386     b 行末まで赤く表示する
   6387     c 行の最後の文字を赤くする
   6388     d 表示されなくても気にしない
   6389 
   6390 2017-11-09
   6391 
   6392   * complete: 候補の優先順位? 例えば拡張子でフィルタすると絞りすぎることがある。
   6393     拡張子の要件を満たすものを先に表示して、満たさないものを後に表示する。
   6394     満たさないものに関してはサブ候補として、TAB による接頭辞挿入には寄与しない。
   6395 
   6396     2018-07-28 候補間の優先順位をつける可能性。
   6397     weak な優先順位は、候補を表示する時の順序。
   6398     strong な優先順位は、候補絞り込みの際に一番優先順位の高いものが一つしかない場合にはそれに確定する。
   6399 
   6400 2017-11-05
   6401 
   6402   * vi-mode
   6403 
   6404     :help 関連の気になること:
   6405 
   6406     - v_p v_P: Implementation details に書かれている処理の順序は実際は逆
   6407     - exclusive-linewise: ここの inclusive/linewise になる条件の記述は曖昧だし全く合っていない
   6408     - star: vim-jp の文書だと WORD と書いてあるが、振る舞いは word (しかも \<\> で囲まれる) に近い
   6409 
   6410     振る舞いで気になること
   6411 
   6412     - i<C-o><C-c> とすると普通のノーマルモードに移行したように見えるのに、
   6413       モード表示は -- (挿入) -- のままである。これは何故だろう。
   6414       ble.sh ではノーマルモードに完全に移行する。
   6415 
   6416     - qa<C-c>q とすると ^C が二重に記録される。これは何か?
   6417       ble.sh では単に ^C は入力された通りに一個だけ記録する。
   6418 
   6419     - C-v <bracketed paste> では矩形挿入にするべきなのではないか。
   6420       ble.sh では矩形挿入を行う。
   6421 
   6422 
   6423 2017-11-03
   6424 
   6425   * vi-mode (registers): 各種特殊レジスタの対応
   6426 
   6427     http://vim-jp.org/vimdoc-ja/change.html#registers
   6428 
   6429     - done: "% は現在のファイル名を保持するが、これは $HISTFILE の内容を返す事にした。
   6430 
   6431     - done: ": は一番最後のコマンドラインの内容である。
   6432     コマンドラインを入力し途中でキャンセルした場合などには記録されない。
   6433     空のコマンドラインで確定した時にも記録されない。
   6434     コマンドが入力された場合は、それが存在しないコマンドであっても記録される。
   6435     コマンドが実行されている途中では未だ設定されていない。
   6436     つまり、そのコマンドが実行された後で値が設定される。
   6437 
   6438     - ". は挿入モードで挿入された文字列を保持する。挿入モードから抜ける時に記録すればよいだろうか。
   6439     と思ったが説明をよく読んでみるとそういう振る舞いという訳でもなさそうだ。
   6440     よく分からないので実際に動かして試してみる必要がある。
   6441 
   6442     - "# は代替ファイル (副ファイル) の名前だそうだが何か良くわからない。
   6443     C-^ の動作と関係しているそうだ。これは未だ実装しない。
   6444 
   6445     - "= これは複雑だ
   6446     - "* "+ "~ これは GUI で選択した範囲を表すものだそうだ。
   6447 
   6448 2017-10-31
   6449 
   6450   * [保留] vi-mode (_ble_keymap_vi_REX_WORD): Unicode categories?
   6451 
   6452     Bash の正規表現 (<regex.h> ERE) で対応するのは難しい。
   6453     また必ずしも Unicode (UTF-8) で実行されるとは限らない。
   6454     現在は UTF-8 しか対応していないが枠組みとしては
   6455     別の文字コードにも対応できる余地は残して置きたい。
   6456 
   6457 2017-10-12
   6458 
   6459   * vi-mode まだ対応していない・考えていないコマンドを列挙する
   6460 
   6461     意外とそんなに残っていないようなので。
   6462 
   6463     * nmap: C-^ '括弧 `括弧
   6464       C-t C-] M Q ZZ ZQ do dp { }
   6465       [{char} ]{char} z{char} C-w{char}
   6466       g<C-a> g<C-g> g<C-h> g<C-]> g# g* g$ g&
   6467       g` g' g+ g, g- g8 g; g< gD gH gN gP gQ gT gV
   6468       g] ga gd gf gF gh gn gp gq gs gt gw gx g@
   6469 
   6470   * [保留] vi-mode: xmap <C-]>
   6471 
   6472     % <C-]> なる物は今見ても存在しない。vivis https://qiita.com/b4b4r07/items/8db0257d2e6f6b19ecb9
   6473     % 辺りに在ったものかとも思ったが、ない。zsh-vimode-visual を見てもない。
   6474     % vim で C-] としてもベルが鳴る。何かの間違いで C-[ を C-] と書いてしまっただけなのかもしれない。
   6475     % と思って改めて vimindex を見ていたら実はあった。
   6476 
   6477     C-] で "選択した文字のタグ" へジャンプと書かれている。
   6478     タグとは何だろうと思ったら http://vim-jp.org/vimdoc-ja/tagsrch.html に説明がある。
   6479     ctags のタグと同じものと思って良さそうだ。因みに :help ... で表示されるのもタグの様だ。
   6480     またノーマルモードの C-] はカーソル位置の単語を ":ta" で検索と書かれているが、
   6481     実質 xmap の時と同じことのようだ。
   6482 
   6483     % これについてはシェルの操作としてどの様な意味を持たせるのかというのは微妙な所である。
   6484     % 履歴項目のブックマーク的なものとして利用することはできるかもしれない。
   6485     % しかし、既にコマンドラインに入力されている文字列を元にジャンプをするとなると矢張り微妙だ。
   6486     % 唯一意味がありそうなのは、指定した単語がコマンドライン上で定義された
   6487     % シェル関数だった時にそこにジャンプするという物だが…本当に需要があるのかは微妙である。
   6488     % しかし、シェル関数の定義を確認したいのであれば寧ろ command-help を呼び出せば良い。
   6489     % シェル関数を修正するという目的ならば使えるかもしれない。
   6490     % 然し、必ずしもシェル関数をコマンドラインで定義したとは限らないし、
   6491     % 該当するファイルがあったとしてもそれをコマンドラインで表示する訳にも行かない。
   6492 
   6493     既に入力した文字列に対応して適切な履歴項目またはコマンドライン中の文字があればそこにジャンプする。
   6494     例えばシェル関数を定義した履歴項目に跳んだり、変数名から declare に移動するなど。
   6495     そういう機能でまともそうなのが定義できればそれを実装する。
   6496 
   6497 2017-09-18
   6498 
   6499   * vi-mode: operator = [#tmp0001]
   6500 
   6501     :help = を見ると (設定 equalprog || 内部関数 C-indenting, lisp || 外部コマンド indent) が使われるそうだ。
   6502     但し、indentexpr が非空白の時、indentexpr が使われる (参照: indent-expression)。
   6503 
   6504     インデントの規則について調べる。
   6505     先ず初めに空行 (空白だけの行) を隔てて前の行に括弧がある場合には、
   6506     それを考慮に入れて初めのインデントが決定される。
   6507     空行を隔てて前の行がインデントされていればそれを継承する。
   6508 
   6509     結局空行を隔てた前の行のインデントまたは最後の括弧の位置を継承するということ?
   6510 
   6511     また括弧の種類は () しか見ていない {} や [] は見ていないようだ。
   6512     デフォルトが lisp だからだと思われる。
   6513     これは実のところシェルに適したインデントを実行するようにするべきなのだと思われる。
   6514     しかしながらシェルのインデントはかなり面倒くさい。
   6515     特に if, then, else, while, do, done 等については現在の解析では状態を記録していない。
   6516 
   6517     関連してコマンドが閉じていない時 RET を押すと改行挿入にするという物がある。
   6518     この機能を実装する為にも現在の入れ子の状態を調べる仕組みが必要になる。
   6519     RET で改行挿入にする機能のほうが幾らか単純なので、
   6520     それを先に実装してからこれを実装する方が良い気がする。
   6521 
   6522   * vi-mode: 関連して [/ 等の実装についても調べたい。
   6523 
   6524     既に vim-surround.sh で類似の機能について実装したが、
   6525     [/ についても個別に実装したい所である。
   6526 
   6527     他にテキストオブジェクトで [{ [} [( [) などと同等の機能も実装している。
   6528 
   6529     [# [' [( [* [/ [` [D [I [P [p [[ [] [c [d [f [i [m [s [z [{ [<mouse2>
   6530     ]# ]' ]) ]* ]/ ]` ]D ]I ]P ]p ][ ]] ]c ]d ]f ]i ]m ]s ]z ]} ]<mouse2>
   6531 
   6532   * vim-surround: ds cs インデント
   6533 
   6534     surround.vim では改行が絡むとき = によるインデントを実行している。
   6535     現在 vim-surround.sh ではインデントを実行していない。
   6536 
   6537     2017-10-09 追記
   6538 
   6539     yS ySS でもインデントは起こる様である。
   6540     更に、xmap S でもインデントを行う (xmap gS はインデントは行わない)。
   6541 
   6542 2017-09-17
   6543 
   6544   * cmplstofB: ビジュアルモード・選択モード?
   6545 
   6546     関連 #D0672 選択モード対応
   6547 
   6548     * テキストオブジェクトで範囲を選択し、また範囲を拡大する。
   6549 
   6550       どうやらテキストオブジェクトの拡大では左右の両端からの拡大を試みるような気がする。
   6551       決して右端からテキストオブジェクトを拡大するというわけではないようだ。
   6552 
   6553       というのも変なところから初めて (...) の中に右端を移動して、
   6554       その上で ib としてもエラーになるからである。或いは短くなる。
   6555       どうも ib の動作としては左端から外側の ( を見つけて、
   6556       それに対応する ) を右端に直すようである。
   6557 
   6558       うーん。これはテキストオブジェクトによって動作が異なるのかもしれない。
   6559       aw などは明らかに右に向かって拡大を行っている。
   6560       因みに矩形選択かどうかは気にしないようだ。
   6561       同じ動作をする。行の右端に行くと次に次の行に普通に移動する。
   6562 
   6563     2018-02-22 現状の xmap におけるテキストオブジェクトの状況について整理する。
   6564     - ble/keymap:vi/text-object/word.impl に於いては既に xmap での振る舞いに対応している様子である。
   6565     - ble/keymap:vi/text-object/quote.impl は明らかに対応していない→対応した #D0670
   6566     - ble/keymap:vi/text-object/block.impl も対応していない
   6567     - ble/keymap:vi/text-object/tag.impl も対応していない
   6568     - ble/keymap:vi/text-object/sentence.impl も対応していない
   6569     - ble/keymap:vi/text-object/paragraph.impl も対応していない
   6570 
   6571 2017-09-16
   6572 
   6573   * cmplstofB: vim-surround.sh: ds cs cS yS ySsd ySSd S gS 'C-s' 'C-g s' 'C-g S'
   6574 
   6575     現在のところ特に要望は出ていないが ds cs あたりは使いたくなるのではないかと思われる。
   6576     → ds cs に関しては要望が出たので対応した。
   6577     → cS yS ySs ySS vS vgS にも対応した。
   6578 
   6579     残っているのは imap <C-s> <C-g>s <C-g>S のみである。
   6580 
   6581 2017-09-15
   6582 
   6583   * cmplstofB: here string 候補について
   6584 
   6585     here string 候補にファイル名以外のものがあれば対応する。返信待ち → やはり候補は難しい。
   6586 
   6587     コマンド名に応じた補完関数の設定を可能にする?
   6588     例えば python3 に対する here document の場合には、import を補完候補に出すなど。
   6589 
   6590     2018-10-02 C++ の場合にはこんな感じに clang を呼び出せば良い様だ。
   6591     clang -cc1 -fsyntax-only -code-completion-at=test2.cpp:7:7 test2.cpp
   6592     http://d.hatena.ne.jp/ohtorii/20110319/1300514225
   6593 
   6594     Here document で補完候補を出す為には、
   6595     Here document の内容 (先頭から現在位置まで) が
   6596     単純内容 (単純単語に近いがシェルの特殊文字を使える) でなければならない。
   6597     その為の関数を追加する必要がある。simple-word の実装を真似れば良い。
   6598 
   6599 2017-08-19
   6600 
   6601   * [保留] cmap/default.sh: "CAN @ ?" 代替?
   6602 
   6603     "CAN @ ?" は "C-x C-x" と較べて曖昧ということで現在無効にしている。
   6604     これの代替キーシーケンスを定義しても良いかもしれない。
   6605     といいつつ現実の端末に存在するものを登録しなければ意味がない。
   6606     (そういう意味では "CAN @ ?" もこれに対応する現代的な端末が実在するのか怪しいのであるが。)
   6607 
   6608     思うに s-x だとか H-x だとか A-x を送りたければ CSI 2 7 ; ... ; ... ~ を使えば良い。
   6609     何故 Emacs が "CAN @ ?" に対応しているのかは謎である。
   6610 
   6611     →実はこれは isolated esc と同じ方法を用いて区別して受信可能かもしれない。
   6612     しかし、何れにしても "CAN @ ?" に対応している端末は殆どないので、対応する理由がない。
   6613     https://superuser.com/questions/407391/super-key-over-ssh によると Konsole がこの形式を使うそうだ。
   6614 
   6615 2017-03-04
   6616 
   6617   * syntax: bug ヒアドキュメントによる nparam の更新が追いついていない。
   6618 
   6619     これは何でかというと nparam の計算に stat 保存点を超えた過去の情報を用いているからである。
   6620     部分更新をしている為に過去の情報が書き換わったとしても
   6621     stat 保存点で解析状態が一致したと見なされてしまい、
   6622     其処で解析が中断してしまうのがいけない。
   6623 
   6624     これを解決する為にはヒアドキュメントの word に相当する部分は
   6625     一気に解析する様に修正しなければならない。
   6626     結局 word 部分は最終的には独自の方法で読み取るのが良い様な気がする。
   6627 
   6628     或いは暫定的に範囲を指定して stat を消去する様な機能があったような…?
   6629     →昔その様な処理の仕方をしていたような気がするが、いま確認してみるとない。
   6630     恐らく何か問題が色々生じて結局その方法は使わないという事になった様な気がする。
   6631     記憶が正しければそれは time ... や function func () だとか func () を解析する時の話だった。
   6632     結局何れの場合でも一回の解析で行けるところまで解析するという事になった。
   6633     ヒアドキュメントでもその様に実装するのが一貫している。
   6634 
   6635   * syntax: ヒアドキュメント 終端 word 着色
   6636 
   6637     todo: 取り敢えず RDRS 等と同様に完全に入れ子を追跡する様に実装する。
   6638 
   6639     $() ${} の入れ子も含めた実装が必要になる。
   6640 
   6641     実は、通常通りに解析してしまって、
   6642     後の着色で一様な色に塗り潰してしまうという方策で良いのではないか。
   6643     しかしそれだと tree-enumerate の際に $() の内部で着色が起こる気がする…。
   6644     % 特に部分更新などをすると確実に内部での着色が発生するのでは…??
   6645     % →部分更新の時は一番外側の単語についても着色が判定されるから特に
   6646     % 部分更新仮想で内科に依る違いは発生しないと思われる。
   6647 
   6648     取り敢えずの実装として通常通りに解析する様に変更した。
   6649     単に ble-syntax:bash/ctx-heredoc-word から
   6650     ble-syntax:bash/ctx-redirect に処理を委譲するだけで良かった。
   6651     ヒアドキュメント特有の処理は ble-syntax:bash/ctx-heredoc-word/check-word-end
   6652     の方にしかなかったからである。
   6653     また、同時に CTX_RDRI, CTX_RDRH の単語を上から塗りつぶす様にした。
   6654     しかし、やはり予想通り $() の内部などの単語の着色は発生してしまっている。
   6655 
   6656 2017-03-02
   6657 
   6658   * syntax: パラメータ展開・算術式評価内部の quote 除去が為されない状況での _ble_syntax_attr
   6659 
   6660     以下の項目で対応しきれなかった (対応しないことにした) ものをここにまとめる。
   6661     cf. #D0375 "2017-03-02 [2016-08-06] syntax: extquote と "${}" の入れ子に関して"
   6662 
   6663     > - $(()) の中の () のネストに関しては対応していない。
   6664     >   つまり () が一つでも挟まれば quote 除去が有効であるかのように着色される。
   6665     >   →これは対応した。
   6666 
   6667     - $((a['1+1'])) などの添字の quote 除去は有効であるが、現実装では quote の着色はしていない。
   6668       つまり $(('1+1')) などと同様に quote 除去が為されない物として着色を行っている。
   6669 
   6670       これに対応する為には $(()) の中でも [] に対応するネストを判定する様にしなければならない。
   6671       ※一方で [] の中では () に対応するネストの判定はしなくても良い。
   6672 
   6673     - $(("${hello}")) などの構造では CTX_QUOTE の中で自身が有効かどうかを判定して
   6674       自身の着色を変更したりするのは面倒なので、普通に (有効であるかの様に) 着色している。
   6675 
   6676       算術式の場合には quote 除去されないと分かっている時点で文法エラーになるので
   6677       1文字目をエラーの色にするというので良い気がする。
   6678       パラメータ展開の内部の場合には quote 除去されないからと言ってエラーにはならない。
   6679 
   6680     - bash では "${var# ... }" の中の '' は quote 除去される一方で、
   6681       "${var:- ... }" の中の '' は quote 除去されない。
   6682       この実装では取り敢えず quote は除去されるという取り扱いである。
   6683 
   6684       これらについては包括的に振る舞いを調査する必要があるだろう。
   6685       他にも様々な種類のパラメータ展開があるし、
   6686       また将来的に各種類のパラメータ展開についての詳細な構文解析にも対応する可能性がある。
   6687       (特に ${var//a/b} の quote (\?) の取り扱いがややこしいのでこれは視覚的に分かる様にしたほうが良い。)
   6688 
   6689     - 現状では $(("a")) はエラー着色になっているが実は文法的に有効である。
   6690       同じクォートでも $(('a')) や $((\a)) は文法的に駄目。
   6691 
   6692     - Bash 5.1 以降では (('a')) がエラーになる様に文法が変わった。
   6693 
   6694 2016-07-15
   6695 
   6696   * isearch: 現在の履歴内の位置を % で表示しているが、
   6697     これは検索の進捗状況の表示の方が分かりやすいのではないか。
   6698 
   6699   * complete: declare の引数を特別扱いしているがこれも compgen があればそれに従うべきでは。
   6700     もしくは、何か特別な処理をするとしても compgen を介して特別な処理をするべきではないのか。
   6701 
   6702     現状の実装だと、declare などの変数を宣言する組み込みコマンドについて、
   6703     ユーザが complete によって補完の制御を行う事ができない。
   6704 
   6705 2016-07-08
   6706 
   6707   * prompt: 最終行・先頭行に何か表示する機能があっても良い。
   6708 
   6709 2016-07-07
   6710 
   6711   * isearch: 正規表現検索?
   6712 
   6713     →取り敢えず vi-mode で実装した #D0513。incremental ではない。
   6714 
   6715     正規表現で incremental にすると一度通り越したものに一致する可能性があるので直観的でない。
   6716     もし incremental にする需要がある場合には再度考える必要がある。
   6717     因みに、emacs は (分かりにくい動作だが) 現在の位置から続きの検索をする。
   6718 
   6719   * edit: 置換モード (正規表現・固定文字列・globパターン)?
   6720 
   6721     その為には置換前・置換後を入力する欄を別に表示する必要がある。
   6722     入力欄でも様々な binding が使えた方が嬉しい。
   6723 
   6724 2016-06-22
   6725 
   6726   * tui: prompt-toolkit という物がある様だ。ちょっと観察してみるのも良い。
   6727 
   6728     基本的には補完候補を勝手に出すという事と、
   6729     表示の仕方が emacs auto-complete と同様に
   6730     overlay によって実現されているという事。
   6731 
   6732     所で overlay で実現するためには複数行で編集を行っている時に、
   6733     下の行にある内容を記憶しておく必要性が生じる。
   6734     Emacs の場合には表示している内容を完全に内部に保持しているので問題にならなかった。
   6735     (a) 現在の実装で実現するためには内容を完全に記憶するか、そうでなければ
   6736     (b) 複数行で編集を行っている場合には枠の位置・大きさを変更する際に
   6737     毎回下の方にある行を再描画するかといった事が必要になるだろう。
   6738 
   6739     Bash では 2 次元配列を実現するのは辛いので
   6740     結局内容を完全に記憶するというのは余り嬉しくない事だろうか。
   6741     と思ったが、表示領域の幅 (COLUMNS) さえ把握しているのであれば、
   6742     実は 1 次元配列の上に terminal の内容を保持してしまっても問題ない気がする。
   6743     というか枠の大きささえ決まっていれば普通に sub window の様な物も
   6744     bash で実現する事ができる。今まで余り考えたくないとして避けていたことだが、
   6745     この方法ならば楽である。
   6746 
   6747   * tui: GUI Window System を整える? Window を出したり消したりだとかそういう事。
   6748 
   6749 2016-04-05
   6750 
   6751   * tree-enumerate による skip の実装と解析一時中断の不整合に関して。
   6752 
   6753     ble-syntax.sh: ble-syntax/parse/shift.impl2 の問題点である。
   6754 
   6755     現状の方法では、解析一時中断を行った時に shift 対象の高速な列挙が出来なくなる。
   6756     唯一の現実的な高速化手法は "直前非空白要素の位置" を管理するように変更する事である。
   6757     これは解析自体の動作とは全く関係なく、_ble_syntax_tree/stat/nest の配列としてのデータ構造を拡張するという事である。
   6758     解析自体の実装とは直交して実装する事が可能と思われるが、新規情報の管理コストが増えるという問題点が残る。
   6759 
   6760     →一方で tree-enumerate を使った場合には閉じている単語内部の shift を省略できるなどの利点がある。
   6761       最終的にはこれらを組み合わせたような shift が必要になるだろうと考えられる。
   6762       もう少し詳しく考察を行う必要性がある。
   6763 
   6764 2015-12-20
   6765 
   6766   * complete: 履歴を用いた候補生成? 特に単語について。
   6767 
   6768     2018-09-23 これは動的略語展開によって部分的には対応された。
   6769     しかし処理の重さから一度に全ての候補は計算しないし、
   6770     また文法的な単語ではなくて COMP_WORDBREAKS によって分割された単語である。
   6771     これを本当に対応しようと思ったら background でプログラムを
   6772     走らせるなどの事が必要になる気がする。
   6773 
   6774 2015-11-21
   6775 
   6776   * 公開までに追加であった方が良いかも知れない物
   6777 
   6778     + 拡張性の提供 (拡張の仕方の説明)
   6779       + theme の枠組を整える事 (setting files の置き場?)
   6780         ble-color-list
   6781       + 文字コード拡張 (Unicode との mapping)
   6782       + 端末制御コード拡張
   6783         tput からもっと積極的に読み込むべきなのでは?
   6784         cmap/default.sh に加えて cmap/tput.sh 的な物も?
   6785         > minimal.sh, xterm.sh, rosaterm.sh の整理。
   6786 
   6787     + 簡単なキーボードハンドラのサンプル (テトリスとか? 或いは sentaku 再実装とか)
   6788 
   6789       サンプルとしては、端末の出力画面に現れる物よりは、
   6790       画面を altscreen で完全に切り替える物の方が実装しやすいと思われる。
   6791       それでいて、read -t 0 などを有効に使えるとなるとテトリスなどになるだろうか。
   6792 
   6793     + マウス対応
   6794 
   6795     + キーボード入力内容を全部 vbell で表示する方法?
   6796 
   6797 2015-11-06
   6798 
   6799   * まったく同じ nest 状態になると思われるのに解析中断が起こらない
   6800 
   6801     ☆これは表面上は何の問題も起きない。多少無駄な処理をするだけである。
   6802       従ってそんなに対処に緊急を要しない。
   6803 
   6804       | function ble-syntax/parse/nest-equals {
   6805       |   local parent_inest="$1"
   6806       |   while :; do
   6807       |     ((parent_inest<i1)) && return 0 # 変更していない範囲 または -1
   6808     -->     ((parent_inest<i2)) && return 1 # 変更によって消えた範囲
   6809       |
   6810       | local _onest="${_tail_syntax_nest[parent_inest-i2]}"
   6811       | local _nnest="${_ble_syntax_nest[parent_inest]}"
   6812       | [[ $_onest != $_nnest ]] && return 1
   6813     変更によって消えた領域を指している場合は、
   6814     既に消えた領域のデータを捨てているので nest の判定を行う事ができない。
   6815     そんな訳で解析中断はできないと判定されてしまうのである。
   6816 
   6817     ここで解析中断を出来るようにする為には消えた領域のデータも取って置いて、
   6818     その上で全く同じ解析結果になったら解析中断を行う、という事になろう。
   6819     以降の解析の動作に違いがなければ良いのだから
   6820     過去の nest の状態だけが一致していれば解析中断には充分である。
   6821     これは別項目として独立させて残す事にする。
   6822 
   6823     ※問題は解析領域拡大によって i1 が後退する事によって
   6824       変化の無かった部分についても解析結果が消去されてしまう事にある。
   6825 
   6826 2015-08-20
   6827 
   6828   * エラー検出・表示の管理について
   6829 
   6830     現状
   6831 
   6832     現在エラーは様々な方法で使用者に対して提示している。
   6833     解析の途中状態で既にエラーと分かる物については
   6834     _ble_syntax_attr に ATTR_ERR を設定している。
   6835     これは _ble_highlight_layer_syntax1_table を経由して表示の着色に反映される。
   6836     もう一つのエラーの種類は入力したコマンドラインの末端で入れ子が閉じていない物である。
   6837     これは一番最後の文字と対応する入れ子の開始点の色を変更する事によって提示する。
   6838     この着色は解析点より前に対して行われるので部分更新の対象とする事は難しい。
   6839     従って _ble_highlight_layer_syntax3_table を介して、毎回全消去・再計算を実行している。
   6840 
   6841     以下に改善したい箇所について列挙する。
   6842 
   6843     - この様に複数の方法を用いてエラーを提示しているのは少し醜い。
   6844       もう少し統一した枠組を作っても良いのではないかという気がする。
   6845 
   6846     - ATTR_ERR を用いて設定したエラーは、
   6847       後の処理で追加される単語毎の着色によって上書きされてしまう。
   6848       つまり、折角エラー通知の為に着色を設定していても使用者に見えない事がある。
   6849       別の場所にエラーを登録しても良いのではないかという気がする。
   6850 
   6851     - 各エラー項目に対して何が問題なのか・何のエラーなのかのメッセージを設定したい。
   6852       これらのメッセージも枠組の中で管理して、カーソルの位置に応じて表示できる様にしたい。
   6853 
   6854     もう少し現状について調べて実装の方法について考える。
   6855     先ずエラー情報を記録する為の配列の形式について。
   6856     既存のエラー着色に使っている配列 _ble_highlight_layer_syntax3_table が気になる。
   6857     これを拡張する形で実装する事はできないだろうか。。
   6858     →この配列は部分更新できないような情報を保持するのに使っている。
   6859       部分更新できない様な着色であっても今回の実装によって
   6860       よりましな方法に変更できるのではないか、という気もするが、
   6861       それは今回の実装が終わってから考えれば良い事である。
   6862       (初めからその様な物にも対応できる様に今回の実装を設計するという事も出来るが
   6863       複雑になるので、取り敢えずは何も考えずに実装する事を目指す。)
   6864 
   6865     つまり、_ble_highlight_layer_syntax3_table は non local な着色の為に使うとして残し、
   6866     それとは別にエラーを管理する為の配列を作成する。
   6867 
   6868     部分更新の際の効率を考えると _ble_syntax_attr と同様に、
   6869     編集文字列中の位置を配列のインデックスとする方法が良さそうに思われる。
   6870     然し一方で、エラーの数はそんなに沢山になるとは考えがたい (sparse) なので、
   6871     リストにして管理するという方針も考えられる。どちらの方が良いだろうか。
   6872     リストにしている場合、"エラー設置点 エラー開始点 エラー終了点 メッセージ" というデータ形式になるだろうか。
   6873     shift や解析中断後の再開に際してはエラー設置点を用いた filtering を行う。
   6874     % このエラー情報の内容は解析の動作に全く影響を与えないし、
   6875     % 解析が同じように進めば全く同じエラー情報を生成すると期待できるので、
   6876     % 解析中断の判断基準に含める必要はないと考えられる。
   6877     →本当だろうか。エラー開始点・終了点などの情報は解析状態が同じになっても異なる値になりうるのでは?
   6878       特に、現在 _ble_highlight_layer_syntax3_table で管理している物はその最たる例である。
   6879       ここで、エラー開始点・終了点が正しく設定される為には次の条件が必要である。
   6880 
   6881       エラー設置点を p1 とする。ble-syntax/parse の 1 step で i=i1 から
   6882       i=i2 まで進む (但し i1 <= p1 < i2) 時、エラー開始点 p2, 終了点 p3 は、
   6883       i1 <= p2 < p3 < i2 を満たす。
   6884 
   6885       この条件が揃っている時のみに現状の解析中断条件で部分更新安全である。
   6886       因みに p2, p3 を設置点からの相対位置で記録しておけば shift の操作が必要なくなるのでその様にするべきである。
   6887 
   6888 2015-08-16
   6889 
   6890   * 入れ子構造を考慮に入れた効率的な単語着色
   6891 
   6892     現状: 新規生成単語及び消滅単語の範囲 (range1) に関して再度単語の着色を実行する。
   6893 
   6894     x 但し、着色は "消滅単語の存在していた範囲" 及び "新規生成単語登録位置の範囲"
   6895       に登録されている単語及びその子孫だけになっている。
   6896       本来は、range1 に被さっている全ての単語について処理を実行するべきである。
   6897 
   6898     - 考慮に入れるべき事として、将来的に解析を途中で停止した場合でもそれなりに動くような方法がよい。
   6899       しかしながら未だ解析を終えていない部分については結局どうしようもないから、
   6900       解析が完了している部分文字列について木構造を作成して処理する事になるだろう。
   6901       結局、現在 shift を実行するのに用いているのと同じ事をする事になる。
   6902       (そしてそれは tree-enumerate/.initialize で実装されているので余り気にする事はない。)
   6903 
   6904     方法
   6905 
   6906     a 一つの方法は tree-enumerate を使用して末端から順に単語の範囲をチェックしていく方法である。
   6907       つまり、現状の shift の実装と同じになっている。
   6908 
   6909     b もう一つの方法は、先に単語の木構造の情報だけ構築してから、
   6910       range1 に対応するノードを列挙して構築する方法である。
   6911       木構造として親ノードの位置・子ノードの配列を保持していれば、
   6912       指定した範囲に対応するノードの範囲を効率的に計算する事が出来る。
   6913 
   6914       ただし、木構造の情報の構築自体にどれだけのコストがかかるかについて考える必要がある。
   6915       木構造は後ろから掘り出すようにして実行する為、
   6916       更新範囲の beg から文字列の末端 iN 迄を完全に構築し直す必要がある。
   6917       部分更新するというのが難しいと思われる。
   6918 
   6919       しかし、部分更新は全くできないのでは等と考えていたが、
   6920       考えてみると意外と部分更新も出来るのではないかという気になってくる。
   6921       更新範囲に含まれていないノードの内部構造に関しては実は更新の対象ではない。
   6922       また、更新範囲より前にあるノードの内部構造についても同様である。
   6923       但し、親ノードの位置は、更新範囲より前にあるノードであっても更新する必要がある。
   6924 
   6925     c 或いは、parse の過程でより分かり易い木構造データも同時に構築してしまうという手もある。
   6926 
   6927       x parse の内部状態を増やせば増やす程、解析中断が難しくなるが
   6928         最終的に構造を再構築するのであれば結局中断してもしなくても同じかも知れない…?
   6929         しかしながら木構造を考えずに parse した後、木構造に対する更新を行った方が処理量は少なくなるはずである。
   6930         というのも木構造を考えながら parse する事にすると、
   6931         更新の必要のない文法的処理も木構造の構築と同時に実行してしまうからである。
   6932         それよりは、文法的処理で必要最低限の所を parse で処理して、
   6933         木構造の構築について必要最低限の所を後の処理で実行する、という形の方が良さそうである。
   6934 
   6935       o ただ、parse の過程で木構造も一緒に構築するようにした方が、
   6936         データ同士の依存関係が整理されて良いという側面もある。
   6937         parse の後で木構造としてどの範囲を更新するべきかを決定するのは面倒でありバグを生む原因にも成る。
   6938         →parse の後で処理をする際にも何らかの "原則" を決めてその下で実装するなどした方が良いと思う。
   6939         (逆に言えば上手に原則を決める事さえ出来れば、parse で木構造を構築する事の利点はなくなる。)
   6940 
   6941 
   6942     入れ子構造の実装後に改善できる箇所
   6943     - tree-enumerate-in-range 及びその呼出元
   6944       現在は愚直に範囲内に設置されている単語識別子を
   6945 
   6946 2015-08-15
   6947 
   6948   * syntax: `function ...' において関数名の部分に使用した履歴展開を解釈する?
   6949     履歴展開だけを解釈する新しい文脈が必要になると思われる。
   6950 
   6951     然し乍ら、履歴展開の結果として複数の単語になる場合などを考えると、
   6952     そもそも一つの単語として読み取って良いのかなど疑問点が残る。
   6953 
   6954     % 或いは、その場で履歴展開としての妥当性を検証して色をつけてしまうという手もある?
   6955     % →これだと正しく解釈されない。例えば履歴展開には $ が含まれて良いが関数名には $ が含まれないので、
   6956     %   先に関数名としての切り出しを実行すると $ の直前で不正に関数名が中断する事になる。
   6957 
   6958 2015-08-14
   6959 
   6960   * 高速化: ble-syntax/parse: より厳密な shift 範囲の特定・省略?
   6961 
   6962 2015-08-11
   6963 
   6964   * 今後必要になる大きな書換・再実装は2つある:
   6965     1 コマンドライン着色の効率的方法の模索
   6966     > 2 shift の高速化の為の _ble_syntax_word, etc. のデータ構造の変更
   6967 
   6968 2015-02-24
   6969 
   6970   * layer の仕組みに対する問題提起
   6971 
   6972     | 現在の実装では各レイヤーは下のレイヤーが提供した文字配列を弄る事によって動作している。
   6973     | しかし、実の所受け継ぐのは文字配列ではなくて描画属性の配列の方が良いのではないだろうか。
   6974     |
   6975     | o 先ず第一に実装の簡便さがある。
   6976     |
   6977     | o 次に、更新範囲というのは複数のレイヤーで似たような箇所になりがちなのではないかと思う。
   6978     |   属性の配列で渡して置いてから一番最後の所で更新範囲に対して切り貼りをして文字配列を構築した方が良いかも知れない。
   6979     |
   6980     | x ただ、文字配列にするという事の利点も存在する。
   6981     |   region 等の様に大域的に色を一時的に変更する様な物の場合、
   6982     |   文字配列として region の下層にあるレイヤーについて記録を行っておく事は有意である。
   6983     |   選択が解除された時に再び構築し直すというのは時間が掛かる。
   6984     |
   6985     |   但し、その様な動作をする物は限られている様にも思われる。
   6986     |   殆どの場合には纏まった箇所でコンパクトに更新が行われる。
   6987     |
   6988     | x 括弧の対応などの場合、まとめて描画属性から文字列を構築する場合に細かい最適化が出来ない。
   6989     |
   6990     |   複数のレイヤーの描画属性の配列からまとめて文字列を生成する場合、
   6991     |   複数のレイヤーが報告した更新範囲を総合してその範囲で文字列を再生成する事になる。
   6992     |   しかし、括弧の対応など、実際の変更が小規模に渡るにも拘わらず、
   6993     |   離れた二点で実施される色付けの場合には、変更の実体に反して範囲が拡大する。
   6994     |
   6995     |   今迄の様に文字列を各層で構築する方式の場合には、
   6996     |   更新を各層の関数の中で自由に行う事ができるので、
   6997     |   自身の変更の update に関しては最適な方法で更新する事ができる。
   6998     |
   6999     |   とはいいつつも更に上のレイヤーに渡す更新範囲はやはり巨大な物になる為、
   7000     |   上のレイヤーでの合成作業が大域に渡る事は考えておかなければならない。
   7001     |   実のところ合成作業についてはちゃんと実装していない。
   7002     |   region に関しては可能な限り最適な方法になる様に実装したが滅茶苦茶複雑になった。
   7003     |   実際の実装では被覆によって隠される更新などについては考慮に入れなくても良いが、
   7004     |   複雑になりそうだという事に代わりはない。
   7005     |   結局、内部的に描画属性の配列を持って更新に望まなければならないという事態になりそうだ。
   7006     |
   7007     | 何れにしても現在の実装は、今後拡張していく上で非現実的な感じがする。
   7008     | ベースを (下層の情報を含まない) 描画属性の配列を上流に渡す方法に変更した方が良いのではと思う。
   7009     | region 等の実装の際には cache を行う様にする等の工夫をその上で実装する様にしてみたい。
   7010     |
   7011     | また、実装が複雑になるが仕様がない。
   7012     | 取り敢えず現在の所まともに着色を行っている所が syntax だけなので、
   7013     | これを ble-highlight-layer:syntax に対応する上で考えてみる。
   7014     |
   7015     | ble-highlight-layer:syntax の内部で三つの描画属性の配列を用意し、
   7016     | これらの三つの描画属性の配列を総合する事で文字列を構築する様にしてみた。
   7017     | 可もなく不可もない感じの実装である。
   7018     | 少なくとも各層で文字列を構築する様な実装はしたくない。
   7019     | これぐらいが丁度良い実装の複雑さである様に思う。
   7020 
   7021     将来的には描画属性の配列で対応できる様にする。
   7022 
   7023 2015-02-23
   7024 
   7025   * bleopt_suppress_bash_output 制限
   7026 
   7027     - SIGWINCH (ウィンドウサイズ変更) の時に bash の表示する物になってしまう
   7028 
   7029   * 描画ちらつき: DCH や ICH 等を用いた効率化?
   7030 
   7031 2015-02-18
   7032 
   7033   * エラーメッセージの設定を可能にする
   7034 
   7035 2015-02-16
   7036 
   7037   * syntax: ToDo
   7038 
   7039     - [[ 条件式の文法。より正確に。特に括弧の入れ子。
   7040 
   7041       →括弧の入れ子というのはどういう意味であったか?
   7042       今試してみた所括弧の入れ子などは関係なく ]] が来れば条件コマンドは終了とみなされる様である。
   7043       例えば $ [[ ( [[ == ]] ) ]] は構文エラーになる。初めの ]] で条件コマンドが終了と解釈される為である。
   7044 
   7045 2013-06-10
   7046 
   7047   * sword で quote を正しく処理する?
   7048     これは少なくとも解析器が出来た後に考える。
   7049 
   7050 2013-06-01以前
   7051 
   7052   * ble-decode
   7053     + [kbd] terminfo からの読み取り (entry 名は tmux が参考になる)
   7054     * ble-bind: -s オプションで文字入力の羅列を指定できる様にする (2019-02-10 #D0915 で実装)
   7055 
   7056   * 説明書
   7057     + 文字コード decoder の追加方法
   7058     + keysequence を指定する文字列の文法 (2018-09-23 done)
   7059     + スタイルを指定する文字列の文法 (2018-09-23 done)
   7060 
   7061     取り敢えず GitHub の Wiki 上に作る事にした。
   7062 
   7063 
   7064 *******************************************************************************
   7065     Done (実装ログ)
   7066 -------------------------------------------------------------------------------
   7067 
   7068 2023-10-01
   7069 
   7070   * canvas: Unicode 15.1.0 対応 [#D2078]
   7071 
   7072     対応してみたのは良いが GraphemeCluster でテストが失敗する様になった。U+924
   7073     がどうも GraphemeClusterBreak では通常文字という事になっているが、test では
   7074     extend であるかの様な振る舞いを要求する様になっている。どういう事だろうか。
   7075 
   7076     先ず GraphemeBreakProperty.txt に関しては 15.0.0 と 15.1.0 で変化はない。一
   7077     方で GraphemeBreakTest.txt に関しては大幅に追加されている。その中で U+924
   7078     に関しては combining とされている。と思ったが違った。どうも間に挟まっている
   7079     文字が何か新しい規則に組み込まれた様だ? 何やらおかしな property が割り当て
   7080     られている気がする。
   7081 
   7082     Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj
   7083 
   7084     うーん。UAX #29 の変化を調べてみると実は 15.1.0 で新しく色々と追加されてい
   7085     るという事が分かった。これはまた対応に時間がかかりそうだ。
   7086 
   7087     * InCB=Linker 及び InCB=Extend の直前で切れてしまうのではないか疑惑
   7088 
   7089       現在の Unicode の定義だとInCB=Consonant | InCB=LinkerEx が離れるし、
   7090       InCB=LinkerEx | InCB=LinkerEx も離れるのではないか?
   7091 
   7092       或いはちゃんと InCB=Linker や InCB=Extend は Extend でもあるのだろうか?
   7093       generate-table.sh では検出できていないから InCB={Linker,Extend} は何の
   7094       GraphemeClusterBreak も持っていないのではないかと疑われる。ZWJ も
   7095       InCB=Extend に含まれていそうなのに検出できていないのは何故?
   7096 
   7097       →と思って改めて確かめて見た所、どうやらちゃんと検出して沢山エラーが発生
   7098       していた。改めて確認する必要がある。重複は Extend と ZWJ のみで発生してい
   7099       る。また、全ての InCB=Linker 及び InCB=Extend は同時に Extend または ZWJ
   7100       でもあった。特に ZWJ は InCB=Extend であった。つまり、以下の様な三種類に
   7101       分類する事ができる。
   7102 
   7103       - Extend (1) InCB=None
   7104       - Extend (2) InCB=Extend
   7105       - Extend (3) InCB=Linker
   7106       - ZWJ        InCB=Extend
   7107 
   7108     * 結局 GraphemeCluster の中に Indic_Conjunct_Break も埋め込まれた形になって
   7109       しまったので、IndicConjunctBreak のテーブルは最早不要の気がする。
   7110 
   7111       * 既に実装した分について IndicConjunctBreak を参照しない形に書き換える→
   7112         書き換えた。簡単だった。
   7113 
   7114       * 本当に GraphemeClusterBreak だけで実装できるのか確認する。実際に実装し
   7115         てみる。
   7116 
   7117       * 以下はもう使わなくなった IndicConjunctBreak を取得するコード。
   7118 
   7119         後で使いたくなった時の為に何処かに取っておいた方が良いだろうか。うーん。
   7120         然し、これはほぼ GraphemeCluster/c2break と実装は同じなので敢えて分かり
   7121         やすい所に取って置く必要もない。なので、ここに残しておくだけにする。
   7122 
   7123         | #%< canvas.IndicConjunctBreak.sh
   7124         |
   7125         | function ble/unicode/IndicConjunctBreak {
   7126         |   local code=$1
   7127         |   ret=${_ble_unicode_IndicConjunctBreak[code]}
   7128         |   [[ $ret ]] && return 0
   7129         |   ((ret>_ble_unicode_IndicConjunctBreak_MaxCode)) && { ret=0; return 0; }
   7130         |
   7131         |   local l=0 u=${#_ble_unicode_IndicConjunctBreak_ranges[@]} m
   7132         |   while ((l+1<u)); do
   7133         |     ((_ble_unicode_IndicConjunctBreak_ranges[m=(l+u)/2]<=code?(l=m):(u=m)))
   7134         |   done
   7135         |
   7136         |   ret=${_ble_unicode_IndicConjunctBreak[_ble_unicode_IndicConjunctBreak_ranges[l]]:-0}
   7137         |   _ble_unicode_IndicConjunctBreak[code]=$ret
   7138         |   return 0
   7139         | }
   7140         |
   7141         | ## @fn ble/unicode/IndicConjunctBreak/get-left str index [opts]
   7142         | ##   @var[ret] InCB 参考特性の値を返します。
   7143         | ##   他は ble/unicode/GraphemeClusterBreak/s2break-left と同じです。
   7144         | function ble/unicode/IndicConjunctBreak/get-left {
   7145         |   local s=$1 i=$2 opts=$3
   7146         |   if [[ $opts != *:code:* ]]; then
   7147         |     local code
   7148         |     opts=$opts:code
   7149         |   fi
   7150         |   ble/unicode/GraphemeClusterBreak/s2break-left "$s" "$i" "$opts"; local ext=$?
   7151         |   ble/unicode/IndicConjunctBreak "$code"
   7152         |   return "$ext"
   7153         | }
   7154 
   7155   * ext/fzf: $() は blink-matching-paren on の時 `` より遅い [#D2077]
   7156     https://github.com/junegunn/fzf/commit/e0b29e437be458066fca4dab39b282dfc11466f6
   7157 
   7158     という謎情報があるが GitHub のエラーで現在ページが見えない。
   7159 
   7160     →これは単に fzf の実装が bind マクロを通じて実装されている為に、$() が実際
   7161     にマクロで入力される文字列の中に含まれていると blink-matching-paren on の時
   7162     に bash が sleep を挟んで一致する括弧の highlighting を実行するという話だっ
   7163     た。
   7164 
   7165     そもそも ble.sh では blink-matching-paren に対応していないし、対応するとし
   7166     ても delay は入れない様にするだろうし、またマクロを通じた実装もできるだけ避
   7167     ける様にしたい (とは言いつつ bash-3.? with ble.sh で fzf key-bindings を使
   7168     おうとすると結局マクロによって文字列を入力する様になる)。
   7169 
   7170   * canvas: ジョン 等の文字列の幅が端末と整合していない [#D2076]
   7171 
   7172     "ジョン" 文字幅が正しく計算されていない。emacs はちゃんと処理できている様だ。
   7173     つまり、規則に従うと濁点は前の文字に吸収される事になっているが実際にはそう
   7174     ではないという事。これは規則の穴として処理するべき事の気がする。
   7175 
   7176     →実際に ble/util/s2w で計測してみた所、幅3という事になっている。そもそも何
   7177     故そのような事になっているのだろうか。処理を確認する。うーん。grapheme
   7178     cluster として読み取っている。そしてその grapheme cluster の大きさを台字の
   7179     大きさをそのまま返す様にしているのが問題の様である。
   7180 
   7181     ? そもそも他の端末では正しく実装できているのだろうか (もしくはどの様に実装
   7182       しているのか)
   7183 
   7184       →うーん。他の端末ではちゃんと濁点も幅を持って描画されるし、論理的にも内
   7185       部では半角の幅を持って計算されている様である。更に言うならば行末での振る
   7186       舞いを見る限りは grapheme cluster としての認識もされていない。
   7187 
   7188       xterm, terminology, lxterminal で確認した。可能な限り Unicode に書かれて
   7189       いる物をそのまま実装しようとしている kitty ですらも半角カナの濁点・半濁点
   7190       に関しては GraphemeCluster の Extend ではなく独立した文字として行折返し等
   7191       を処理している様だ。
   7192 
   7193     つまり、そもそも grapheme cluster として取り扱わない様に修正するべきである。
   7194     念の為、濁点がどの様なカテゴリになっているのかについて確認する。
   7195     ble/unicode/GraphemeCluster/c2break の出力を確認すると濁点は
   7196     GraphemeClusterBreak Extend という事になっている。
   7197 
   7198     [修正方法]
   7199 
   7200     make/canvas.emoji.sh を確認してみると中で _ble_unicode_GraphemeClusterBreak
   7201     に値を設定しているので、これに倣って値を上書きして良いのではないかという気
   7202     がする。周辺の文字で Extend になっている文字の一覧を見ることができれば良い。
   7203     元にしているデータベースの方を先ずは確認する
   7204 
   7205     * 元にしているデータの時点で Extend になっている。
   7206 
   7207     * 半角カナ周辺では濁点と半濁点だけが Extend になっている様に見える。
   7208       FE20..FE2F に combining ligature というのがあるが、これは明示的に前の文字
   7209       を修飾する物なので、半角カナの様な特別な取り扱いは不要である。
   7210 
   7211       →取り敢えず半角カナの濁点と半濁点だけを修正の対象とする事にする。
   7212 
   7213     * recjt: もう一つ気づいた事は、元の GraphemeClusterProperty.txt では一緒に
   7214       GeneralCategory も表示していてカタカナの濁点・反濁点は Lm になっていて他
   7215       の Extend と異なっている。或いは、GeneralCategory が L? の時には特別扱い
   7216       して表を修正するという事も考えたがそれはやめておく事にする。
   7217 
   7218       x 勝手に GraphemeClusterBreak を変更すると他の用途で参照した時に変更され
   7219         たデータベースを参照する事になって混乱の元である。
   7220 
   7221       x Extend / L? が全て同様の取り扱いで良いのか分からない → と思ったが
   7222         "Extend # L" で検索してみると半角カナの濁点・反濁点しか存在しなかった。
   7223         そういう意味で GeneralCategory と組み合わせて判定しても良いのかもしれな
   7224         い、と思ったがそもそも処置が必要な文字が半角カナしか現状で存在しないの
   7225         であれば、無闇に将来追加されるかもしれない他の Extend # L? にも影響が出
   7226         る様な実装にするべきではない。
   7227 
   7228     * 因みに make/canvas.emoji.sh の中で多くの端末で例外的な振る舞いとなってい
   7229       る 0x1F3F{B..F} の範囲の文字についても、この際、既定で修正を加える様にで
   7230       きないだろうか。
   7231 
   7232     2023-10-01 手で弄る様にしたら Unicode の例から自動生成したテストが失敗する
   7233     様になってしまった。将来的な事を考えると端末毎に修正した
   7234     GraphemeClusterBreak を切り替えたりする事なども考えられるので、直接元の
   7235     GraphemeClusterBreak を弄るのも避けるべきだろうか。代わりに
   7236     _ble_unicode_GraphemeClusterBreak_custom という配列に修正した
   7237     GraphemeClusterBreak を記録する事にした。
   7238 
   7239     x これにより多少 GraphemeClusterBreak を読み取る時間が伸びてしまうのではな
   7240       いかと思うが、ASCII に関しては処理をスキップして効率化しているので余り気
   7241       にしなくても良い気がする。
   7242 
   7243 2023-09-20
   7244 
   7245   * complete: auto_complete 内容を入力しきっても auto_complete mode の中にいる [#D2075]
   7246 
   7247     auto_complete 候補が全然ないのに何故か auto_complete mode に入っている気が
   7248     する? 何故? と思って改めて調べてみたが特に enter が呼び出されている気配はな
   7249     い。
   7250 
   7251     提示された文字列が全てユーザーによって入力された時に auto_complete mode
   7252     から抜ける機能は実装されていないという事だろうか。うーん。然し、既に
   7253     auto_complete mode に入った状態だったのだからそのままでも良い気がする。と
   7254     思って実装を確認したら既に同じ状態になったら自動的に抜ける様に処理してい
   7255     る気がする。と思ったら実装が変だ。修正する事にする。
   7256 
   7257     これは ble-0.3 にも影響するので独立した項目にしたほうが良い。
   7258 
   7259 2023-09-18
   7260 
   7261   * layer: pattern で指定する layer に対するリクエスト (requested by johnalotoski) [#D2074]
   7262     https://github.com/akinomyoga/ble.sh/discussions/362
   7263 
   7264     問題は効率よく実装できるかという事。部分更新ができれば良いが簡単かどうか分
   7265     からない。
   7266 
   7267     また、一個のパターンもしくは有限個のパターンしか登録できないのは困る。
   7268 
   7269     a 一つの layer で一つの pattern という事にして複数のlayer を登録する事を想
   7270       定するとますます遅くなる様な気がするし、またパターンを増やす毎に layer 定
   7271       義の clone をしなければならくなり、また記録対象に関しても prefix 等を使っ
   7272       て load/store しなければならくなり効率が悪くなり、管理が面倒になる。
   7273 
   7274     b 一方で、一つの layer で複数の pattern に対応しようとすると実装が複雑にな
   7275       る。結局合成の処理は実装しなければならないし、部分更新を考えるのだったら
   7276       結局各 pattern について前回の一致を記録する必要がある。そうでなくても全部
   7277       記録してそれから調べるという事になる気がする。
   7278 
   7279     またどうせ実装的には region の複数 region 対応と同じ様な実装になる様な気が
   7280     するので実装を共有する事ができる様な気がする。multi-range 的な base layer
   7281     として実装するのが良い気がする。だとすれば結局 store/load 的な事はしなけれ
   7282     ばならないので a の方針でも良いのではないかという事になってくる。
   7283 
   7284     但し、実質的に a 的な実装になるとしても layer の配列に登録するのが面倒とい
   7285     う事を考えると b 的な内部インターフェイスにするというのは可能性としてありで
   7286     ある。その場合には複数 layer をまとめる機能として実装するのか sublayer 的な
   7287     物として実装するのか区別するのが良い。
   7288 
   7289     * 入れ子の配色パターンを指定したり、一致の仕方によって色を切り替える事がで
   7290       きるようにしたり、より高度な指定を考えることはできるだろうか。
   7291 
   7292       これを突き詰めていくと実質 parse に近い事ができてしまう様な気もするが、そ
   7293       うなった場合既存の構文解析の実装とどちらの方が良いのかという事にならない
   7294       か? と思ったが、さすがに既存の構文解析の方は無限の階層を作ることができる
   7295       し (単なる正規表現ではできない) 効率に関しても single pass (既存) と
   7296       multi pass (入れ子着色) なので既存の方法の方が速いだろう。
   7297 
   7298     取り敢えず region の実装をコピーして観察してみるのが良い気がする。と思った
   7299     が、今回実装しようとしているのは部分更新も必要になってくるので単に region
   7300     の実装を一般化するだけでは全然足りない。やはり一から実装し直した方が良いの
   7301     ではないかという気もする。
   7302 
   7303     ? うーん。正規表現を採用している限りは部分更新は不可能なのではないか。例え
   7304       ば a(.{9}x)? というパターンに対して、前回の文字列が a2a4a6a8a0z だったと
   7305       すると (0-1 2-3 4-5 6-7 8-9) という一致になる。z を x に書き換えると
   7306       dirty range は 10-11 だけであるが、最終的な一致は (0-11) にならなければな
   7307       らない。つまり、dirty range が幾ら後ろの方にあったとして、既に確定してい
   7308       る一致が幾つあったとしても、それらを上書きする形で新しい一致が現れる可能
   7309       性を常に排除できない。
   7310 
   7311       正規表現の表現能力が高すぎるからだろうか。先ず、extglob の時にも同様の事
   7312       が当てはまる。
   7313 
   7314       glob (extglob なし) の時にはどうだろうか。* の最長一致を考える事にすると
   7315       やはり問題は起こる気がする。但し、複数のパターンを跨いで遡らなければなら
   7316       ないという事はない。単一のパターンしか考えていないのであれば。然し、今後
   7317       の拡張性などを考えると単一の単純 glob パターンだけで着色を行うというのは
   7318       制限が大きすぎる。それにそんなに便利そうではない。
   7319 
   7320       glob の最小一致という事にしておけば一度確定した一致は内容が変わらない限り
   7321       は安定である。これに関しては複数パターンを組み合わせたとしても論理的な問
   7322       題は生じなさそうである。一方で、複数パターンを組み合わせた実装にする為に
   7323       は「各位置についてそれぞれパターンを試して行く」か「全てのパターンについ
   7324       て最近接で次に現れる位置を計算して一番近い物から順に適用していく」などの
   7325       実装を行う必要が出てくる。前者は重すぎて駄目であり、後者は余りに複雑であ
   7326       る。
   7327 
   7328       などの事を考えると、表現力においても実装の複雑さや効率においても、正規表
   7329       現を使うのが妥当と思われる。部分更新を諦める必要はあるがその方がすっきり
   7330       して良いのかもしれない。
   7331 
   7332       取り敢えず単一正規表現の場合について考えれば良い。毎回先頭から末尾まで正
   7333       規表現で範囲を抽出する事にする。
   7334 
   7335     * done: 先ずは着色範囲を決定する必要がある。
   7336 
   7337       取り敢えず実装した。着色範囲を決定したら後は region を拡張する形で実装し、
   7338       一般化も行った。と言っても region との違いは各 selection に色を割り当てら
   7339       れるという事と、複数の selection が接している可能性があるという事。然し、
   7340       それだけだと速度的に遅くなってしまうかもしれないので、範囲決定について複
   7341       数 selection がある場合でもちゃんと各要素について検査する様にした。
   7342 
   7343       動いている気がする。region も新しい枠組みの方に乗り換える事にした。少し修
   7344       正した。ちゃんと動いている気がする。
   7345 
   7346     * done: later:{pattern} として実装した。これを呼び出して使う様にすれば良い。
   7347 
   7348     * done: _ble_highlight_layer__list は _ble_highlight_layer_list に改名する。
   7349 
   7350     * done: 使い方を簡単に base.pattern.bash の中にも記述する。例を config の中
   7351       に入れようかとも思ったが単純すぎるのでわざわざ登録する程でもないだろうか。
   7352 
   7353     * done: base.pattern.bash から pattern.bash に変える
   7354 
   7355       {pattern} という名前にしたがこれを継承して新しい layer を定義するという訳
   7356       でもないから pattern にした方が良い? と思ったが、ユーザーからは見えないだ
   7357       けで内部的にはこれから派生した layer を自動的に定義している。そういう意味
   7358       で {pattern} という名前は OK。
   7359 
   7360       一方でファイル名が base.pattern.bash になっているが、これについては
   7361       pattern.bash で良いのではないかという気がする。ユーザーが明示的に自分で派
   7362       生する事は想定していないのだから。
   7363 
   7364     * done: うーん。zsh syntax highlighting の highlighter を見たら pattern が
   7365       glob で regexp が正規表現を使った物である様だ。なので regexp に改名するべ
   7366       きではないだろうか。一方で glob を用いた実装についても考える余地がある。
   7367       但し、glob を用いた物は単に正規表現に変換して適用すれば良いだけの気がする
   7368       が。
   7369 
   7370       https://github.com/zsh-users/zsh-syntax-highlighting/tree/master/highlighters
   7371       https://github.com/zsh-users/zsh-syntax-highlighting/tree/master/docs/highlighters
   7372 
   7373       glob に関しては最長一致と最短一致の二種類が考えられる。色々考えると実装は
   7374       似た様な物になるだろうし一緒に実装してしまった方が良い気がする。
   7375 
   7376       →結局 {pattern} で regexp/glob 全てに対応する事にした。
   7377 
   7378     * done: 現在の実装だと regex を追加した順序が保たれないのではないか→これは
   7379       修正した。独立した配列に順番に記録する。
   7380 
   7381     * done: auto_complete で仮挿入されている物に対してまで着色パターンが適用さ
   7382       れている。仮挿入部分に対しては一致するべきではないのではないか。仮挿入部
   7383       分を削除した物に対して選択範囲の決定を行って、その後で sel の中身を修正す
   7384       る事にする。
   7385 
   7386       と思ってその様に実装してみたら更新されない事がある。どうやら
   7387       auto_complete で予想された内容と同じ内容しか入力していない場合には DMIN<0
   7388       になるので処理がスキップされてしまう。処理は前回の text の内容と一致する
   7389       時にのみスキップするべきなのである。その様に実装した。
   7390 
   7391       →前回の text を記録していて問題になる可能性はあるか? もしそれで問題にな
   7392         るのであればその他のあらゆる情報の記録で問題が発生する可能性がある気が
   7393         するので気にしない事にする。
   7394 
   7395     * done: やはり /initialize-vars と /declare は分離するべきでは?
   7396       /initialize-vars で VARNAMES がクリアされてしまうのは都合が悪い。といって
   7397       毎回全て構築するのも無駄な処理の気がする。
   7398 
   7399 2023-09-17
   7400 
   7401   * memo: テストに使用した bashrc を独立させる [#D2073]
   7402 
   7403     色々の試行錯誤が bashrc の中に溜まっていくが後で参照する為に、各議論項目に
   7404     対応する bashrc を残したい。各番号に割当を行う事にする。
   7405 
   7406     また一つの番号で複数ファイル memo/ 以下にあるものについてはまとめたい。二つ
   7407     だと微妙だが三つ以上は全部まとめる事にする。note.txt や done.txt の中に参照
   7408     がある場合にはそれも更新する (といってもほんの少ししかなかった)。
   7409 
   7410   * global: make scan したら問題が沢山出ている [#D2072]
   7411 
   7412     久しぶりに実行したら問題が沢山あるので修正する。今まで test-*.sh を検査の対
   7413     象にしていなかったのを含めたのが原因の一つである。ble/test に指定しているコ
   7414     マンドの中では builtin の使用に対するチェックを省略する事にした。他に累積で
   7415     様々の見落としができていたので修正した。
   7416 
   7417   * github: windows-latest で CI テストが失敗する問題 [#D2071]
   7418     https://github.com/akinomyoga/ble.sh/pull/363 test
   7419 
   7420     symbolic link の振る舞いが変わってしまっている。手元の mingw を更新して振る
   7421     舞いを確認してみることにする。msys2 で pacman で最新版に更新する。エラーは
   7422     発生しない。という事は github のテスト環境だけで起こる問題なのだろうか。
   7423 
   7424     * それとは別に interactive session で ble check bash すると履歴展開の振る舞
   7425       いで結果が異なる事に気付いた。これについても修正しなければならない。
   7426       interactive session と外で history -p の振る舞いが違うのだろうか。
   7427 
   7428       $ export q=\' line='$'$q'\'$q'!!'$q'\'$q
   7429       $ bash -Hc 'builtin history -s histentry; builtin history -p "$line"'
   7430       $'\'!!'\'
   7431       $ bash -c 'builtin history -s histentry; builtin history -p "$line"'
   7432       $'\'histentry'\'
   7433       $ (set -H; builtin history -s histentry; builtin history -p "$line")
   7434       $'\'!!'\'
   7435       $ (set +H; builtin history -s histentry; builtin history -p "$line")
   7436       $'\'!!'\'
   7437       $ builtin history -s histentry; builtin history -p "$line"
   7438       $'\'!!'\'
   7439       $ set +H; builtin history -s histentry; builtin history -p "$line"; set -H
   7440       $'\'!!'\'
   7441 
   7442       よく分からないが -H のコマンド実行の時にだけ問題が生じる様だ。他の文脈で
   7443       は -H をつけても外しても問題の振る舞いは見られない。
   7444 
   7445       更に別の version も調べてみたら振る舞いは色々の様だ。
   7446 
   7447       bash -c xxx  3.0 展開失敗; 3.1..dev 展開
   7448       bash -Hc xxx 3.0 展開失敗; 3.1..4.0 展開, 4.1..None
   7449       (xxx)        3.0 現在コマンドに展開; 3.1..4.0 展開; 4.1..None
   7450       (set +H;xxx) 3.0 現在コマンドに展開; 3.1..4.0 展開; 4.1..None
   7451 
   7452       xxx = builtin history -s histentry; builtin history -p "$line"
   7453 
   7454       Note: bash -c '(xxx)' および bash -Hc '(xxx)' はそれぞれ () のない場合と
   7455       振る舞いは同じだった。
   7456 
   7457       然し、この振る舞いは現在観測している振る舞いと一致していない? と思ったが、
   7458       スクリプトとして実行する場合にはちゃんと動いているというという事はスクリ
   7459       プトとして実行している時は bash -c と一緒の振る舞いということで、これは自
   7460       然である。一方で、ble session で ble check した時に失敗するのは ble
   7461       session の中では常に展開されずに !! のままだということで、これも
   7462       consistent である。
   7463 
   7464       さて、この振る舞いの違いが何処から来るのかについて確認したい。単に
   7465       interactive かどうかで判定するだけでは駄目である。 bash -Hc の時にも振る
   7466       舞いが変化する。逆に set +H の時に振る舞いが変わるという訳でもない。シェ
   7467       ルかサブシェルかでは切り替わらない様に見える。今の所分かっている条件は i
   7468       も H もない場合にのみ 4.1..dev で展開が発生する。
   7469 
   7470     [原因]
   7471 
   7472     | GitHub の blesh-test repository (private) を使ってまたテストを実行する事
   7473     | にした。どうもそもそも symbolic link 自体が作られていない気がする。find
   7474     | で見る限りは ln で作ったファイルが全て通常のファイルになってしまっている。
   7475     |
   7476     | 調べてみたが msys2 や Git for Windows 辺りで最近 symbolic link 周りが変更
   7477     | されたという話も見当たらない。
   7478     |
   7479     | a msys2 ではなくて Windows の ln ls readlink find 等のツールを拾ってしまっ
   7480     |   ている? と思って type -p でパスを確認してみたがちゃんと msys のを呼び出
   7481     |   している気がする。(そもそも windows のものを呼び出していたら、使い方が
   7482     |   違うので、別のエラーメッセージが発生しそうなものである)
   7483     |
   7484     | b 一方で Git for Windows の release note を見ると winsymlinks に加えて
   7485     |   sysfile または nativestrict を指定する必要がある様な感じに書かれている。
   7486     |   然し、sysfile を追加しても振る舞いに変化はない。
   7487     |   https://github.com/git-for-windows/build-extra/blob/main/ReleaseNotes.md
   7488     |
   7489     | c 或いは一旦システムを開始した後に個々のコマンドで振る舞いを変更したい場
   7490     |   合は MSYSTEM という環境変数を使えという話が以下のリンクで言及されていた。
   7491     |
   7492     |   https://github.com/msys2/MSYS2-packages/issues/3941#issuecomment-1680093862
   7493     |
   7494     |   これは最近のコメント (2023-08-16) だが最近変更でもあったのだろうか。其
   7495     |   処で MSYSTEM にも MSYS の値をコピーして試してみたが振る舞いに変化はない。
   7496     |
   7497     |   そもそもこの Issue の報告者は lnk を MSYS に指定している。
   7498     |
   7499     |   https://github.com/msys2/MSYS2-packages/issues/3941
   7500     |
   7501     |   これはどういう意味だろうか。試しに lnk を追加してみたがやはり振る舞いに
   7502     |   変化はない。
   7503     |
   7504     | d また Git for Windows の release note に戻ると winsymilnks:nativestrict
   7505     |   (NTFS junction を用いた物) についても言及されていたのでそれも試してみた
   7506     |   がやはり振る舞いは変わらない。
   7507     |
   7508     | 突然動かなくなったがこれはどういう事だろうか。取り敢えず test3.sh の中に
   7509     | は ble.sh の中で最近変更した物は含まれていない様に思われる。それに問題は
   7510     | 明らかに windows において ln がリンクを作れていない事によっている。その他
   7511     | の要素がこの振る舞いに影響しているとは思えない。念の為 windows-2019 で振
   7512     | る舞いが変わるかどうか確認する。
   7513     |
   7514     | e もう一つの可能性は MSYS はコロン区切りの筈だけれど、実際には何故か : が
   7515     |   入っていると winsymlinks はちゃんと動かない。そして、今までは MSYS が空
   7516     |   だったので問題が起こっていなかったが、新しく disable_pcon が追加された
   7517     |   事で正しく認識されなくなってしまった?
   7518     |
   7519     |   →実際に MSYS=winsymlinks を試してみたら動く様になった。謎である。lnk,
   7520     |   sysfile, nativestrict 等と組み合わせて指定してもちゃんと動く。
   7521     |   hello_world という存在しない設定を指定しても動く。何と
   7522     |   winsymlinks:disable_pcon の順番でもちゃんと動く。これが意味する所は
   7523     |   MSYS の winsymlinks が設定されているかどうかをチェックする部分のコード
   7524     |   が間違っているのではないかという事。念の為 disable_pcon:winsymlinks を
   7525     |   自分で代入した場合も試してみる。期待通り動かない。sysfile:winsymlinks
   7526     |   の場合でも動かない。
   7527     |
   7528     |   本体のテストの方は ble/path#append ではなくて ble/path#prepend を使えば
   7529     |   何とかなりそうだ。
   7530     |
   7531     |   一方で、手元の msys2 では disable_pcon を MSYS に設定していても別にテス
   7532     |   トは失敗しない。中では disable_pcon:winsymlinks の様な形になっている筈
   7533     |   である。
   7534     |
   7535     | 取り敢えず workaround は分かったが winsymlinks の指定位置で振る舞いが変化
   7536     | するのは理解できない。この振る舞いを制御しているのは何処だろうか。どうも
   7537     | Cygwin のソースの中自体に winsymlinks というのが隠れている?
   7538     |
   7539     | 実は CYGWIN 環境変数は : 区切りではなくて ' ' 区切りの可能性?
   7540 
   7541     環境変数 MSYS (そして upstream の CYGWIN) は実はコロン区切りではなくて空白
   7542     区切りである。今までの GitHub workflow では MSYS が空だったので単に
   7543     winsymlinks が追加される形になって問題は発生していなかった。所が、最近 MSYS
   7544     として disable_pcon が既定で設定される様になった。ここで winsymlinks を追加
   7545     する為に : を使用した為にちゃんと winsymlinks が認識されなくなったのが問題
   7546     の原因であった。この為にそもそも全く symbolic links が作られなくなったのが
   7547     テストが失敗する様になった原因であった。
   7548 
   7549 2023-09-14
   7550 
   7551   * bashbug: "convert-meta on" の時 job 関連の bash の警告が出る [#D2070]
   7552     Ref #D2069
   7553     Ref memo/D2070.bashrc
   7554 
   7555     bash: DEBUG warning: mark_dead_jobs_as_notified: ndead (0) != js.j_ndead (1)
   7556 
   7557     色々試してみたがどうも bash-bisect の中でビルドすると問題が発生しなくて、
   7558     bash-dev の中でビルドすると問題が発生する。何が悪いのだろうか。と思ったが、
   7559     そうではない。release ビルドにしているから問題が発生しないのである。という
   7560     事はそもそもこの問題がどこで発生するようになったのかも定かではない。もしか
   7561     すると bash-5.2 の時点でも問題として存在しているのかもしれない。
   7562 
   7563     そもそもこのエラーはどのタイミングで発生するのだろうか。問題発生のテストケー
   7564     スを最小化する事は可能だろうか。
   7565 
   7566     うーん。convert-meta が関係しているというのも何だか不思議な事である。単に
   7567     locale が間違っているという事で起きているのではない。locale が間違っていて
   7568     も convert-meta が off であればこのエラーは生じない。convert-meta on で
   7569     bind 関連の問題が生じている時に限ってこの警告が発生する。
   7570 
   7571     最小ケースを作るか或いは bash に直接修正を入れるかのどちらかという事になる。
   7572     先ずエラーが検出されているのは mark_dead_jobs_as_notified (jobs.c:4858) で
   7573     あり、変数の値の不一致である。しかしこの不一致がどの時点で発生したのかとい
   7574     うのは明らかではない。更に、convert-meta の関連性は更に不明である。或いは
   7575     convert-meta がうまく行かない時の無限ループに関係があるのだろうか。意図的に
   7576     マクロの convert-meta を介した無限ループを作ってみたら readline: maximum
   7577     macro execution nesting level exceeded というメッセージが表示される。うーん。
   7578 
   7579     ? マクロ無限ループのメッセージが出たらそれに対して vbell を出そうとしてそれ
   7580       で job のエラーが表示されているという可能性はあるだろうか。受け取った CSI
   7581       の数 (19) と比べてみようと思ったがそれよりは警告が出る回数 (14) は少ない
   7582       様である。visible-bell を潰してもやはり問題は出る。なので visible-bell は
   7583       関係ないだろう。
   7584 
   7585     ? 次に確認するべきことは果たしてどのタイミングでメッセージが表示されている
   7586       のかという事。文字列の受信が始まってから問題が発生している様な気がする。
   7587       ble-decode/.hook -> ble-decode/EPILOGUE -> ble-edit/bind/.tail ->
   7588       ble/util/idle.do -> ble/complete/auto-complete.idle ->
   7589       ble/complete/auto-complete.impl ->
   7590       ble/complete/auto-complete/source:syntax ->
   7591       ble/complete/candidates/generate ->
   7592       ble/complete/candidates/generate-with-filter substr ->
   7593       ble/complete/source:command -> ble/complete/source:command/gen ->
   7594       ble/complete/source:command/gen.1 -> ble/util/conditional-sync
   7595 
   7596       うーん。どうやら ble/util/assign の中で conditional-sync を実行しようとす
   7597       ると問題が生じる様子である。更に言うと locale は関係ない。
   7598 
   7599     取り敢えず最小再現は以下まで小さくなった。この設定で C-t を二回押すと問題が
   7600     再現する。locale などは関係ない。
   7601 
   7602       source out/ble.sh --norc --attach=none
   7603       builtin bind -x '"\C-t": v=${ sleep 0.1 & }'
   7604 
   7605     以下が最小再現コードである。ble.sh と関係なく再現する。ここから少しでも減ら
   7606     そうとすると何か変な事が起こる。謎である。
   7607 
   7608       enable -f /home/murase/opt/bash/dev/lib/bash/sleep sleep
   7609       function f1 {
   7610         for a; do :; done
   7611         builtin sleep 0.1
   7612       }
   7613       builtin bind -x '"\C-t": v=${ f1 a & }'
   7614 
   7615       job error caused by funsub + bind + loadable builtin
   7616 
   7617     これに関して言えば ble.sh の側でできる事はないし、そもそも bash-5.3 はリリー
   7618     スされていないし、問題はデバグ中に発生しただけで実際の構成では発生しないの
   7619     で気にしなくて良い。
   7620 
   7621   * decode: "convert-meta on" in bash >= 5.2 with broken locale (reported by 3ximus) [#D2069]
   7622     https://github.com/akinomyoga/ble.sh/issues/361
   7623     Ref memo/D2069.bashrc
   7624 
   7625     kalilinux で存在しない locale を使っていると left/right が使えない
   7626 
   7627     そもそもこれは kalilinux 特有の問題なのだろうか。或いは locale が壊れていた
   7628     ら常に起こる問題なのだろうか。一つの可能性は locale が見つからない事によっ
   7629     て bash readline の meta 云々の設定が変わってしまって、それが理由で矢印キー
   7630     が認識されなくなっている可能性。
   7631 
   7632     自分の手元の Arch で問題を再現することができた。起こっている現象としては
   7633     ESC (27) が全く受信できていないという事。ble/decode/.hook の呼び出しを直接
   7634     観察しても受信されていない。
   7635 
   7636     * reject: 実行した初回の bind -spX の出力が違う C-? C-u C-w がちゃんと bind
   7637       されていない。然しこれは関係があるのだろうか。
   7638 
   7639       --- debug.0.txt^I2023-09-14 06:09:29.718861055 +0900
   7640       +++ debug.1.txt^I2023-09-14 06:08:15.982192253 +0900
   7641       @@ -5,7 +5,7 @@
   7642        # arrow-key-prefix (not bound)
   7643        # backward-byte (not bound)
   7644        # backward-char (not bound)
   7645       -# backward-delete-char (not bound)
   7646       +"\C-?": backward-delete-char
   7647        # backward-kill-line (not bound)
   7648        # backward-kill-word (not bound)
   7649        # backward-word (not bound)
   7650       @@ -112,7 +112,7 @@
   7651        # undo (not bound)
   7652        # universal-argument (not bound)
   7653        # unix-filename-rubout (not bound)
   7654       -# unix-line-discard (not bound)
   7655       +"\C-u": unix-line-discard
   7656        # unix-word-rubout (not bound)
   7657        # upcase-word (not bound)
   7658        # vi-append-eol (not bound)
   7659       @@ -162,7 +162,7 @@
   7660        # vi-subst (not bound)
   7661        # vi-tilde-expand (not bound)
   7662        # vi-undo (not bound)
   7663       -# vi-unix-word-rubout (not bound)
   7664       +"\C-w": vi-unix-word-rubout
   7665        # vi-yank-arg (not bound)
   7666        # vi-yank-pop (not bound)
   7667        # vi-yank-to (not bound)
   7668 
   7669       うーん。正常に動いている場合でも最初はこの様な状態になっている様なのでこ
   7670       れは関係ないという気がする。
   7671 
   7672     起動した後に LANG='en_CA.UTF-8' を設定しても特に問題は発生しない。やはり起
   7673     動時の初回のプロンプトで問題が起こるという事なのだろうか。
   7674 
   7675 
   7676     * 更に手元の chatoyancy でも単に以下の bashrc で起動するだけで再現する。
   7677 
   7678       LANG='en_XY.UTF-8'
   7679       source out/ble.sh --norc
   7680 
   7681       更に bash-4.0..5.1 まで問題は発生しない。bash-5.2 で実行すると core dump
   7682       する。システムの bash で発生する。bash-dev でも同じ問題が発生している (そ
   7683       れに加えて job 関連の警告が locale によって出る)。
   7684 
   7685       問題発生ケースの最小化について。これは bind 関係の問題だから bind を何と
   7686       か色々やる事で再現できないだろうか。しかし、一回コマンドを実行すると直る
   7687       事などを考えると単純ではない様に思われる。何らかの発生条件があるというこ
   7688       と。取り敢えず手動 attach した時にも再現するかどうかを確認する。
   7689 
   7690       →手動 attach でも再現する。prompt の中で実行するとちゃんと受信できないと
   7691       かそういう事なのだろうか? と思ったがそれも変だ。一文字でも入力したら
   7692       prompt attach であっても PROMPT_COMMAND の外側に出てちゃんと bind の中で
   7693       処理をする様になるので。
   7694 
   7695       という事を考えると、一回コマンドを実行すると問題が発生しなくなるという所
   7696       に重点を置いて調べるべきだろうか。
   7697 
   7698       * 取り敢えず空のコマンドを実行しても問題は継続する。
   7699       * C-x C-v で表示を行っても問題は継続している。
   7700       * execute-command 経由でコマンドを実行すると直るが、これは普通にコマンド
   7701         として実行するのと同じ様なものであるので、新しいことがわかったとは言え
   7702         ない。
   7703 
   7704         或いは具体的に bash の中で何が起こっているのか追跡するべきなのかも知れ
   7705         ない。特に keymap 関連の処理で受信された 27 がどの様に消えてしまうのか
   7706         を確認する。コマンドを実行すると直るという事はやはり keymap のデータ構
   7707         造が壊れているとかそういう事なのだろうか。或いは、コマンド実行時に戻し
   7708         きれていない何らかの設定が存在している?
   7709 
   7710       * external-command を実行した時にどうなるかも確認する → 実は
   7711         external-command を実行した場合でも問題は再現しなくなる。
   7712       * ble/term/{leave,enter} の実行だけでも問題はなくなる。
   7713       * ble/term/rl-convert-meta/{leave,enter} で問題が解消する。
   7714 
   7715         然し何故問題が発生するのだろうか。_ble_term_rl_convert_meta_adjusted の
   7716         値はちゃんと最初から 1 になっている。つまりどこかで adjust が実行された
   7717         筈ということ。PROMPT_COMMAND の内部から attach した時は readline の設定
   7718         が復元して戻ってしまうという事だろうか。
   7719 
   7720         実際に振る舞いを確認してみると初回だけ convert-meta on になっていた。
   7721         bash-5.1 以下ではちゃんと off になっている。
   7722 
   7723         prompt attach でも直 attach でも問題は発生する。つまり、attach のタイミ
   7724         ングで回避できる物ではない様に思われる。
   7725 
   7726       うーん。これを回避する為には最初のキーの受信の時点で convert-meta off を
   7727       明示的に実行するべきだろうか。然しそうだとしても最初の最初のキーが 27 の
   7728       時にそれが欠けてしまうという問題が残る。或いは attach した直後に
   7729       convert-meta off を実行すれば問題はなくなるのだろうか? と思ったが実際に
   7730       attach の時に ble/term/enter を実行している筈なのでちゃんと convert-meta
   7731       off は実行されている筈である。
   7732 
   7733       _ble_term_rl_convert_meta_adjusted の初期値は? → OK。ちゃんと空である。
   7734       つまり、1 が設定されていた時点で何処かでちゃんと convert-meta off が実行
   7735       されていたという事。それにも関わらず convert-meta が何らかのタイミングで
   7736       on になってしまう。
   7737 
   7738       ? 特に、手動 attach をした場合でも問題が再現するというのは変だ。更にわかっ
   7739         た事は、ble-bind -f C-t ... を実行していると手動 attach では問題が発生
   7740         しなくなるが、prompt attach では問題が継続するという事。ble-bind を実行
   7741         しているかしていないかで変わるというのも不思議な挙動である。
   7742 
   7743       ? もうひとつ不思議なのは convert-meta 絡みなのに LANG=C の時には問題が生
   7744         じていないという事。locale の初期化に失敗した時にだけ勝手に
   7745         convert-meta on になるという事なのだろうか。
   7746 
   7747       readline 最初の locale の初期化の際にエラーが起こると convert-meta を設定
   7748       するという動作になっているのだろうか。その時点で convert-meta を off に戻
   7749       す必要があるが、readline が最初に受け取った byte というのが消滅するのであ
   7750       ればそれをスクリプトの設定の側から検出する事ができない。最初に受け取った
   7751       文字を見て勝手に 27 が前に存在していたという事を推測するのは堅牢でない。
   7752       ユーザーが入力した文字を勘違いする可能性がある。
   7753 
   7754       a bash に対する修正要求をする? 或いは過去に convert-meta を設定したのであ
   7755         れば後で bash が勝手に convert-meta を変更するのは変だという事にはなら
   7756         ないか。例えば convert-meta の状態を内部的には auto on off の3つにして
   7757         おいて、既定値は auto で、ユーザーから一回でも指定があったら on/off に
   7758         して、locale 失敗時には auto の場合にのみ convert-meta を再設定する。
   7759 
   7760         或いは、auto on off は保持しておいて、内部的な既定値を locale 失敗時に
   7761         設定する。auto の時には内部的な既定値を参照する。という具合の実装に
   7762         bash が変更してくれれば問題は解決する。
   7763 
   7764       b 別の方法としては readline の locale の初期化を強制的に実行する方法を考
   7765         える。その後であれば勝手に convert-meta が設定される事もないだろう。
   7766 
   7767         と思ったが本当だろうか。普通に開始したとしても壊れた locale を設定した
   7768         直後は readline の振る舞いが変になるのではないか → 少なくともユーザー
   7769         コマンドとして LANG=en_ZZ.utf8 などの値を設定しても特に振る舞いが壊れる
   7770         という事もないようだ。
   7771 
   7772         a read -e xxx </dev/null 等として強制的に readline の locale の初期化を
   7773           済ませられないかと思って試してみたが振る舞いに変化はなかった。と思っ
   7774           たが、よく考えたら read -e は ble.sh が上書きして subshell の内部で自
   7775           前の read loop で実行するので何れにしても readline は呼び出さない様に
   7776           なっている
   7777 
   7778         b 今度は builtin read -e xxx </dev/null として見たがそれでも駄目。
   7779 
   7780         c builtin read -e xxx <<< yyy としてみても駄目。一応変数 xxx には期待し
   7781           た文字列が格納されている。 -e を指定しても読み取り元が tty でなければ
   7782           readline は初期化されないという事なのかもしれない。
   7783 
   7784         d 今度は builtin read -et 0.1 xxx としてみたらどうやら動く様になった。
   7785           builtin read -et 0.000001 でもちゃんと動く。builtin read -et 0.000001
   7786           </dev/tty でも動く。
   7787 
   7788           但し、ble-bind -f ... で何かを設定しないとちゃんとは動かない。
   7789           ble-bind -f を指定する事によって何かが初期化されてそれとの順番との兼
   7790           ね合いだろうか。うーん。builtin read -et 0.000001 よりも前に ble-bind
   7791           -f を実行している必要がある。順番を逆にするとやはり問題が発生する。
   7792           ble-bind の中の何らかの操作が関係しているのだろうと思って調べてみると、
   7793           単に ble/decode/initialize だった。然し、ble/decode/initialize が
   7794           bash の振る舞いに影響を与えるというのも不思議といえば不思議である。更
   7795           に調べると _ble_decode_initialize_inputrc=none だと
   7796           ble/decode/initialize を呼び出しても問題が継続する。diff にすると収ま
   7797           る。ble/builtin/bind/read-user-settings を呼び出すと収まる。
   7798           ble/builtin/bind/read-user-settings/.reconstruct を呼び出すと収まる。
   7799           然し、ble/builtin/bind/read-user-settings/.collect を呼び出しても収ま
   7800           らない。不思議だ。と思ったら、.reconstruct の中で呼び出している
   7801           LC_ALL= LC_CTYPE=C ble/bin/awk なのかもしれない → これだった。単に
   7802           LC_ALL= LC_CTYPE=C で何かのコマンドを呼び出せばよかった様だ。
   7803 
   7804         e 今度は builtin read -et 0 xxx とした場合には動かない
   7805 
   7806       うーん。遅延で手動で attach する場合には、最初から convert-meta on になっ
   7807       ていて、自分で convert-meta off に設定してから ble-attach すれば問題は生
   7808       じない。
   7809 
   7810       まとめると最初のプロンプトを表示した後に locale の初期化とそれに応じた
   7811       convert-meta の設定が行われる様である(本当か?)。
   7812 
   7813       存在しない locale が設定されている時に何処かのタイミングで convert-meta
   7814       on に設定されるのが問題である。
   7815 
   7816       ? convert-meta on が設定されている時に ESC (もしくは ESC [ の組み合わせ)
   7817         が完全に消滅するのは何故なのか。
   7818 
   7819         | 別の形で受信される等の事も起こっていない。素直に考えると M-[ という組
   7820         | み合わせの文字に変換されても良い気がするのに、それすらも受信されない。
   7821         |
   7822         | 実は bash-5.1 以下では M-[ という形で受信できている可能性もある? と思っ
   7823         | て確かめてみたが bash-5.1 以下では最初から convert-meta off になって
   7824         | いた。やはり convert-meta on の時には ESC [ が受信ができない状態になっ
   7825         | ていると考えるべき。
   7826         |
   7827         | 取り敢えず bash のソースコードを調べてみると convert-meta on の時はど
   7828         | うも M-[ を ESC [ に分解する機能なのではないかという気がする。だとす
   7829         | ると、そもそも ble/decode/.hook で 27 を受信できないという問題は独立
   7830         | の様な気がする。何故振る舞いが変わるのだろうか。そもそも本当に
   7831         | convert-meta は bash の _rl_convert_meta_chars_to_ascii に対応してい
   7832         | るのだろうか? → bind.c を確認してみる限りはちゃんと対応している筈。
   7833         |
   7834         | 参照している箇所を少しずつ潰して行った所
   7835         | _rl_function_of_keyseq_internal での取り扱いが振る舞いに影響を与えて
   7836         | いる様だ (然し blame で見る限りこの部分は 12 年間変更されていないので
   7837         | 他の部分の変更が波及してここでの振る舞いに変化をもたらしていると考え
   7838         | られる)。うーん。readline.c の中の convert_meta を参照している所
   7839         | (_rl_dispatch_subseq) も同時に振る舞いに影響を与えている。どちらか一
   7840         | 方だけ潰しても問題は発生しない。両方をコメントあうとした時に問題が生
   7841         | じなくなる。
   7842         |
   7843         | →分かった気がする。ble.sh は isolated ESC を区別する為に ESC ... を
   7844         | C0 9B ... に変換して受信している。この時 convert-meta on だと C0 が変
   7845         | な風に分解されてしまう (というか無限ループになる?)。結果として何も受
   7846         | 信できずに終わるということの気がする。
   7847         |
   7848         | つまり "ESC [" → "C0 9B [" → "ESC @ 9B [" → "C0 9B @ 9B [" → …
   7849         | という具合に無限ループになって恐らく中断されて何も受信できないという
   7850         | 事になっている。
   7851 
   7852         ble.sh は isolated ESC と区別する為に ESC [ を C0 9B [ に変換している。
   7853         一方で C0 は convert-meta の時には ESC @ に分解される
   7854         (_rl_dispatch_subseq)。ESC @ は isolated ESC と区別する為に C0 9B @ に
   7855         変換される。というのを繰り返して先頭の文字に対して無限の展開が起こって
   7856         しまう。恐らくこれが強制的に中断される結果として ESC [ が全く受信されな
   7857         いのだろうと思われる。_rl_function_of_keyseq_internal の中でも同様にし
   7858         て C0 が ESC @ に分解される事によって振る舞いが変になっている。
   7859 
   7860     取り敢えず半ば偶然ではあるが workaround が見つかったのでそれを実装する事に
   7861     する。これは ble.pp の環境確認の段階で実行するのが良さそうである。
   7862 
   7863   * make uninstall を提供するべきではないか [#D2068]
   7864 
   7865     そしてそれはそんなに難しくないはず。インストール対象は全て変数に入っている。
   7866     ただし、INSDIR, PREFIX 等の変数を指定した時には、インストール時と全く同じ設
   7867     定を覚えておく必要がある。然し、変数に依存するとしても対応するのは自然の気
   7868     がする。
   7869 
   7870   * prompt: prompt ruler の位置は elapsed marker よりも後であるべきでは (motivated by U-Labs) [#D2067]
   7871     https://www.youtube.com/watch?v=OS3I1cCCw_Q
   7872 
   7873     * ok: というか printf EOF などに対する振る舞いもちゃんとしているのだろうか?
   7874       → これは試してみた所ちゃんと処理されている。
   7875 
   7876     これは ble-edit/exec/.adjust-eol の中で 呼び出しているのが問題である。呼び
   7877     出し箇所を変更することにした。 ble-edit/exec/.adjust-eol は一箇所でしか呼び
   7878     出されていないのでその呼出元に移動すれば十分である。
   7879 
   7880 2023-08-26
   7881 
   7882   * menu: append-arg で対応する項目がない時 bell (motivated by bkerin) [#D2066]
   7883     https://github.com/akinomyoga/ble.sh/issues/354
   7884 
   7885     2023-09-14 色々考えたがやはり bell を鳴らすのを既定の動作とする事にした。
   7886 
   7887 2023-08-17
   7888 
   7889   * Makefile: github/workflows の macos-latest で失敗する [#D2065]
   7890 
   7891     色々実験した結果、どうやら make-3.81 では以下の規則があった時に三つ目に合致
   7892     するファイル名の時であっても、一つ目の規則を適用してしまう様である。3.82 で
   7893     はちゃんと問題なく動作する。
   7894 
   7895     | $(OUTDIR)/doc/%: % | $(OUTDIR)/doc
   7896     | 	$(CP) $< $@
   7897     | $(OUTDIR)/doc/%: docs/% | $(OUTDIR)/doc
   7898     | 	$(CP) $< $@
   7899     | $(OUTDIR)/doc/contrib/%.md: contrib/%.md | $(OUTDIR)/doc/contrib
   7900     | 	$(CP) $< $@
   7901 
   7902     よく見てみるとこの make-3.81 における問題は contrib.mk にも既に書かれていた。
   7903     contrib.mk における回避方法は三番目の規則をより詳しくすると言う物だったが、
   7904     実は一つ目の規則を消して代わりにファイルを一つずつ記述する方が現実的の気が
   7905     する。その様に変更する事にする。
   7906 
   7907     x contrib.mk で定義されているマクロ名に綴り間違いがある。序でにこれも修正し
   7908       ておく。
   7909 
   7910 2023-08-16
   7911 
   7912   * PKGBUILD: 色々とけちがついているので修正する (requested by willemw) [#D2064]
   7913     https://aur.archlinux.org/packages/blesh-git#comment-929483
   7914 
   7915     * provides & conflicts を修正した
   7916     * depends & makedepends の修正
   7917     * /usr/share/licenses/blesh に配置するライセンス
   7918 
   7919   * external: bash-3.2 初期化で無限ループになる  [#D2063]
   7920 
   7921     bash --norc で開始した後に source out/ble.sh しても問題は発生しない。
   7922 
   7923     →これは単に ~/.bashrc の方のバグだった。ble/util/idle.push のサポートが無
   7924     い時に ble-import -d 経由で無限ループが明示的にできていた。
   7925 
   7926 2023-08-15
   7927 
   7928   * 2023-07-24 mc-4.8.29 で動かなくなっている (reported by mooreye) [#D2062]
   7929     https://github.com/akinomyoga/ble.sh/issues/62#issuecomment-1646969652
   7930 
   7931     以下の内容を受信している。以前は単一行を受信していたのに複数行に分かれたの
   7932     が問題という事だろうか。
   7933 
   7934     | declare -- _ble_edit_str=" mc_print_command_buffer () { printf \"%s\\\\n\" \"\$READLINE_LINE\" >&13; }"
   7935     | declare -- _ble_edit_str=" bind -x '\"\\e_\":\"mc_print_command_buffer\"'"
   7936     | declare -- _ble_edit_str=" bind -x '\"\\e+\":\"echo \$BASH_VERSINFO:\$READLINE_POINT >&13\"'"
   7937     | declare -- _ble_edit_str=" PROMPT_COMMAND=\${PROMPT_COMMAND:+\$PROMPT_COMMAND"
   7938     | declare -- _ble_edit_str="}'pwd>&11;kill -STOP \$\$'"
   7939     | declare -- _ble_edit_str="PS1='\\u@\\h:\\w\\\$ '"
   7940 
   7941     然し、遡ってみてもこの部分の変更が行われたのは 4.8.26 ととても古い。一方で
   7942     4.8.28 では遅延なく mc が開始される事は確認した。何故だろう。と思ったが後で
   7943     気づいたのだが mc 4.8.28 でも ble.sh は正しく起動していなかった。代わりに
   7944     sh に fallback していたが遅延なく失敗していたという事の気がする (mc の側で
   7945     待ち時間を変更したのかもしれないし或いは出力内容によっては ble.sh session
   7946     がクラッシュしていた可能性もある?)。
   7947 
   7948     取り敢えず accept-line で LINENO の上限を上げてみるとちゃんと起動する様になっ
   7949     た。mc の中で ble.sh も一応動作している様だ。然し色々と問題がある。
   7950 
   7951     x fixed: 現在は取り敢えず $_ble_edit_LINENO -le 5 で判定しているが本来はもっ
   7952       とちゃんと判定するべき。例えば、_ble_edit_str に含まれている文字列も検査
   7953       してユーザーコマンドを誤って実行しないように対策をしておく事にする。新し
   7954       い関数に分離した方が良いかもしれない。
   7955 
   7956       →これは PROMPT_COMMAND=${PROMPT_COMMAND... という時にのみ特別扱いをする
   7957       様に変更した。その他の場合には別に通常通りにコマンドを強制実行しても問題
   7958       ない。
   7959 
   7960     x fixed: C-o が何かの拍子に効かなくなる。どうやら C-o をエスケープシーケン
   7961       スで送信するモードに入ってその後で戻らなくなってしまう事があるようだ
   7962       (xterm)。
   7963 
   7964       set -o emacs を実行してモードを変更すると問題が発生する。sleep 1 の実行中
   7965       に C-o 等のキーを入力すると状態が元に戻る。
   7966 
   7967       →mc の内部では modifyOtherKeys の調整を強制的に無効にすることにした。然
   7968       し、それでも set -o emacs にすると C-o に対して待ち時間が発生する様になる。
   7969       これは単に M-+, M-_ に対する応答がないからだと思われる。これについては
   7970       ble.sh の側で M-+ および M-_ に対して現在のモードに関係なく応答する様に調
   7971       整すれば良い様な気もするが、其処までする程の事でもないし plain Bash でも
   7972       同様の問題が発生するのだから取り敢えずは考えない事にする。
   7973 
   7974     x fixed: mc がプロンプトの抽出に失敗している気がする
   7975 
   7976       | →これは罫線描画の問題でもあった。mc が考える罫線の幅と端末の罫線の幅が
   7977       | 一致していなかった為に描画が乱れていたのだった。実際には、 "-- 挿入 --"
   7978       | という文字列がプロンプトとして取り扱われていたのだった。また、"-- 挿入
   7979       | --" がプロンプト文字列という想定の元ではちゃんと C-o を押した時の振る舞
   7980       | いも正しくなっていた。
   7981       |
   7982       | 問題は "-- 挿入 --" を表示したままで mc に本物の方をプロンプトとして認
   7983       | 識させる事は可能なのかという事。現在のカーソル位置はちゃんと本物の方の
   7984       | 行にあるのでカーソル位置を合わせても恐らくちゃんとは認識してくれない。
   7985       |
   7986       | mc がプロンプトを抽出する瞬間だけ "-- 挿入 --" を消すという事も考えたが、
   7987       | そもそも mc はどの瞬間にプロンプトを抽出しているのだろうか。というか、
   7988       | そもそもどの瞬間にコマンドが終了してプロンプトが表示されたと判定してい
   7989       | るのだろうか。PROMPT_COMMAND の段階では未だ何も表示されていない筈。うー
   7990       | ん。\e+ または \e_ に対して応答した時点での内容を見ているという事なのだ
   7991       | ろうか。
   7992       |
   7993       | 実際に試してみると C-o C-o を連続して押すと M-_ M-+ SP C-h というキーが
   7994       | 送信されてくる様だ。更に振る舞いを見ると C-o で mc に戻る時に M-_ M-+
   7995       | が送信されて、次の C-o で端末画面に移動する時に SP C-h が送信される様で
   7996       | ある。
   7997       |
   7998       | 然し C-o "sleep 1" LF "sleep 1" LF C-o として見たがその途中でプロンプト
   7999       | を更新している筈なのに M-_ も M-+ も何も受信していない。という事を考え
   8000       | ると実は純粋に最後の出力内容でプロンプトを決めているという事なのだろう
   8001       | か。
   8002       |
   8003       | * mode-indicator がなくてもプロンプト抽出できない
   8004       |
   8005       |   mode-indicator を修正して MC_SID が設定されている時には何も表示されな
   8006       |   い様にした。しかしそれでもちゃんと抽出できていない。C-o から実行した
   8007       |   時にはちゃんとプロンプトを抽出できているが、mc から直接コマンドを実行
   8008       |   した時にはプロンプトがそもそも表示されていないのである。これはどうい
   8009       |   う事だろうか。
   8010       |
   8011       |   調べてみると一応は mc からコマンドを実行する時でも ble.sh の gexec を
   8012       |   経由してコマンドが実行されている様である。一方で何故プロンプトが表示
   8013       |   されないのか、というと…。
   8014       |
   8015       |   mc の内部からコマンドを実行した時にコマンドの終了をどう検出しているの
   8016       |   だろうか。例えば、M-+ 等のキーを予め設定して置いてそれによる処理が呼
   8017       |   び出されたらその時点でプロンプトを読み出すのだろうか。と思って確認し
   8018       |   てみたが mc の内部から実行した時には無駄な入力は一切していない。とい
   8019       |   う事を考えると、PROMPT_COMMAND から呼び出している pwd 及び kill -STOP
   8020       |   が怪しい。うーん。普通の bash だと kill -STOP が処理されるのはプロン
   8021       |   プトが表示されてからと言う事なのだろうか。
   8022       |
   8023       |   →取り敢えず kill -STOP はPROMPT_COMMAND から削除して自前で kill
   8024       |   -STOP を呼び出す様に変更する事にする。一旦は動いた様に見えたが単純に
   8025       |   コードが壊れて ble.sh が開始していなかっただけだった。終了しても良い
   8026       |   のかもしれない。
   8027       |
   8028       |   kill -STOP の実行をプロンプト表示の直後にしてもやはり問題が生じる。
   8029       |
   8030       | * done: 初回の実行に関しては gexec/.end で kill -STOP を実行しても初回
   8031       |   の PROMPT_COMMAND に対応する処理は実行できない気がするので、寧ろ
   8032       |   PROMPT_COMMAND の中で変数を設定してそれを読み取って kill -STOP を
   8033       |   ble/textarea#render の最後で実行する様にした。然し振る舞いは変わらな
   8034       |   い。よく考えたら mc は直接コマンドを入力して PROMPT_COMMAND を修正す
   8035       |   るのだから、gexec/.end は何れにしても呼び出されるのだった。余り意味が
   8036       |   ないのだったが、元の動作を考えるとこちらの方がより近いのでよしという
   8037       |   事にする。
   8038       |
   8039       | * done: pwd のタイミングも遅延してみる? pwd の方のタイミングも関係して
   8040       |   いるのかもしれないと思って、pwd の方も描画の後に実行する事にしてみた
   8041       |   が振る舞いに違いはない。と思ったら ble/util/buffer.flush を実行してい
   8042       |   なかった。これを実行する様にしたらちゃんと画面にはプロンプトが表示さ
   8043       |   れる様になったが、mc は依然として拾ってくれない。
   8044       |
   8045       | * プロンプトの後に改行が挿入されている問題: どうも表示したプロンプトの
   8046       |   次に改行が入って、そこから文字列が入力される状態になってい
   8047       |   る。_ble_util_buffer の中身を見ても変な改行は含まれていない。plain の
   8048       |   bash での振る舞いを見ると mc 内部からコマンドを実行した時には余分な改
   8049       |   行が出力されている。どうやら mc は STOP でシェルが停止した後に改行を
   8050       |   挿入して、更にその後でシェルにプロンプトを描画させてそれを拾っている
   8051       |   様な気がする。
   8052       |
   8053       |   然し STOP の直後にプロンプトを表示する様にしても画面に何も表示されな
   8054       |   くなってしまう。pwd だけ先に実行して直後に出力して、その後に STOP を
   8055       |   実行する様にしても改行が次に表示されてしまう。
   8056       |
   8057       |   plain bash で PROMPT_COMMAND='echo -n 1 >&2;pwd>&16;echo -n 2
   8058       |   >&2;kill -STOP $$;echo -n 3 >&2' 等として見ると 2 だけがプロンプトと
   8059       |   して中執されている。これが意味するところは、pwd を実行してから停止す
   8060       |   る迄に出力された内容を mc はプロンプトだと考えているという事ではない
   8061       |   だろうか。では、なぜ現在の実装でそれが正しく抽出できていないのだろう
   8062       |   か。
   8063       |
   8064       |   | そもそも微妙なタイミングの違いで出力されるされないが変わっている気
   8065       |   | がする。色々実験した結果、pwd よりも前に出力した結果は画面に現れる。
   8066       |   | 然し、pwd よりも後に出力した結果は表示される事もあるしされない事も
   8067       |   | ある。直後に単に echo -n "..." >&2 で出力すると表示される場合が多い
   8068       |   | が、一行でも IFS= eval 'local text=${arr[*]}' 的な事を挟むとそれだ
   8069       |   | けで表示されなくなってしまう。この事から、本来は mc の意図としては
   8070       |   | pwd の結果を受信したら bash の出力は捨てるモードに移行するのではな
   8071       |   | いかという事。
   8072       |
   8073       |   → pwd ... kill -STOP の間に出力された内容は基本的には失われる。タイ
   8074       |   ミングの都合で pwd 直後だとすり抜ける事がある。
   8075       |
   8076       |   kill -STOP の後に出力した内容は期間を置いても基本的には失われる。mc
   8077       |   がどうやって plain bash のプロンプトを抽出しているのかは謎である。或
   8078       |   いは、pwd の内容が変化した時にだけ読み取っているという可能性?
   8079       |
   8080       | * もう mc の振る舞いが全く分からない。プロンプトの抽出を mc がどのよう
   8081       |   に実行しているかを調べるべきなのかもしれない。
   8082       |
   8083       |   1 read_subshell_prompt という関数があったから其処で何を受信しているか
   8084       |     を調べてみたらカーソル表示・非表示の出力を拾っていた。どうも一番最
   8085       |     初に受信した socket のブロックをプロンプトと考えているという事?
   8086       |
   8087       |     →何故か分からないが、ble/util/buffer で何も出力する物がない時には
   8088       |     カーソル表示・非表示のシーケンスも含めて何も表示しない様にしたら、
   8089       |     mc の中からコマンドを実行した時のプロンプトに関してはちゃんと正しい
   8090       |     配置になる様になった。
   8091       |
   8092       |     どうも改行が勝手に挿入されていたのは空の ble/util/buffer の出力を
   8093       |     mc が受信した時に勝手に改行を追加していたからではないだろうか。
   8094       |
   8095       |   2 それでも正しいプロンプトを抽出できていないと思ったら、どうもまた別
   8096       |     の制御シーケンスの集合をプロンプトと思って受信している様だ。そもそ
   8097       |     もプロンプトに対応する文字列をどうやって判定しているのかが気になる。
   8098       |     タイミングの問題だろうか。或いは、改行以降を抽出しているという事な
   8099       |     のか。
   8100       |
   8101       |     ble/util/buffer の出力している内容と read_subshell_prompt で受信して
   8102       |     いる内容が一致しないと思っていたらどうやら一番最初だけしか
   8103       |     read_subshell_prompt は呼び出されていない様だ。
   8104       |
   8105       |     内部の動作を確認してみるとそもそもプロンプトの更新をしていない。何
   8106       |     故だろうか。should_read_new_prompt が設定された状態で次の出力が来た
   8107       |     ら読み取る仕組みになっている。should_read_new_prompt は設定されてい
   8108       |     る。然し、設定されてから次の出力を受信する前に関数が終了している。
   8109       |     次に関数が呼びされる時には関数の初めで
   8110       |     should_read_new_subshell_prompt がクリアされるので結局新しいプロン
   8111       |     プトに更新するという処理が行われる事はないのである。
   8112       |
   8113       |     →何だか分からないが応急処置で色々変な事をしていたのを削除したら動
   8114       |     く様になった。但し、vi.sh の mode-indicator "-- 挿入 --" は表示しな
   8115       |     い様にしないとちゃんと動かない。色々弄ったのは
   8116       |     memo/D2062/delay-mc-STOP.patch に残して置く事にする。
   8117 
   8118       [まとめ]
   8119 
   8120       * 表示が崩れる原因の一つは罫線の文字幅が一致していない事。これは単に端末
   8121         の問題なので xterm を使えば問題は発生しない。
   8122 
   8123       * プロンプトの抽出に失敗していたののもう一つの原因は、
   8124         ble/util/buffer.flush において出力内容が空であってもカーソル表示・非表
   8125         示の端末制御シーケンスを ble.sh が必ず出力していた事がある。(というか今
   8126         まで全ての bind/.tail でこれを必ず出力していた事になる?) これは出力内容
   8127         がある時にだけ付加する様に変更する異にした。
   8128 
   8129       * また vi における mode-indicator for vi_imap を勝手にプロンプトと勘違い
   8130         するので、mc の中では vi_imap に対してだけは mode-indicator は表示しな
   8131         い様に変更する異にした。
   8132 
   8133     x ok: C-o を押した直後のカーソルの位置がおかしい。これはプロンプト抽出失
   8134       敗とも関係しているのかもしれない。
   8135 
   8136       →これは問題はプロンプト抽出が直ってからは発生していない。
   8137 
   8138     x fixed: と思ったが、何度か C-o を押して画面を行き来すると結局プロンプトが
   8139       消えてまたカーソル位置もおかしくなる。
   8140 
   8141       これは plain Bash の中では発生していない。というか plain Bash の中だと何
   8142       度か C-o を押すと plain Bash が表示したプロンプトに置き換わる (mc が代わ
   8143       りに表示するのは SGR が削除されて黒いのでそれとは区別できる)。
   8144 
   8145       M-_ M-+ を受信しているだけなのでその時にプロンプトを表示しなければならな
   8146       い。というか、そもそも ble.sh は再描画している筈なのに表示されないのは何
   8147       故だろうか。
   8148 
   8149       振る舞いを見ると M-_ 及び M-+ が受信されるのは C-o で端末に戻った時ではな
   8150       くて、mc に戻った時の様である。うーん。つまり、mc に戻る直前の状態を mc
   8151       が覚えておいてそれが端末に戻った時に復元されるということ? そして少しでも
   8152       遅延があると mc に出力を食われて何も表示されずに終わってしまう。
   8153 
   8154       取り敢えず M-_ M-+ で mc に何かを送信するよりも前に必ず render & flush を
   8155       実行する様にしたら問題が発生しなくなった。M-_ の方は render & flush しな
   8156       くても良いが、M-+ の方は必ず render & flush しなければならない。
   8157 
   8158     2023-08-16 mc の外でも "-- INSERT --" の表示が無くなっていると思ったら、mc
   8159     の時にだけ 1 に設定される筈変数の初期値が 1 になっていた。修正する。
   8160 
   8161 2023-08-13
   8162 
   8163   * history: bash-5.3 history -anrw で何処にも書き込まない [#D2061]
   8164     https://lists.gnu.org/archive/html/bug-bash/2023-07/msg00165.html
   8165     https://lists.gnu.org/archive/html/bug-bash/2023-08/msg00007.html
   8166 
   8167     bash/ChangeLog
   8168     |                     8/2
   8169     |                     ---
   8170     | [...]
   8171     | doc/{bash.1,bashref.texi},lib/readline/doc/hsuser.texi
   8172     |     - history: document that if filename is not supplied, and HISTFILE is
   8173     |       unset or null, the [-anrw] options have no effect
   8174 
   8175     と思ったが元からそういう振る舞いになっていた。議論を参照してみるとどうやら
   8176     これまでの bash では何も設定されていないと ~/.history というファイルを勝手
   8177     に作って其処に書き込む様になっていた様だ。
   8178 
   8179     * reject: 今までの bash の振る舞いを再現する様に書き換えるという手もあるか
   8180       もしれないが振る舞いとしてやはり不自然なので ble.sh では bash-5.3 以降と
   8181       同様に何も書き込まない事にする。
   8182 
   8183     * reject: history -anrw で HISTFILE が空の時にはエラーも出力しない?  ble.sh
   8184       では HISTFILE が設定されていなくて -anrw を呼び出した時にエラーメッセージ
   8185       を出力する様になっているが、bash-5.3 では何も出力しない様である。これにつ
   8186       いてはやはりエラーメッセージを出力する方が自然の気がするので取り敢えずは
   8187       エラーメッセージは表示する事にする。ユーザーが何かエラーメッセージを出力
   8188       しない前提の使い方をしているという報告があった時にまた考える事にする。
   8189 
   8190     * done: エラーメッセージが常に history -a になっている。-anrw に応じて適切
   8191       なオプション名を表示するべきではないか → FUNCNAME[1] の最後の文字から抽
   8192       出する様に修正した。
   8193 
   8194     * done: ble/builtin/history/.get-histfile: 制御パス的に必ず true になる場所
   8195       で [[ $histfile ]] で終了ステータスを設定している → 単純に削除する事にし
   8196       た。
   8197 
   8198 2023-08-11
   8199 
   8200   * complete: faces menu_filter_* を設定しようとすると見つからない (reported by anuramat) [#D2060]
   8201     https://github.com/akinomyoga/ble.sh/issues/352
   8202 
   8203     これは complete がロードされてから設定しなければならない。と思ったが、他の
   8204     complete の face はロードする前でもちゃんと動く様になっている。という事は
   8205     menu_filter_* についてもメインのファイルに移動する事にした方が良い気がする。
   8206 
   8207     その他には ble.sh の外で defface しているのは vim-airline だけである。これ
   8208     についてはちゃんと vim-airline が読み込まれてから設定を行う様に
   8209     blerc.template に書かれているので大丈夫のはず。
   8210 
   8211 2023-07-27
   8212 
   8213   * auto-complete: overwrite mode の時に self-insert が後続の文字を消去しない [#D2059]
   8214 
   8215     insert mode で表示されている auto-complete と一致する入力を
   8216     そのまま確定するのは変ではないか。入力した文字数文だけ元々あった物を削除す
   8217     る必要がある。
   8218 
   8219     一方で auto-complete を確定する時に元々ある文字列を上書きするのかどうかとい
   8220     うのは微妙な問題である。現在の実装では insert mode かどうかに関係なくそのま
   8221     ま挿入している。これはこの様な振る舞いの方が自然である。
   8222 
   8223     auto-complete 確定時の振る舞いを考えるとやはり auto-complete mode の時には
   8224     上書きしないで挿入する様にする方が自然だろうかと思ったが、改めて考えると普
   8225     通に入力した時の結果が auto-complete が background で走っているかどうかで降
   8226     るまいが変わるのは問題である。auto-complete の確定は比較的非自明な操作をし
   8227     た時にのみ起こるという事を考えたら、ac も起こらずに入力した時と一貫している
   8228     必要はないが、通常の文字挿入に関しては ac が起こらずに入力した時と一致して
   8229     いる必要がある。なので、やはり overwrite mode の時には auto-complete は一旦
   8230     元の keymap に戻って入力を処理する事にする。
   8231 
   8232 2023-07-26
   8233 
   8234   * make: work around ecryptfs (reported by juanejot) [#D2058]
   8235     https://github.com/akinomyoga/ble.sh/issues/347
   8236 
   8237     cp -p をすると mtime の秒以下が切り捨てられてしまうのでいつまで経ってもコピー
   8238     元よりもコピー先の方が新しいという事にならない。
   8239 
   8240     a 一つの方法は cp -p をやめて直接 cp を実行するという事。これによって
   8241       timestamp が更新されるので、いつの時点のファイルが其処にあるのかというの
   8242       が分かりにくくなる。一方で、ファイルに変更がないのにファイルが新しくなっ
   8243       た事によってキャッシュの再生成が起こるのではないかというのが気になる。
   8244 
   8245       →古いバージョンに一旦戻して動作を確かめるという時には寧ろ更新したほうが
   8246       良いのではないか? と思ったが古いバージョンに戻す時には何れにしても git で
   8247       戻した時にタイムスタンプが最新版になるので気にしなくても良い気がする。
   8248 
   8249     b 或いは常に 1s だけ加算してコピーするという事。然し、1s 加算するというのを
   8250       実装するのが POSIX の範囲内で行おうとすると結構面倒である。それにファイル
   8251       を一つコピーするのに一々幾つもコマンドを起動したくない。
   8252 
   8253     c 或いは問題のある filesystem の上で実行している時に限りコマンドを切り替える。
   8254 
   8255       ファイルシステムの検出方法は信用できるものはない様だ。例えば df -T /dir
   8256       で表示できるが -T は標準化されていない。Linux の stat だと stat -f -c
   8257       '%T' /dir としたらファイルシステムの名前が表示される。しかし BSD stat に
   8258       はそもそも filesystem についての情報を表示する機能がない。mount -l につい
   8259       てもシステムによって存在するかわからないし存在したとしても形式が同じかも
   8260       分からない。また mount point を指定する必要があるので最初に df などを使っ
   8261       て mount point を抽出しておく必要がある。
   8262 
   8263       或いは bash が入っているのであれば実際に cp -p してみて振る舞いを調べると
   8264       いうのも手かもしれない。
   8265 
   8266       更にもう一つの問題は問題のある filesystem の上でどの様にして更新を行うの
   8267       かという事である。touch によって時刻をコピーしたらちゃんと秒以下も反映さ
   8268       れるのだろうか。また、touch -r はどのシステムでもサポートしている物なのだ
   8269       ろうか。→ touch -r は標準化されている様だ。然し、やはり touch でも秒以下
   8270       の情報は消滅してしまう様である。という事を考えると最新の時刻に更新するし
   8271       かない。
   8272 
   8273     何れにしても pp を噛ませるファイル生成に関しては生成時刻がファイル時刻になっ
   8274     ていた。という事を考えるとただコピーを行うだけのファイルの場合にも、コピー
   8275     時点での時刻になっていても問題ないのだろうという気がする。
   8276 
   8277 2023-07-24
   8278 
   8279   * complete: cobraV2 の対策が動いていない (reported by 3ximus) [#D2057]
   8280     https://github.com/akinomyoga/ble.sh/issues/348
   8281 
   8282     添付された生成コードを観察してみると completions に生成された候補が入ってい
   8283     る。一方で core-complete.sh の .cobraV2.patch は out に生成されたデータが入っ
   8284     ているという前提になっていて、out を修正しているが completions は修正してい
   8285     ない。
   8286 
   8287     何処かの時点でコード生成が変更されたという事だろうか。cobra の方の実装を確
   8288     認する必要がある。調べてみると [1] で変更が加えられている。
   8289     __XX_extract_activeHelp が定義されている時に振る舞いを変更する様にすれば良
   8290     さそうだ。
   8291 
   8292     [1] https://github.com/spf13/cobra/pull/1482/files#diff-ccbad943e447c0dbcf310892446819dea78bd471093c627e4aeb211c6ebb1b63
   8293 
   8294     実際に bb というコマンドを持っていないので正確には動作確認できないが適当に
   8295     bb の出力を真似て実行してみた所、問題が再現できるという事と、対策したコード
   8296     で問題が再現しない事を確認した。
   8297 
   8298     | --- gh348.sh~^I2023-07-24 06:31:13.884693063 +0900
   8299     | +++ gh348.sh^I2023-07-24 07:00:07.415045133 +0900
   8300     | @@ -57,6 +57,11 @@
   8301     |      fi
   8302     |      __bb_debug "The completion directive is: ${directive}"
   8303     |      __bb_debug "The completions are: ${out}"
   8304     | +
   8305     | +out='hello^I(fdsafdsafdsa)
   8306     | +world^I(test test test)
   8307     | +aaaaa^Ixxxxxxx
   8308     | +fdsafdsa'
   8309     |  }
   8310     |
   8311     |  __bb_process_completion_results() {
   8312 
   8313     ? 問題が発生するのは desc がついていない候補も一緒に生成された時だけだが、
   8314       報告では desc がついていない候補は生成されていない様に見える。何故だろう
   8315       か?
   8316 
   8317       例えば空の候補が生成されている可能性? → 取り敢えず末尾に空行が含まれてい
   8318       る場合にも問題が再現するという事は確認した。
   8319 
   8320 2023-07-18
   8321 
   8322   * docs: styleguide の追加 (motivated by bkerin) [#D2056]
   8323     https://github.com/akinomyoga/blesh-contrib/pull/12#issuecomment-1507719943
   8324     https://github.com/akinomyoga/ble.sh/pull/317
   8325 
   8326   * mawk in Ubuntu 16.04 LTS (reported by dongxi8, Frezrik) [#D2055]
   8327     https://github.com/akinomyoga/ble.sh/issues/335
   8328 
   8329     Ref. #D2037
   8330 
   8331     mawk の version が古い。そして Ubuntu 16.04 LTS はこの古い mawk を使ってい
   8332     る様だ。mawk が失敗するとどうやら全く操作ができなくなる様だ。これは良くない。
   8333 
   8334     x reject: 後テストしていて気づいたが --clear-cache が効いていない。
   8335 
   8336       もしくはそのまま ble.sh が起動してしまう。例えば bash out/ble.sh
   8337       --clear-cache とするとそのまま新しい interactive session が始まってしまう。
   8338       何故? chatoyancy 上でやっても再現しない。と思ったが勘違いだった。
   8339 
   8340       それでも既に ble.sh がロードされているセッションで source out/ble.sh
   8341       --clear-cache を実行した時に ble.sh をリロードするのかリロードせずに既に
   8342       ロードされている ble.sh で指定されたコマンドを実行するのかは非自明 → こ
   8343       れに関しては新しい物をリロードした上でコマンドを実行するという現在の振る
   8344       舞いで良い気がする。
   8345 
   8346       ble.sh がロードされていない時にsource out/ble.sh --clear-cache をした時に
   8347       勝手に attach してしまうのは変だろう、と思ったが実際にはそのような振る舞
   8348       いはしていなかった。勘違いだった。
   8349 
   8350       結局何れも勘違いだった。
   8351 
   8352     2023-07-18 更にまた別の人からも報告があった。 Ubuntu 18.04 LTS も 1.3.3 を
   8353     使っているらしい。仕方がないので対応する事にする。
   8354 
   8355     mawk がダメという事は何処かに記録していた気がするけれど何処かに行ってしまっ
   8356     た。と思ったが、mawk-regex.sh (2023-05-19 12:09:13) というスクリプトファイ
   8357     ルが残っていた。此処に#D2037 の時に実験したコードが残っている。
   8358 
   8359     * ところで ko1nksm さんに確認を取ってみても良いかもしれない。もしかしたら既
   8360       に記事にしているかもしれない、と思って調べてみたが結局よく分からない。取
   8361       り敢えず {m,n} については何かの記事に書いていた気がすると思って Qiita で
   8362       検索したら以下のページが見つかった (Google で検索しても出なかった)。
   8363 
   8364       https://qiita.com/ko1nksm/items/17b8105f793953dc83c7
   8365 
   8366       更に Qiita で検索をしていたら以下のページも見つけた。このページには正規表
   8367       現にまつわる互換性問題がまとめられている。然しここにも {m,n} は言及されて
   8368       いるけれども、mawk の [:class:] に関しては言及されていない。
   8369 
   8370       https://qiita.com/ko1nksm/items/53abc144558b9bb5629f
   8371 
   8372 2023-07-03
   8373 
   8374   * contrib/fzf-git: fzf-git 更新 (motivated by arnoldmashava) [#D2054]
   8375     https://github.com/akinomyoga/ble.sh/issues/338
   8376 
   8377     gh という関数が gh (GitHub CLI client) と衝突している。fzf-git の upstream
   8378     を見に言ったらいつの間にかに _gh に関数名を変更している。これが意味するとこ
   8379     ろは元よりユーザーから呼び出すことは想定していなかったという事だろうか。更
   8380     に、gist から github の通常の repository に移行している様だった。移行先では
   8381     もっと大幅な refactoring が加えられている。移行先を track する様に変更する
   8382     事にした。
   8383 
   8384   * history: history -w で空ファイルが書き込まれないという報告 (requested by Jai-JAP) [#D2053]
   8385     https://github.com/akinomyoga/ble.sh/discussions/339
   8386 
   8387     先ず既に history が initialized されている時にはちゃんと書き込まれる筈の気
   8388     がする。確認してみると _ble_builtin_history_initialized は初期化フェーズで
   8389     設定される訳ではなくて飽くまで ble/builtin/history の初回呼び出しの時に設定
   8390     される様である。
   8391 
   8392     そもそも何故この様な設計にしていたかを遡る必要がある。初期化フェーズに履歴
   8393     が倍加したりする問題を避ける為にこの様な設計になっていた筈。
   8394 
   8395     #D1314 でこの辺りの振る舞いを導入していた。やはり履歴倍加問題の回避の為にこ
   8396     の様に振る舞っている。
   8397 
   8398     * reject: 一応報告されたのは明示的に history -c を実行した後の問題であるか
   8399       ら、其処で _ble_builtin_history_initialized=1 を設定してしまえば問題ない
   8400       気がする。
   8401 
   8402     x ok: option:c で単に initialized=1 を設定すれば良い気がする。と思ったが
   8403       bashrc の内部で history -c を実行した分は無視されて結局後で読み込まれる事
   8404       になるので、その分は加味しないと行けないのではないのか。
   8405 
   8406       と思ったが既にそういう実装になっていた。問題は、 option:c であっても初期
   8407       化前はスキップする仕組みになっているという事。
   8408 
   8409     こうなってくるとやはり以前の決断の通りに bashrc の内部では history の様々の
   8410     操作は完全に無視する事にするしかない。一方で bashrc の内部にいるという判定
   8411     をもっと厳しくする事はできるのではないかという気がする。
   8412 
   8413     1 bashrc の中かどうかの判定を行うのだとしたら最初にキー入力を受け付けた以降
   8414       は bashrc の中ではないと判断できるのではないか。
   8415 
   8416     2 ok: 最初に bashrc の外で history -c を実行したという事が分かった時点で、
   8417       それ以降は履歴が空であっても通常通りに処理するべきなのではないか。と思っ
   8418       たがそれは元からそういう振る舞いだった。
   8419 
   8420     3 或いは単に ble-decode/.hook の内部から呼び出されているという事だけ見れば
   8421       良いのではないか? と思ったが実際のコマンド実行は ble-decode/.hook の後で
   8422       呼び出される hook 変数だった。それよりは edit.sh の .head と .tail の間に
   8423       いる事を判定すれば良い気がする。然し、そういう変数は敢えて設定していない。
   8424       見るとすれば stdout.on/stdout.off の状態だろうか。と思ったがこちらも敢え
   8425       て状態管理はしていない。
   8426 
   8427       a だとすると .head 及び .tail の側に明示的に状態を設定する変数を新しく設
   8428         置する?
   8429 
   8430       或いは既にある枠組みで何とかならないだろうか。decode.sh 関連は
   8431       _ble_decode_bind_hook の内部で実行されるコマンドをカバーできないので駄
   8432       目。_ble_attached だと、bashrc の中で attach して未だ抜けていない状態の時
   8433       に駄目。edit.sh のコマンド実行関連だと、コマンド実行の外で実行されるコマ
   8434       ンド (trap や PROMPT_COMMAND や bind -x など) がやはり漏れてしまうので駄
   8435       目である。
   8436 
   8437       それを言い出したら .head/.tail に関しても、その外側で処理が走る場合がある
   8438       のではないかという気もするが、今のところはその様な事はない気がする。Bash
   8439       側のコマンド実行も行わないので余分なコードは全く実行されない。然し、将来
   8440       的に異なるコマンド実行の枠組みができた時に .head/.tail の外側で実行して振
   8441       る舞いが変だったという事になるのも嫌なのでちゃんと設計しておきたい気がす
   8442       る。
   8443 
   8444       そもそも今欲しいのは .head/.tail の中かどうかという事ではなくて bashrc の
   8445       外にいるかという事を判定する方法である。なので、それ専用の関数を作ってそ
   8446       の他の場所に対する変更は最小限に留めるべきである。なので、.head, .tail を
   8447       わざわざ状態に記録しなくても最初の .head の呼び出しまたは
   8448       ble-decode/.hook 受信の時に変数を設定してしまえば良いだけである。
   8449 
   8450       b 既に keylog があるのであればその初回実行時に値を記録すれば良いのでは。
   8451         と思ったがこれはループの大分内側にある様だ。やはり最初の PROLOGUE 呼び
   8452         出しの辺りで何か値を設定するべきなのだろうか。
   8453 
   8454         うーん。ble-decode/.hook 自体に何回呼び出されたかの回数として
   8455         _ble_decode_hook_count を記録する事にした。こうなってはコスト的には余り
   8456         変わらない。
   8457 
   8458     取り敢えず _ble_decode_hook_count を導入し、それを参照して bashrc 内部でな
   8459     い事が保証できる場合には history の処理をちゃんと実行する様にした。
   8460 
   8461     或いは PROMPT_COMMAND でそれが実行される事もあるだろうか? 然し、その場合に
   8462     は ble-attach を bashrc から実行してその中から PROMPT_COMMAND を呼び出す場
   8463     合を考えるとやはり履歴が初期化されていることを保証できないので、やはり
   8464     history -cw は初回の PROMPT_COMMAND では無視される事になる。なので初回の
   8465     PROMPT_COMMAND は動作保証しないという事にする。
   8466 
   8467     2023-07-03 実際に試してみたら動かない。history -w を実行しても何も書き出し
   8468     がされない。うーん。 .write の実装を見たらそもそも histapp が空の時には何も
   8469     実行しない様になっていた。これが原因である。
   8470 
   8471 2023-06-29
   8472 
   8473   * edit (.newline): overwrite mode の表示は消すべき (requested by mozirilla213) [#D2052]
   8474     https://github.com/akinomyoga/ble.sh/issues/337
   8475 
   8476     元々 overwrite のマーカーは実際に着色しているつもりでいた。これをカーソルだ
   8477     と思っているのだとしたら確かに残るのは変だ。これは単に region 着色を解除す
   8478     れば良いだけだろうか。と思ったが overwrite_mode はまた独立した layer だった。
   8479     実装方法には二種類ある。
   8480 
   8481     a overwrite mode を解除してからコマンドを実行する
   8482 
   8483       overwrite mode は _ble_edit_overwrite_mode で管理されている。
   8484 
   8485     b もしくは _ble_edit_line_disabled と同様にして再描画の際に無効化するか。と
   8486       思ったが、_ble_edit_line_disabled は C-c 等で灰色にする場合の物であって、
   8487       最終描画に使う物ではない。しかも _ble_edit_line_disabled は各 layer を
   8488       off にする機能ではなくて、disabled という layer を一番上に被せるという形
   8489       で実装されていた。
   8490 
   8491 2023-06-26
   8492 
   8493   * syntax: $(()) の中で "" が含められないということ (reported by mozirilla213) [#D2051]
   8494     https://github.com/akinomyoga/ble.sh/issues/336
   8495 
   8496     動作を確認してみたら 4.3 では駄目だったが 4.4 以降では動く様だ。(()) ではど
   8497     のバージョンでも動く。
   8498 
   8499     更に別の問題についても気づいてしまった。$((\10)) はどのバージョンでも失敗す
   8500     るが、ble.sh は常に許容している。一方で、((\10)) は 5.0 までは動いていた。
   8501     5.1 から動かなくなっている。また色々調べるともっと複雑である。
   8502 
   8503     context        expr = \10    expr = "10"    ASSIGNED NTYPE
   8504     ------------   ------------  -------------  --------------
   8505     $((expr))      false         bash >= 4.4    expr-paren-ax
   8506     $[expr]        false         bash >= 4.4    expr-paren-ax
   8507     $((a[expr]))   bash < 4.4    true           expr-brack-ai
   8508     $[a[expr]]     bash < 4.4    true           expr-brack-ai
   8509 
   8510     ((expr))       bash < 5.1    true           expr-paren
   8511     ((a[expr]))    bash < 5.1    true           expr-brack
   8512 
   8513     a[expr]        bash < 4.4    true           expr-paren-ai
   8514     b[a[expr]]     bash < 4.4    true           expr-brack-ai
   8515     ${a[expr]}     bash < 4.4    true           expr-paren-ai
   8516     ${a[b[expr]]}  bash < 4.4    true           expr-brack-ai
   8517     printf -v a[x] bash < 4.4    true           expr-paren-ai
   8518     printf -v a[b[ bash < 4.4    true           expr-brack-ai
   8519 
   8520     ${v:expr}      false         bash >= 5.2    expr-paren-br?
   8521     "${v:expr}"    false         bash >= 5.2    expr-paren-br?
   8522     ${v:a[expr]}   bash < 4.4    true           expr-brack-ai
   8523     "${v:a[expr]}" bash < 4.4    true           expr-brack-ai
   8524 
   8525     a=([expr]=)    true          true           expr-paren-di
   8526     a=([b[x]]=)    true          true           expr-brack-di
   8527 
   8528     ? $["10"] はどうなのか → 4.4 以降では動く。うーん。全体的に改めてどの様な
   8529       文脈で quote が許されるのか確認する必要がある。
   8530 
   8531     * うーん。'NQ(' の導入は割と古くて #D0375 である。取り敢えず新しい文脈を導
   8532       入してしまう事にする。取り敢えず実装した。思ったがちゃんと反映されていな
   8533       い。
   8534 
   8535     x fixed: $((\10)) でエラー着色になっていない。と思ったら単に新しく用意した
   8536       関数 ctx-expr/.check-plain-with-escape を呼び出していなかった。呼び出す様
   8537       にしたら期待通りに動作する様になった。
   8538 
   8539     * single quote 等の振る舞いは大丈夫なのか? → 調べてみた所 \10 と全く同じ振
   8540       る舞いである。
   8541 
   8542     x 気づいてしまったのだが算術式中の a[expr] は更にそれがどの文脈だったかによっ
   8543       て振る舞いが変わる。
   8544 
   8545     x reject: うーん。面倒な事に気づいた。${} や (()) の中では現在は [] の入れ
   8546       子は追跡していない。しかし実際には quote の取り扱いが変わるのでそこまでちゃ
   8547       んと対応しようと思ったらちゃんと追跡する必要が出てくる。しかし、一方で
   8548       ${} や (()) の中では [] の入れ子は ${} および (()) 全体の終了に対しては考
   8549       慮されない。うーん。
   8550 
   8551       これはまた two-pass parsing の問題である。((...)) を抽出する時には [ を無
   8552       視して、次の解析で [ の入れ子を処理している。これはどうしようもないので対
   8553       応しない事にする。
   8554 
   8555       → ページ上部の構文解析を諦めたものに追加した。
   8556 
   8557     * うーん。振る舞いが複雑すぎるのでテストを用意するべきの気がする →
   8558       memo/D2051.sh に作った。
   8559 
   8560     x fixed: Bash では `echo 10` はいつでも有効の様だ。これに対応できていない。
   8561       →対応した。
   8562 
   8563   * util: ble/builtin/readonly が bash options で壊れる (reported by dongxi8) [#D2050]
   8564     https://github.com/akinomyoga/ble.sh/issues/335#issuecomment-1598485650
   8565 
   8566     readonly builtin: readonly BASH_COMPLETION_COMPAT_DIR がエラーになる。これ
   8567     は何故だろう。Ubuntu 16.04 LTS でも再現しない。
   8568 
   8569     nocasematch? → これは nocasematch だった。nocasematch に対して耐性のある書
   8570     き方をするか、或いは ble/builtin/readonly を他の ble/builtin と同じ様に
   8571     bash オプションの保存・復元を行うかする必要がある。というか、set -xv 等の事
   8572     を考えるとやはり保存・復元は実行するべきだ。
   8573 
   8574     ble/builtin/readonly の最初と最後で呼び出す事にした。
   8575 
   8576     ? 既に adjust-bash-options されている状態で呼び出しても問題ないのか気になる
   8577       が、既に様々の関数でその様にしている事を思うと問題はないはずである。特に
   8578       これらの関数は外側の状態を (グローバル変数ではなく) ローカル変数に記録し
   8579       てそれをまた復元するという形を取っている。なので問題ない筈。
   8580 
   8581     2023-08-17 まだ問題があるという。然し問題が起こる理由が分からない。
   8582 
   8583     古い ble.sh をロードしてから後で新しい ble.sh をロードしている可能性もある
   8584     のではないか。取り敢えず nocasematch / nocaseglob が怪しくてそれを修正した
   8585     ら手元では再現しなくなった。
   8586 
   8587     a その他の可能性は bash-4.3 では問題が依然として発生するという事→再現しな
   8588       い。
   8589 
   8590     b 或いは、Ubuntu 16.04 LTS だと問題が発生するという可能性→これも再現しない。
   8591 
   8592     c oh-my-bash と組み合わせると問題が発生するという可能性? → 特に問題は発生
   8593       していない。
   8594 
   8595 2023-06-12
   8596 
   8597   * complete: fzf-completion で生成された path が full path になる (reported by teutat3s) [#D2049]
   8598     https://github.com/akinomyoga/ble.sh/issues/329
   8599 
   8600     これは fzf-completion が raw command line を利用して raw insert を意図した
   8601     候補を生成するからそれに合わせて振る舞いを調整した事に関係している。然し、
   8602     依然として一部の path 名に関しては bash は PREFIX を取り出して処理する様だ。
   8603     例えば common prefix を取り出してその / 以前の部分を削除してしまえば良いの
   8604     だろうか。或いは、COMPS について / 以前の部分を common prefix にしてしまえ
   8605     ば良い気がする。
   8606 
   8607     →うーん。調べてみると既に compopt -o filenames が指定されている場合には
   8608     progcomp 側で自動的に COMP_PREFIX を指定して補完が実行される事になっている。
   8609     そして、fzf completion 側でも実際に compopt -o filenames を指定している様だ。
   8610     然し、問題は COMP_PREFIX が COMPV を元にして構築されている為に正しく prefix
   8611     除去が動いていないという事だった。ble/syntax-raw が指定されている場合には
   8612     COMPS を元にして COMP_PREFIX を決定する様に変更する。
   8613 
   8614     x fixed: sabbrev 候補生成が通常候補生成よりも後になっているので、
   8615       fzf-completion で何も入力がない状態から何か候補を選択したとしても、一意確
   8616       定せずに sabbrev と fzf-completion で選択した候補の選択画面になってしまう。
   8617       以前は sabbrev 候補をより前に生成していたので単純に既に生成された候補を全
   8618       削除すれば良かったが、 #D2011 により候補の生成順序を変更した。
   8619 
   8620       sabbrev 生成も抑制する仕組みが必要になるのではないか。
   8621 
   8622       a -o bashdefault に代わる何か? → bashdefault は何も生成されなかった時に
   8623         既定の補完を行うものなので関係ない。
   8624 
   8625       b compopt の拡張を行おうとしたら、どうやら既に ble/no-default というオプ
   8626         ションが実装されている様だ。これは補完候補が生成されなかった時に
   8627         fallback で既定の補完を実施しないという意味であるが、補完候補が生成され
   8628         た場合の振る舞いにも拡張する事ができる。これを fzf-completion 側で呼び
   8629         出させて、sabbrev 候補生成は ble/no-default が指定されなかった時に呼び
   8630         出す様にすれば良い。
   8631 
   8632   * complete: support `bleopt complete_requote_threshold` (requested by rauldipeas) [#D2048]
   8633     https://github.com/akinomyoga/ble.sh/issues/332
   8634 
   8635     本当に必要な機能なのか怪しいが面倒なので実装する事にする。
   8636 
   8637 2023-05-23
   8638 
   8639   * [棄却] builtin: logout コマンドは上書きしなくても大丈夫なのか [#D2047]
   8640 
   8641     % 試しに logout を実行してみたらログインシェルではないという具合いにエラーに
   8642     % なって何も起こらなかった。bind -x の内部からだと logout は実行できない仕組
   8643     % みになっているのかもしれない→と思ったが本当にログインシェルでないと logout
   8644     % は実行できない様だ。つまり SHLVL==1 という事か?
   8645 
   8646     実際にログインシェルで実行してみた所ちゃんと終了する。ジョブが残っている場
   8647     合にもちゃんと一旦停止はする様だ。
   8648 
   8649     a 現在の振る舞いのままで良いだろうか。unload がちゃんと実行されているのか確
   8650       認する必要がある→ちゃんと unload は実行される様だ。
   8651 
   8652     b 単に ble/builtin/exit に置き換えれば良いのだろうか。或いは、ble-detach と
   8653       同じ様に logout という状態を設定して、その上で処理が終わった段階で終了を
   8654       行うか。
   8655 
   8656       → ble/builtin/exit に置き換えるとログインシェルかどうかのチェックもなく
   8657       振る舞いが変わってしまう。特に問題がない限りは logout はそのままでも良い
   8658       気がしてきた。
   8659 
   8660       特に exit に介入している理由の一つは nix 等の設定で EXIT trap の中で更に
   8661       exit を呼び出している場合など変な事をしている場合に無限ループになったりな
   8662       どの問題が起こらない様にするための物である。
   8663 
   8664     取り敢えず現状のままという事にする。
   8665 
   8666   * stty: exit 後の stty 状態が壊れている in bash-5.2+ [#D2046]
   8667 
   8668     | 何故か bash --norc, bash, exit とした後に端末状態が壊れる様になった。何時
   8669     | から起こる様になったのかを先ずは調べる。ble-0.3 では問題は発生していない。
   8670     | つまり、やはり ble.sh の側の何らかの設定が関係していると思われる。
   8671     |
   8672     | 調べてみると 5b351e89 (2022-08-24) から発生する様になっている。今までずっ
   8673     | と気付かなかったのも不思議であるが、たまたま bash --norc から bash を起動
   8674     | する事がなかっただけなのかもしれない。或いはまた別の設定経由で動かなくなっ
   8675     | たという事だろうか。問題は何だろうか。例えば exit trap が起動していない可
   8676     | 能性がある? だとすると bgproc が放置されている事の原因も分かる。
   8677     |
   8678     | 取り敢えず stty がちゃんと呼び出されているかだけ確認する。どうやら最近ま
   8679     | で気付かなかった理由が分かった。bash-5.1 では問題が発生しない。bash-5.2
   8680     | および dev で問題が発生している。違いは bash-5.1 の中では EXIT trap は全
   8681     | ての関数が抜けた後に発生しているのに対して bash-5.2 の中では EXIT trap が
   8682     | 即座に実行されている事の様である。
   8683     |
   8684     | * うーん。stty 実行時に stdout,stderr が redirect されているのが原因かと
   8685     |   も思ったがそうでもない様だ。stty 実行時に全てを /dev/tty に繋ぎ直したと
   8686     |   しても問題は解決しなかった。
   8687     |
   8688     |   元々 stdin が残っていたがこれだけでもちゃんと動く筈という事の気がする。
   8689     |   5.1 で stdout/stderr を潰しても動くか試してみる。うーん。5.1 だと
   8690     |   stdin/stdout/stderr の全てを潰しても問題は発生しない。つまり、stty がちゃ
   8691     |   んと効いているかどうかというのは実は今見ている問題とは関係がないという
   8692     |   事だろうか。
   8693     |
   8694     |   うーん。やはり readline の終了時に stty を何か元の状態に復元する段階で
   8695     |   変な事になっている気がする。然しそうだとしても ble.sh による再調整が走っ
   8696     |   ているという訳でもない気がする。
   8697     |
   8698     | そもそも ble-detach で抜けた時には問題は発生していないか→ble-detach で抜
   8699     | けた時には特に問題は発生していない。ble-detach で抜けた時には echo はちゃ
   8700     | んと入っている様だ。一方で改行も無駄に echo されている気がする。
   8701 
   8702     [まとめ] この問題は bash-5.2 以降で trap EXIT がその場で実行される様になっ
   8703     た事で、trap EXIT が bind -x の内部で実行される様になり、内部で実行した
   8704     stty 復元の効果が bind -x 終了時に元に戻されてしまう事によって起こる。bind
   8705     -x の外で trap EXIT を実行する方法があれば良いが今の所はその様な方法は見つ
   8706     かっていない。
   8707 
   8708     a 可能性として一旦 detach してから exit するという可能性? C-d で終了を試み
   8709       る場合には一旦 detach (もしくは ble/term/stty/finalize だけ実行) してから
   8710       終了するのは技術的には不可能ではない気がする。然し、exit を実行された場合
   8711       にはその様に一旦 readline に制御を戻す余裕もない。
   8712 
   8713       exit を強制的にキャンセルして、exit を emulate して top-level に戻り、更
   8714       に detach を行ってから自前で exit をするという事も技術的には可能だろうか。
   8715       然し、exit の振る舞いを正確に再現するのは難しいのではないかという気がする。
   8716       特に redirections 等の復元はどうするのかなど。
   8717 
   8718       % というか一旦 trap EXIT が発火した時点でキャンセルする方法はない気がする。
   8719       % と思ったが現在の議論はユーザーは上書きされた exit か logout を用いて終
   8720       % 了するという想定をしている。
   8721 
   8722     b 或いは subshell で遅延してから stty を実行するという手があるだろうか? 然
   8723       し、それだと例えば呼び出し元の shell がやはり ble.sh だった時に、遅延され
   8724       て stty が実行されて stty が予期しない状態になってしまう。readline の収量
   8725       処理が終わった後にその subshell が終了するまでブロックする仕組みが必要に
   8726       なるが、その様な方法はない気がする。
   8727 
   8728     c 或いは諦めて呼び出し元が ble.sh session でない場合には stty sane を実行す
   8729       る様に指示するメッセージを出す? 然し、端末の top-level だと常に表示されて
   8730       しまい一々報告が来る事になる気がする。
   8731 
   8732       tty の一番大元であるかどうかを判定する方法はあるか?
   8733 
   8734       a reject: SHLVL? と思ったがこれは tty とは関係なく入れ子のレベルをカウン
   8735         トするので screen や tmux でもカウントされてしまう。やはり端末の
   8736         top-level かどうかを判定する必要がある気がする。
   8737 
   8738       b reject: 現在の session leader かどうかを調べれば良いのだろうか。然し、
   8739         現在のプロセスが session leader かどうかを判定する方法はあるのか。
   8740         session id がそのまま process id であれば良い様だ。session id は procfs
   8741         があれば /proc/$$/sessionid から読み取れる様だ。然し、これを調べてみる
   8742         と screen では単に screen が起動した session の id が全ての buffer に継
   8743         承されている様に見える。なので使い物にならない。
   8744 
   8745       c 或いは単に PPID の tty をチェックすれば良いのかもしれない。と思ったが
   8746         pid から tty を抽出する方法がよく分からない。ps ができているのだから
   8747         procfs でのやり方はある筈と思ったがよく分からない。単に /proc/$$/fd/0
   8748         を読み取るしかないのだろうか。でもその為には readlink を呼び出す必要が
   8749         ある。外部コマンドを呼び出す必要があるのであれば単に ps を呼び出すのが
   8750         早い。
   8751 
   8752       或いは tty の大元であるという判定ができるのであれば、その上でもっと積極的
   8753       な修正を試みる可能性もある?
   8754 
   8755       * reject: サブシェルから stty sane? もし親プロセスが ble.sh でないのであ
   8756         れば問答無用でサブシェルから stty sane を実行してしまっても良い様な気も
   8757         するが、親プロセスが即終了して更に更に親プロセスに制御を戻す場合に、そ
   8758         の更なる親プロセスに stty sane が影響を与えないかどうかは非自明である。
   8759         というかそもそも親プロセスだって raw モードで文字列を読み出したいと思っ
   8760         ている可能性もある。という事を色々考えるとサブシェルから stty sane を呼
   8761         び出すのはやはり問題がある。
   8762 
   8763     仕方がないので取り敢えずは c の方針で stty sane を実行する様にメッセージを
   8764     出す事にした。結局現状では疑わしい状況の時にメッセージを出すだけであるが仕
   8765     方がない。
   8766 
   8767 2023-05-21
   8768 
   8769   * syntax: bash-5.3 ${ list; } 対応 [#D2045]
   8770 
   8771     * ble/util/assign の置き換え
   8772 
   8773       * set -m 等をして独立した PGID が作られるかの確認。この振る舞いが
   8774         util.bgproc からの要求になっている。
   8775 
   8776         echo "$(set -m; sleep 5 >/dev/null & pid=$!; ps -o pid,ppid,pgid "$$" "$pid")"
   8777 
   8778         これは作られないと分かっている。
   8779 
   8780         echo "${(set -m; sleep 5 >/dev/null & pid=$!; ps -o pid,ppid,pgid "$$" "$pid")}"
   8781 
   8782         これはちゃんと作られる。OK。因みに
   8783 
   8784         echo "$( (set -m; sleep 5 >/dev/null & pid=$!; ps -o pid,ppid,pgid "$$" "$pid") )"
   8785 
   8786         も作られる。なので元々其処まで気にしなくても良かったのかもしれない。
   8787 
   8788       取り敢えず ble/util/assing を ble/util/assing に置き換えてみたがこれで実
   8789       行するとエラーが沢山発生する。これは既に報告されているエラーである。これ
   8790       が修正されるのを待って改めて置き換えて動作確認を行う。
   8791 
   8792       取り敢えず Oguz の報告した以下の問題が解決されたようである。今のところは
   8793       何の問題もなく動いている。取り敢えず push して良い気がする。
   8794       https://lists.gnu.org/archive/html/bug-bash/2023-05/msg00045.html
   8795 
   8796     * syntax 対応
   8797 
   8798       * 振る舞いについて調べる
   8799 
   8800         説明に書かれているのには反して ${(echo);(echo)} も動くし ${(echo) } も
   8801         動く。ちゃんと直感的な実装になっている。
   8802 
   8803         ${ { list; } } もちゃんと {} の入れ子を考慮した実装になっている。一方で
   8804         これを ble.sh の側で対応しようとすると {} の入れ子を追跡していない。
   8805 
   8806       [実装]
   8807 
   8808       a 改行判定の時と同じ様に {} の数を数えて処理すれば良いかとも思ったが、そ
   8809         うすると解析状態とは別の状態に依存する様になってしまうので駄目。
   8810 
   8811       b 或いは nest の中に {} のカウントを保存する?
   8812 
   8813       c もしくは解析状態に {} の入れ子を記録する。
   8814 
   8815       d 或いは {} の入れ子もちゃんと処理する様に変更する。
   8816 
   8817       現実的に d の方向で実装するしかない様な気がする。或いは
   8818 
   8819       e ${ ... } の内部の {} の時にのみ入れ子を数える。
   8820 
   8821       うーん。算術式ですら [] で nest を作成しているのだから {} で入れ子構造を
   8822       作るのが妥当の気がする。
   8823 
   8824       何れにしても取り敢えずは実装を考える。
   8825 
   8826       うーん。やはり単純に数える方が実装が楽なのではないか。現在の実装だと for
   8827       ... { ... } 等に於いて for と } を組みにしてちゃんと構文が閉じているかを
   8828       判定している。ここで {} を入れ子にして解析する事にすると、for も一緒に入
   8829       れ子解析を実装しなければならなくなる。然し、単純に数える実装にするとやは
   8830       り状態をどのように記録するのかという問題が生じる。或いは、{} で nest 構造
   8831       を作るにしても keyword の begin/end は今までと同じ様に取り扱う。それで良
   8832       い気がする。
   8833 
   8834       最終的に d で実装したが実は簡単だった。
   8835 
   8836     2023-06-12 結局 ${( は対応しない事になったようなので削除する。もしかすると
   8837     これは zsh の attributes との互換性を考えての可能性もある。
   8838 
   8839 2023-05-16
   8840 
   8841   * main: --inputrc=TYPE の設定を適用する前に read-inputrc を呼んでいる [#D2044]
   8842 
   8843     osh を実行していて気づいたが --inputrc=none が効いていない。一方で最近の
   8844     issue のデバグで効果があった様に見えたのは謎である。
   8845     https://github.com/akinomyoga/ble.sh/issues/322#issuecomment-1539265410
   8846 
   8847     取り敢えず修正は適用しておく事にする。
   8848 
   8849   * util: idle.do 無限ループ [#D2043]
   8850     Ref #D1980 (2023-02-27)
   8851 
   8852     Ubuntu で idle.do が無限ループになっている。どうやらファイル待ち状態になっ
   8853     ているが sleep を全くしていない様である。これは 559d64b8 の regression であ
   8854     る。条件式が微妙に間違っている。
   8855 
   8856     また、これが最近 bash の処理量が多い理由なのではないかという気がする。約二ヶ
   8857     月半の間、idle.do が無駄に無限ループしていたという事になる。
   8858 
   8859     * それとは別に何故ファイルが作られずに失敗しているのかという問題がある。うー
   8860       ん。VM の中であることによって何らかの事故によって git がクラッシュしてい
   8861       る等?
   8862 
   8863     * それから core-debug-def.sh が ble/debug/profiler/end を export しているが
   8864       実際に定義されるのは ble/debug/profiler/stop である。修正した。
   8865 
   8866     2023-05-16 無限ループは直っていない。と思ったら物凄く簡単なミスをしていた。
   8867     修正する。
   8868 
   8869 2023-05-14
   8870 
   8871   * progcomp: _parse_help 経由で生成された項目に uniq をかける? [#D2042]
   8872 
   8873     bash-completion が重複したオプション項目を出した時に ble.sh はそれにそのま
   8874     ま記述を追加してメニューに表示するので同じ候補が二つ表示されてしまう。
   8875 
   8876     sed --e[TAB]
   8877 
   8878     うーん。既に uniq はかけられている。問題は bash-completion が --expression
   8879     と --expression= を両方出すが、ble.sh が --expression を mandb によって補填
   8880     して --expression= に変換する事である。そもそも bash-completion が両方出す
   8881     のも変な事なので、どちらか一方を出力するので問題ない。
   8882 
   8883     オプション候補に対して説明を付加する時点で = を除いた状態で重複がないかチェッ
   8884     クして、その上で出力する様に修正する事にした。
   8885 
   8886 2023-05-13
   8887 
   8888   * progcomp: _parse_help の代わりに新しい _comp_compgen_help に介入 [#D2041]
   8889 
   8890     新しい実装は _parse_help ではなく新しい関数名に対して advice を仕掛ける必要
   8891     がある。
   8892 
   8893     うーん。
   8894 
   8895     x fixed: 今までの実装で _parse_help - に対しての介入がちゃんと動いているか
   8896       怪しい。この実装だと本来 _parse_help が読み取る筈だった stdin を盗んでし
   8897       まうのではないか。キャッシュが一旦出来上がればもう読み取らないので問題な
   8898       い。
   8899 
   8900     * ok: 実装チェック。bash-completion 2.11 の iperf -[TAB] が _parse_help -
   8901       を呼び出す。ちゃんと動いている。その他の場合についても
   8902 
   8903       $ awk -F "$_ble_term_FS" '{print $1}' "$subcache" >/dev/tty
   8904       $ echo $(awk -F "$_ble_term_FS" '{print $1}' "$subcache") >/dev/tty
   8905 
   8906       でチェックする。sed -[TAB] は _longopt で smartctl -[TAB] は _parse_help
   8907       "$1" のテストになる。bind -[TAB] は _parse_usage のテストになる。取り敢え
   8908       ず何れも期待どおりに動いている。
   8909 
   8910       bash-completion 2.12 の方でもちゃんと動く事を確認した。
   8911 
   8912   * cmdspec: その他の builtin のオプションの対応 (motivated by EmilySeville7cfg) [#D2040]
   8913     https://github.com/akinomyoga/ble.sh/issues/325#issuecomment-1545474274
   8914 
   8915     これらは bash builtin なので man で情報を正しく抽出できない。代わりに help
   8916     builtin で取得する必要があるが、これは明示的に指定する必要がある。
   8917 
   8918     * reject: builtin コマンドに対する既定の cmdspec を定義する? 或いは type で
   8919       builtin だったら fallback として builtin 用の cmdspec を既定で適用する可
   8920       能性? と思ったが ble/cmdspec/opts は補完専用の枠組みという訳でもなく、必
   8921       要もないのに type で builtin かどうかを確認するのを既定で行うのも憚られる。
   8922       やはり、一つ一つ全部指定した方が良い様に思われる。
   8923 
   8924     * done: pushd, popd, dirs の -N/+N の実装
   8925 
   8926       pushd に関しては既に core-complete の中で cd と一緒に実装していた。それに
   8927       追加する形で popd と dirs も実装する。
   8928 
   8929     * mandb-help=@-- が認識されていないのは何故か。どうも明示的に無視されている
   8930       様である。同じ mandb-help=@ に指定していても -- だけは認識されていない。
   8931 
   8932       或いは実装上の都合で意図的に -- を除外しているのだったか? と思ったが思い
   8933       当たる事はない。実際に動作を追っていくと mandb の段階では -- はちゃんと生
   8934       成されている。何処かで消滅しているという事だろうか。
   8935 
   8936     取り敢えず対応した。
   8937 
   8938     x ok: pwd の man-disable-man が効いていない気がする。man pwd から拾ってきた
   8939       オプションを表示している。と思ったが単にキャッシュが更新されていないだけ
   8940       だった。
   8941 
   8942     x test の disable-double-hyphen が効いていない。と思ったら
   8943       disable-double-hyphen は別の用途だった。新しく mandb-exclude という項目を
   8944       作る事にした。
   8945 
   8946 2023-05-12
   8947 
   8948   * progcomp: cd の short flag 補完で文字そのものを候補として表示しているが分からにくい (requested by EmilySeville7cfg) [#D2039]
   8949     https://github.com/akinomyoga/ble.sh/issues/325#issuecomment-1545474274
   8950 
   8951     cd の short option 実装で -xxx の中に含まれる short option を選べる様にしよ
   8952     うとしている。この関係で表示される候補は -c ではなくて文字そのもの c である。
   8953 
   8954     * done: 表示文字列は -c の形にする。ここで実際に挿入される文字列はともかく
   8955       として表示状は -c 等の様にする事はできるだろうか。或いは最初のオプション
   8956       だけは - 付きで表示して、short flags の二つ目以降はその文字その物を補完す
   8957       る様にするのが簡単で良いだろうか。しかしその文字だけを表示するのも何だか
   8958       変な気がするし、絞り込みをする際にも何だか変な気がする。という事を考える
   8959       とやはり表示状は常に - になる様にするのが良いだろうか。→取り敢えず表示さ
   8960       れる文字列に関しては - をつける事にした。
   8961 
   8962     * done: 本来は desciption を help から拾って来たい。mandb を呼び出して一緒
   8963       に表示する様にしたい。取り敢えず実装した。
   8964 
   8965       これは汎用性があるので関数に分離したい気がする。分離した。
   8966 
   8967     x reject: 一意確定を mandb を用いて行うと補完確定時に空白が挿入されない。
   8968       word だとちゃんと挿入される。何故か。と思って改めて実行してみたらちゃんと
   8969       動いている。何かの勘違いか。
   8970 
   8971     * fixed: -@ に対する説明を抽出できていない。
   8972 
   8973       これは実装を調べていたら _ble_complete_option_chars という変数でオプショ
   8974       ンとして許される文字の集合が管理されていた。これに @ を追加すれば良い。
   8975 
   8976     * fixed: -P に対する説明が help 出力の関係ない部分を拾っている。それらしい
   8977       物が複数見つかった時にどちらを優先させるのかについて決める必要がある。例
   8978       えばより長く空白が間に入っていたものを優先させるなど。現在の実装だと引数
   8979       らしい物がくっついていた場合にそれを優先する様になっているがそれは変だ。
   8980 
   8981       或いは空白が複数続いている物を優先させる等の処置が必要かもしれない。単一
   8982       空白しか行内に含まれていない物については優先度を下げるなど。完全に排除し
   8983       てしまうとそれはそれで説明抽出できない物が発生するかもしれない。
   8984 
   8985       優先順位を計算して記録する仕組みを作るのは大変だと思ったが改めて実装を確
   8986       認したら既にそのような仕組みが実装されていた。但し、インデントベースで決
   8987       定されている。つまり、インデントの深さが浅い物を優先させる様になっている。
   8988       空白が一つも含まれていない行の場合には優先順位を 100 だけ下げるのような感
   8989       じの処置を追加で実装すれば良い。
   8990 
   8991       実装した。動いている。
   8992 
   8993     x CAND を勝手に変更して実装しているが本当にそれで良いのか? CAND は
   8994       menu-filter にも使われれているので実際に挿入する物と異なる物を設定すると
   8995       メニュー項目が消滅する等して面倒な事になるのではないか。
   8996 
   8997       本来は固有の action を割り当てて表示の時に内容を書き換えるべきなのではな
   8998       いか。
   8999 
   9000       改めて実装を見てみたら表示の時に prefix を設定できる。という事は - を追加
   9001       するのも簡単である。新しい action mandb.flag を定義して実装した。動いてい
   9002       る様に見える…が座標位置の計算がずれてしまう。
   9003 
   9004     2023-05-14 オプションの着色にも @ を含めるべきではないのか。これは
   9005     ble/progcolor/word:default/.is-option で判定している。正規表現を確認すると
   9006     alnum _ しかチェックしていない。
   9007 
   9008     x menu-filter による再描画で prefix が表示されず、更に座標位置がずれる。
   9009 
   9010       どうも menu-filter による再描画の際に prefix が正しく描画されていないのが
   9011       原因の様である。menu-complete による選択時には問題はない。という事は再描
   9012       画の際にやはり問題になっているという事。
   9013 
   9014       →うーん。分かった。一致着色部分を構築する時に local out= を実行してしまっ
   9015       ている所為で prefix の中身が消えてしまっている。修正した。
   9016 
   9017       これは 0.3 では影響ないだろうか → うーん。0.3 でも影響がある。修正する必
   9018       要がある。独立した commit にするべきの気がする。
   9019 
   9020   * mandb: Ubuntu で echo に対する解析結果でオプションと説明の単語がくっつく (reported by EmilySeville7cfg) [#D2038]
   9021     https://github.com/akinomyoga/ble.sh/issues/325
   9022 
   9023     制御文字を全て削除する段階でくっついてしまう様だ。何故か環境によって TAB を
   9024     使ってオプション名と説明の間を区切っていたりそうでなかったりする様だ。取り
   9025     敢えず TAB は空白に変換する事にした。空白一つに変換すると距離が近すぎる事に
   9026     よってオプション引数と間違われる。2つでもオプション引数と解釈する様なので 3
   9027     つ以上である必要がある。きりの良い 4 空白に置換する事にする。
   9028 
   9029   * main: Ubuntu では nawk という名前で gawk が入っている [#D2037]
   9030     https://github.com/akinomyoga/ble.sh/issues/322#issuecomment-1543766152
   9031 
   9032     こういうおかしな事をするから Ubuntu は駄目だ。他の os はそんな事はしていな
   9033     い。取り敢えずバージョン文字列を nawk に対してはチェックする事にした。
   9034 
   9035     バージョン抽出する為に awk --version のような具合にしていたがこれだと mawk
   9036     が動かない。-W version と --version の両方を試す事にした。また、nawk は単に
   9037     nawk -W version とすると標準入力を読み取る状態になってしまって固まってしま
   9038     うので </dev/null をリダイレクトする事にした。
   9039 
   9040     但し、これを修正しても echo の補完の問題 #D2038 は解消していない。echo の補
   9041     完の問題に関しては独立にちゃんと修正する必要がある。独立な項目で修正する。
   9042 
   9043 2023-04-12
   9044 
   9045   * 2023-03-24 histdb: sqlite3 がクラッシュする? [#D2036]
   9046 
   9047     或いは timeout した物の情報が同期されていなかった可能性? timeout をより短く
   9048     して再現するかどうか確認する必要がある。
   9049 
   9050     2023-04-12 これは頻繁に起こっている。と思って改めてコードを確認してみたが、
   9051     どうもクラッシュしていても自動で停止していても #alive は false になるので、
   9052     #alive でなかったからと言ってクラッシュしたという訳ではない。クラッシュした
   9053     かどうかの判定をしたければまた別の関数を作るしかない。然し、わざわざ別の関
   9054     数を作ってチェックする必要があるのかも分からない。然し、現在はテスト段階で
   9055     もあるしやはり微妙な失敗でもちゃんと検索して表示する様にしたい。
   9056 
   9057 2023-04-09
   9058 
   9059   * chore: 古いテスト用のファイルや説明用のサンプルを保存する [#D2035]
   9060 
   9061     * gitignore を更新して表示から除外するものを増やした
   9062     * e.sh は refact.sh に合流。
   9063 
   9064     未だ幾つか残っているが取り敢えずはそのままにする。
   9065 
   9066   * bgproc, conditional-sync: support opts "kill9-timeout=TIMEOUT" [#D2034]
   9067 
   9068     * fix(conditional-sync): pid が opts で指定されていない時に、グローバルの
   9069       __ble_pid を変更してしまう問題の修正。色々書き換えている時に残ってしまっ
   9070       た && を削除する。
   9071 
   9072     ? OK: kill -9 の 9 はシステムに依存しないと思って良いのか?  POSIX の kill
   9073       によると SIGKILL は 9 であると定められている様だ。なので気にしなくて良い。
   9074       https://pubs.opengroup.org/onlinepubs/9699919799/utilities/kill.html
   9075 
   9076     * bgproc: kill9-timeout で SIGKILL までの timeout を指定できる様にした。
   9077 
   9078   * 2023-04-05 bgproc: exec に関する説明を書く [#D2033]
   9079     https://github.com/akinomyoga/ble.sh/discussions/309#discussioncomment-5527375
   9080 
   9081     またサブシェルに fd が継承されるという事についても述べる。
   9082 
   9083     →色々書き加えた。
   9084 
   9085   * 2023-04-05 README: Guix package のリンクが壊れている [#D2032]
   9086 
   9087 2023-04-08
   9088 
   9089   * util (conditoinal-sync): opts に指定した pid=PID/-PGID が動かない (contributed by bkerin) [#D2031]
   9090     https://github.com/akinomyoga/ble.sh/discussions/309#discussioncomment-5556211
   9091     https://github.com/akinomyoga/ble.sh/pull/313
   9092 
   9093     これは conditional-sync を弄って外部から pid を指定できる様にした時のバグ
   9094     https://github.com/akinomyoga/ble.sh/commit/8d623c1927c2c4e381bd484bcc51def3213890f6
   9095 
   9096     先ず PGID を指定すると kill がシグナルと勘違いして動かない。次に timeout=0
   9097     を一緒に指定すると既存の pid があっても kill を試行せずにそのまま終了してし
   9098     まう。
   9099 
   9100     提案では負の時にだけそのまま終了する様になっていたが、負であっても pid が指
   9101     定されていればちゃんと kill して終了する様にしたい。調整する。
   9102 
   9103     ----
   9104 
   9105     2023-04-09 GitHub CI で Windows が失敗している。手元の cygwin で試すと何故
   9106     か sleep 10 を kill しても全く効果がない。然し、プロンプトを跨いで kill を
   9107     実行するとちゃんとその場で動く。色々実験した結果 subshell を少なくとも一回
   9108     以上立ち上げた後だと kill が効く様である。これは kill -- でも kill -9 でも
   9109     同様である。
   9110 
   9111     $ tkill() { kill -9 "$p"; ((count++)); sleep 0.01; }
   9112     $ sleep 10 & p=$!; count=0
   9113     $ (true)    # <-- これがあるかないかで必要な kill 回数が変わる
   9114     $ tkill; while kill -0 "$p"; do tkill; done; date +'%s.%N':$count
   9115 
   9116     然し、CI test に関しては単に delay を入れるだけで解決してしまった。然し、場
   9117     合によってはやはり kill できないという状況になると行けないので念の為
   9118     Windows では subshell を一つ作る事にする。