Skip to content

Commit

Permalink
prompt: support "contrib/prompt-git" dirty checking
Browse files Browse the repository at this point in the history
  • Loading branch information
akinomyoga committed Jun 10, 2021
1 parent 53dd018 commit b2713d9
Show file tree
Hide file tree
Showing 5 changed files with 112 additions and 29 deletions.
2 changes: 1 addition & 1 deletion contrib
Submodule contrib updated 1 files
+80 −5 prompt-git.bash
7 changes: 4 additions & 3 deletions lib/vim-airline.sh
Expand Up @@ -5,7 +5,7 @@
# * "g:airline_mode_map" is partially supported
#
# Unsupported mappings
#
#
# 'ic' : 'INSERT COMPL',
# 'ix' : 'INSERT COMPL',
# 'multi' : 'MULTI'
Expand Down Expand Up @@ -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"
}
Expand Down Expand Up @@ -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
}

Expand Down
1 change: 1 addition & 0 deletions memo/ChangeLog.md
Expand Up @@ -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
Expand Down
111 changes: 87 additions & 24 deletions note.txt
Expand Up @@ -1455,11 +1455,6 @@ bash_tips
やはりもっと下の枠組みで提供するべきだろうか。
例えば、最終的に着色を格納する部分に介入してしまうという手もある。

2021-05-28

* 最下行で ble-reload すると statusline が重複してしまう。ble-detach して
その後に ble-attach した時には問題は発生しない。

2021-05-27

* wiki の更新
Expand All @@ -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 についてもまた駄目になっているかもしれない。→試してみた所
Expand Down Expand Up @@ -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) に対する判定で失敗しているのだろうか。
Expand Down
20 changes: 19 additions & 1 deletion src/util.sh
Expand Up @@ -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
Expand Down Expand Up @@ -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
## 待機状態の処理を開始します。
Expand Down Expand Up @@ -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} ]]
}
Expand Down

0 comments on commit b2713d9

Please sign in to comment.