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 を一つ作る事にする。