diff --git a/contrib b/contrib index 8fc5dd14..6ed10862 160000 --- a/contrib +++ b/contrib @@ -1 +1 @@ -Subproject commit 8fc5dd14161e50a5aa76c754e6f6e09a9c00e760 +Subproject commit 6ed108629e4aa3ad4998923ae3bcc74473475ae1 diff --git a/lib/vim-airline.sh b/lib/vim-airline.sh index 95bebd2e..29dccd2f 100644 --- a/lib/vim-airline.sh +++ b/lib/vim-airline.sh @@ -5,7 +5,7 @@ # * "g:airline_mode_map" is partially supported # # Unsupported mappings -# +# # 'ic' : 'INSERT COMPL', # 'ix' : 'INSERT COMPL', # 'multi' : 'MULTI' @@ -119,7 +119,7 @@ ble/lib/vim-airline/initialize-faces function ble/lib/vim-airline/convert-theme/.to-color256 { local R=$((16#${1:1:2})) - local G=$((16#${1:3:2})) + local G=$((16#${1:3:2})) local B=$((16#${1:5:2})) ble/color/convert-rgb24-to-color256 "$R" "$G" "$B" } @@ -255,7 +255,8 @@ function ble/prompt/backslash:lib/vim-airline/gitstatus { else ble/prompt/print '$bleopt_vim_airline_symbol_branch???????' fi - git diff --quiet || ble/prompt/print "$bleopt_vim_airline_symbol_dirty" + ble/contrib/prompt-git/is-dirty && + ble/prompt/print "$bleopt_vim_airline_symbol_dirty" fi } diff --git a/memo/ChangeLog.md b/memo/ChangeLog.md index 4648205b..edbcbb12 100644 --- a/memo/ChangeLog.md +++ b/memo/ChangeLog.md @@ -45,6 +45,7 @@ - prompt: track dependencies and detect changes `#D1590` `#D1591` 0000000 - prompt: preserve `LINES` and `COLUMNS` for custom sequences `#D1592` 0000000 - color: fix the face initialiation order for uses in prompts (motivated by jmederosalvarado) `#D1593` 0000000 + - prompt: support `contrib/prompt-git` dirty checking `#D1601` 0000000 - util, color: refactor configuration interfaces (`bleopt`, `blehook`, `ble-face`) `#D1568` c94d292 - color: support new face setting function `ble-face` - util (`bleopt`): support option `-r` and `-u` and wildcards in option names diff --git a/note.txt b/note.txt index 7f01aca3..2f74d41d 100644 --- a/note.txt +++ b/note.txt @@ -1455,11 +1455,6 @@ bash_tips やはりもっと下の枠組みで提供するべきだろうか。 例えば、最終的に着色を格納する部分に介入してしまうという手もある。 -2021-05-28 - - * 最下行で ble-reload すると statusline が重複してしまう。ble-detach して - その後に ble-attach した時には問題は発生しない。 - 2021-05-27 * wiki の更新 @@ -1481,30 +1476,19 @@ bash_tips * airline: 使い方を説明に書く - * prompt: 最適化 git の現在の dirty 状態は background で取得できる様にしたい。 - - prompt-git.bash に実装したい。という事を考えると、 - prompt-git.bash は早晩に lib に移動するべきなのではないかという気がする。 - - * prompt: 最適化 ble/prompt/.get-keymap-for-current-mode や - ble/keymap:vi/script/get-mode に関しては一旦計算値を別の変数に格納してそれ - を参照して値を計算するべきの気がする。これは git 等の最適化と一緒に新しく枠 - 組みを考える事にする。 - - * prompt: プロンプト更新検出に於いてプロンプトに含まれている変数展開 $XXXX も - 自動検出する? 然しエスケープや $() 等も拘ってくると複雑である。適当な方法で - 解析できたりしないだろうか。というか、終端を処理する為に parse していた様な - 気もする。その辺りについてはまた後で確認する。 - - $RANDOM や $EPOCHREALTIME 等については除外するべきである。これらの変数への - nref の検出は困難である。という事を考えるとやはりユーザーに任せるという可能 - 性も考えられるが。 - 2021-05-23 * menu-complete: SIGWINCH による info#panel::invalidate の際にメニュー項目の 再配置を実行するべきである。 + * info 拡張: というか info の表示を担っている class を動的に変更するべきな + のではないか。現在の実装だと内容を変更する時には必ず info の関数を即時で + 呼び出さなければならない仕組みになっている。然し、そうではなくて機に応じ + て丸ごと制御を移すなどの事をした方が良いのではないか。然し、一方でどの内 + 容が一番上に来るべきかなどの制御も必要になる。現在は default/non-default + の二層構造になっているがそれをもっと動的に変化できる様に改良するという手 + も考えられる。 + * main: BASH_XTRACEFD による出力の抑制? | 更に set -x についてもまた駄目になっているかもしれない。→試してみた所 @@ -4693,6 +4677,85 @@ bash_tips 2021-06-10 + * prompt: 最適化 git の現在の dirty 状態は background で取得できる様にしたい [#D1601] + + prompt-git.bash に実装したい。という事を考えると、 + prompt-git.bash は早晩に lib に移動するべきなのではないかという気がする。 + + これはどの様に実装するか。先ず初めに background で git を起動する。timeout + を指定して直ぐに制御が戻らなければ取り敢えず放置する事にする。その後で結果 + が分かったらそれを取り出す。既に git を起動していて未だ結果が分かっていない + 時には何もしない。最後に結果が分かってから X 秒経過する迄は以前の結果を参照 + する。ディレクトリを移動した場合には、起動中の git はキャンセルして新しいイ + ンスタンスを起動する。と言った位。 + + 一から実装する事も可能だが既存の枠組みに沿った形で出来るだけ実装したい。git + の結果待ちは idle プロセスとして実装する。うーん。history 初期化のコードを + 観察した。正にこれと同じことをしたいのである。 + + うーん。ライブラリにしようと思ったが微妙…。実は ble/util/idle.push -F + tmpfile を使うだけで行ける話ではないか。履歴の場合にはデータが大量だったの + で各ステップを分割して少しずつ処理する必要があった。然し、今回の場合には + git の実行を待つという操作が1回存在するだけである。 + + 実装した。動いている。と思ったが何だか遅い。うーん。ble/util/msleep 20 を入 + れるか入れないかで大分変化する。ble/util/msleep 20 なら1秒で50回捌ける様な + 気がするがそうでもないのだろうか。うーん。取り敢えず一定時間経過する迄は + version が変化しても無視する事にする。 + + - 改めて計測してみると vim-airline を有効にしている時ですら一秒間に20プロン + プト表示する事ができている。そもそも一つのプロンプトを表示するのに 50ms + しかかかっていない。なので其処に 20ms 追加するのは 1.5 倍の時間がかかる様 + になる事を意味していて体感としてとても遅くなるのだという事。 + + - 取り敢えず前回の結果からそんなに時間が立っていない時、かつ、前回の要求か + らプロンプト更新が10回以内の時には git の呼び出しは控える事にした。 + + # 単純な PS1 の時だけの場合のプロンプトの計算速度はどの程度だろうか。試して + # みた所、29,26回/秒 だった。平均で 36.4ms かかっている。14ms の短縮である。 + # 此処で PS1 の処理をなくしたとしてもそんなには変わらないのだろうという気 + # がする。プロンプトの計算は実はそんなに重くないのだろうという事。 + + - また Linux では可也高速に git diff --quiet の結果を得る事ができる様なので + ble/util/msleep の時間も 5 まで減らした。これでも大きすぎるかもしれないが、 + まあ、頻繁に更新はしない事にしているし特に問題にはならないだろう。 + + * [dissolved] 2021-05-28 prompt: 最下行で ble-reload すると statusline が重複してしまう [#D1600] + + ble-detach してその後に ble-attach した時には問題は発生しない。 + →これは確認した所再現しなくなっていた。恐らく #D1592 で解決した問題だろう。 + + * [reject] 2021-05-24 prompt: プロンプトの変数展開の更新検出 [#D1599] + + プロンプト更新検出に於いてプロンプトに含まれて + いる変数展開 $XXXX も自動検出する? 然しエスケープや $() 等も拘ってくると複 + 雑である。適当な方法で解析できたりしないだろうか。というか、終端を処理する + 為に parse していた様な気もする。その辺りについてはまた後で確認する。 + + $RANDOM や $EPOCHREALTIME 等については除外するべきである。これらの変数への + nref の検出は困難である。という事を考えるとやはりユーザーに任せるという可能 + 性も考えられるが。 + + 然し一方でプロンプトを計算した瞬間の値を参照したいという需要も考えられる。 + 例えば $BASH_COMMAND, $LINENO 等がプロンプトに含まれていたとして、その内容 + が変わったからといってユーザーはプロンプトの表示を更新する事を想定はしてい + ないのではないか。という事を考えるとやはりユーザーが明示的に要求しない限り + はプロンプトに含まれている変数展開を改めて評価する必要はないのではないかと + いう気がする。 + + * [ok] 2021-05-24 prompt: 現在のモードの算出の共有化・最適化 [#D1598] + + ble/prompt/.get-keymap-for-current-mode やble/keymap:vi/script/get-mode に + 関しては一旦計算値を別の変数に格納してそれを参照して値を計算するべきの気が + する。これは git 等の最適化と一緒に新しく枠組みを考える事にする。 + + 取り敢えず枠組みは整えた。そしてこれらの関数では関連する変数に対して + add-hash を実行している。新しい unit にする程の物でもないだろう。一つにはこ + れらの関数はそんなに思い関数でもないという事。そして幾つも何度も実行する様 + な物でもないのでキャッシュしても仕方がないのではないかという事。大抵の場合、 + 依存関係を追跡するコストの方が大きそうである。なので add-hash をして、これ + らを含むプロンプトを再更新させるぐらいで良いだろうと思われる。 + * auto-menu: ubuntu20 で auto-menu を有効にしても動いたり動かなかったりである [#D1597] auto-menu の起動条件 (直前の widget) に対する判定で失敗しているのだろうか。 diff --git a/src/util.sh b/src/util.sh index 804c7965..8c7bba01 100644 --- a/src/util.sh +++ b/src/util.sh @@ -4439,6 +4439,14 @@ function ble/util/clock/.initialize { local now; printf -v now '%(%s)T' ((ret=(now-_ble_util_clock_base)*1000)) } + elif [[ $SECONDS && ! ${SECONDS//[0-9]} ]]; then + _ble_util_clock_base=$SECONDS + _ble_util_clock_reso=1000 + _ble_util_clock_type=SECONDS + function ble/util/clock { + local now=$SECONDS + ((ret=(now-_ble_util_clock_base)*1000)) + } else ble/util/strftime -v _ble_util_clock_base '%s' _ble_util_clock_reso=1000 @@ -4567,7 +4575,7 @@ if ((_ble_bash>=40000)); then ## _ble_util_idle_task=() - _ble_util_idle_SEP='\' + _ble_util_idle_SEP=$_ble_term_FS ## @fn ble/util/idle.do ## 待機状態の処理を開始します。 @@ -4751,6 +4759,16 @@ if ((_ble_bash>=40000)); then function ble/util/idle.push-background { ble/util/idle.push -n 10000 "$@" } + function ble/util/idle.cancel { + local command=$1 i removed= + for i in "${!_ble_util_idle_task[@]}"; do + [[ ${_ble_util_idle_task[i]} == *"$_ble_util_idle_SEP$command" ]] && + unset -v '_ble_util_idle_task[i]' && + removed=1 + done + [[ $removed ]] + } + function ble/util/is-running-in-idle { [[ ${ble_util_idle_status+set} ]] }