Skip to content

Commit

Permalink
complete: update performance settings
Browse files Browse the repository at this point in the history
  • Loading branch information
akinomyoga committed Mar 1, 2021
1 parent 817889d commit aae553c
Show file tree
Hide file tree
Showing 4 changed files with 256 additions and 4 deletions.
4 changes: 2 additions & 2 deletions lib/core-complete-def.sh
Expand Up @@ -32,8 +32,8 @@ fi
bleopt/declare -n complete_polling_cycle 50
bleopt/declare -o complete_stdin_frequency complete_polling_cycle

bleopt/declare -v complete_limit 500
bleopt/declare -v complete_limit_auto 200
bleopt/declare -v complete_limit ''
bleopt/declare -v complete_limit_auto 2000
bleopt/declare -v complete_timeout_auto 5000
bleopt/declare -v complete_timeout_compvar 200

Expand Down
2 changes: 1 addition & 1 deletion lib/core-complete.sh
Expand Up @@ -5139,7 +5139,7 @@ function ble/highlight/layer:menu_filter/getg {
_ble_complete_menu_filter_enabled=
if ble/is-function ble/util/idle.push-background; then
_ble_complete_menu_filter_enabled=1
ble/util/idle.push-background ble/complete/menu-filter.idle
ble/util/idle.push -n 9999 ble/complete/menu-filter.idle
ble/array#insert-before _ble_highlight_layer__list region menu_filter
fi

Expand Down
4 changes: 3 additions & 1 deletion memo/ChangeLog.md
Expand Up @@ -9,6 +9,7 @@
- decode (`ble-decode-kbd`): support various specifications of key sequences `#D1439` 0f01cab
- edit: support new options `bleopt edit_line_type={logical,graphical}` (motivated by 3ximus) `#D1442` 40ae242
- complete: support new options `bleopt complete_limit{,_auto}` (contributed by timjrd) `#D1445` b13f114 5504bbc
- complete: update the default value of `bleopt complete_limit{,auto}` `#D1500` 0000000
- edit (kill/copy): combine multiple kills and copies (suggested by 3ximus) `#D1443` 66564e1
- edit (`{kill,copy}-region-or`): fix unconditionally combined kills/copies (reported by 3ximus) `#D1447` 1631751
- canvas: update emoji database and support `bleopt emoji_version` (motivated by endorfina) `#D1454` d1f8c27
Expand All @@ -31,6 +32,7 @@
- syntax (`simple-word/is-simple-noglob`): suppress error messages on expansions `#D1461` a56873f
- syntax (`simple-word/eval`): fix unperformed tilde expansions in the background (reported by 3ximus) `#D1463` 6ebec48
- syntax (`simple-word/eval`): propagate timeouts in sync highlighting (reported by 3ximus) `#D1465` c2555e2
- edit: change the priority of `render-defer` and `menu-filter` `#D1501` 0000000
- complete: perform pathname expansions in subshells (motivated by 3ximus) `#D1450` d511896
- complete: support `bleopt complete_timeout_compvar` to time out pathname expansions for `COMP_WORDS` / `COMP_LINE` `#D1457` cc2881a
- prompt: rename `bleopt prompt_{status_line => term_status}` `#D1462` cca1cbc
Expand Down Expand Up @@ -87,7 +89,7 @@
- Makefile: fix up f7323b4: restore rule for `keymap/*.txt` `#D1496` 054e5c1
- util, etc: ensure each function to work with arbitrary `IFS` `#D1490` `#D1491` 5f9adfe
- tui, canvas (`ble/canvas/trace`): support `opts=clip` `#D1493` 61ce90c
- tui, edit: add a new render mode for full-screen applications 0000000
- tui, edit: add a new render mode for full-screen applications 817889d

<!---------------------------------------------------------------------------->
# ble-0.4.0-devel2
Expand Down
250 changes: 250 additions & 0 deletions note.txt
Expand Up @@ -1204,6 +1204,39 @@ bash_tips
ToDo
-------------------------------------------------------------------------------

0.6 ErrorMsg
0.5 ControlPanel/TUI Framework
0.4 progcolor

2021-02-28

* magic-space で alias 展開する機能があっても良いのでは?

* canvas/trace: wordwrap に対応する。つまり、単語の途中で改行しない様にする。

これは今の所具体的な用途もないので取り敢えずこの儘にしておく。

* canvas/trace: より詳しい justify の仕様について設定できる様にする。

#D1494 の案では "SEP*WEIGHT FILL SEP" を単位として指定するという話だったが、
これはやはり不自然な感じで分かりにくいのでもっと分かりやすい指定方法を考え
るべき。

例えば、最低幅1重み2 '%1.2S{FILL}' という具合にするなど。こうすると % を
SEP に指定できないし } を FILL に指定できないが使う機会があるとも思えない
ので気にしない。或いは '%{1.2SFILL}' とする? うーん余計に分かりづらい。或
いは printf strftime を真似て '%1.2(FILL)S' という具合にする。

空白は既定で '%1.0( ) ' に相当する。その他の文字は '%0.0()X' に相当する物
とする。

* canvas/trace: align=right,center に対応する。高さについても同様に対応して
も良いのかもしれないがそれは必要になってからで良い。

2021-02-24

* trace の g0 は後で合成するのではなくて \e[m の段階で設定するべきなのではないか。

2021-02-23

* util: カーソルが bottom-dock にいる時の vbell の座標計算
Expand Down Expand Up @@ -1247,6 +1280,165 @@ bash_tips

$ printf 'Line %s\n' {0..100}; /bin/sleep 1; printf '\e[M'; /bin/sleep 1

2021-02-13

* edit: C-x e に続いて e を連続して押した時にマクロ実行を繰り返す様にしたい

* 実は bash の read -e は C-r でコマンド履歴を参照できる。ble.sh では read 専
用の履歴を独立に管理しているが、コマンド履歴にもアクセスできる様にするべき
なのでは。と思ったがやはり何だか微妙な気がする。

read 専用の履歴を別に管理するというのもありなのではないかという気がする。
その場合には保存場所は何処にするべきだろうか。
~/.local/share/blesh
~/.config/blesh
~/.cache/blesh

https://github.com/fish-shell/fish-shell/issues/744

fish は過去に config に置いていてユーザの文句によって local/share に移動し
た様だ。然し、local/share はそれはそれで何だか変な気もする。

* gnuplot など他のコマンドに対して ble.sh によって編集機能を提供する事は可能
だろうか。少なくとも pty を自分で開いてその中で gnuplot を起動する必要があ
る? 或いは、gnuplot のリンク先の readline library を勝手に書き換えて bash
を起動させて、更にその中で ble.sh を使って readline 関数の振る舞いを模倣す
る?

rlwrap 等を使うという手もある? rlwrap のじっそうはやはり pty を開くという物
のようである。rlfe という物もあるようである。

2021-02-10

* main: 関数内で引数なしで source すると関数の引数がそのまま source の中から
見える。これらを区別する方法はあるだろうか。

うーん。shopt -u extdebug であれば BASH_ARGC の数が二種類の source の仕方で
異なるようである (但しその具体的な数は bash-5 から変わっている。更に入れ子
source や関数呼び出しなどが絡んできた時にどうなるかは不明である)。然し、
shopt -s extdebug の時には両者は同じになる。

2021-02-06

* tui: TreeView

以下の様な物があるのを見つけた。
https://gitlab.com/TheDalaiAlpaca/saturnon/-/blob/master/saturnon

実際どんな物かは確かめていないが、TUI 要素としてファイルピッカーは定番である。

その基礎として先ず TreeView を実装するというのは一つの方向性。TreeView は
List の拡張として作成するのが自然であろう。List の各要素の高さを変えられる
様にして、更に中にそれぞれリストを保持するようにしたものと解釈できる。問題
になるのはリスト項目が増えてきた時に高さの累積計算が重くなるという事。シェ
ルで実装すると成ると重み付きB木の様な複雑なデータ構造にもしにくい。或いは、
本気で重み付きB木をBash上で実装するという方向性もあるのかもしれない。

Midnight Commander と同等の機能を ble.sh の内部で実装するというのも
demonstration として良いのではないかという気がする。

2021-02-05

* 他の bash プログラム

* https://stackoverflow.com/q/41043916/4908404
history 候補を自動的に表示する可能性について議論している

上記 StackOverflow の質問で提案されている。Google Chrome の search bar の様に、
幾つか文字を入力した時点でもう履歴から項目を拾って幾つか表示し始めるという可能性。
これは fzf の領分である様な気もするが shell integration を考えるとなかなか非自明である。

というか普通の検索でも複数の候補を表示した方が分かりやすいのではないかという気がする。
例えば或る一定以上の時間が経ったら一致する候補を列挙するなど。
更に待っていると曖昧一致も列挙してくれる、という具合にする。

2021-02-09 hstr が同様の機能を提供している。hstr の動作も参考にした方が良いのではないか。

* https://github.com/dylanaraps/shfm/blob/master/shfm (file manager in POSIX shell)
これは dylanaraps の fff の再実装

* これは README に乗せるバッジの話
https://img.shields.io/github/downloads/akinomyoga/ble.sh/total
ダウンロード数の画像を生成できる様だ

* Incremental parsing:

ble.sh で行っている構文解析は特殊な物であるが如何にも既存の例がありそうである。

検索したら以下の様な物があった。

[Tree-sitter|Introduction](https://tree-sitter.github.io/tree-sitter/)

参考にしている論文を見てみると state matching で skip と書いているので、
やはり単に途中から始めるというだけでなく途中で解析を中断するという考えも
ある。寧ろ、完全に一致していなくても局所的な一致であれば解析を跳ばすとい
う事を実行していると思われ、より積極的な最適化である。

恐らく先にこれを見つけていたら ble.sh の構文解析の実装ももっと複雑になっ
て、更になかなか完成しない日々が続いたのではないかという気がする。何事に
も一長一短があるのであって既存の研究だって参考にできる部分と捨て置いて良
い部分がある筈だが調べてしまうと完全に対応したく成るのが問題である。なの
で、取り敢えず持てる範囲の知識で何かやってみるというのは大切な事なのであ
る。

oil 等は沢山調べすぎて行き詰まっているのではないかという気もする。或いは
逆に何だか Python -> C++ translator を開発するなど変な方向に走っていて、
それで余計に時間を取られているのではないか等等。やはりメンテナンス等を考
えると、Python は prototype として捨て置いて、C++ で完全に書き直した方が
得策なのではないか。Python -> C++ をずっと使う事にしていると、少しの機能
追加で毎回 translator にも大幅に手をいれなければならず、結局メンテナンス
が困難になる。特に第三者がコードに手を入れるのが極度に難しい。この構造を
保持したまま続けるには最初に完全なる translator を作って、その後は
translator の改良を行わないという決断が必要である (状況に応じて最適な翻訳
が異なりうる事まで考えていたら完成した translator があってもきりがない)。

* 絵文字シーケンスや grapheme cluster

今まで対応は不可能と思って割り切って考えてきたが実は可能なのではないかという気がしてきた。
ゼロ幅の文字が存在しても特に変な事は発生しない気がする。
注意しなければならない事としては dirty 範囲を広げなければならないという事と、
文字の途中で SGR 等を挿入したりする事はできないという事。

一方で端末の側でもこれに対応している必要があるのでテストという観点からは微妙。
contra は対応していないし screen も恐らく対応していない。tmux はどうなのだろうか。

tmux はこれに対応しているターミナルがないから未だ対応しないという事を言っている。
一番最近では 2020-05
https://github.com/tmux/tmux/issues/1605

2021-02-05

* evaluate-path-spec (by 3ximus)

evaluate-path-spec の改良に挑戦してみるという事なので。先ずは説明が必要である。

* notilde に関しては eval の側で処理するべきではないか
* 後で全体 path 以外については single を加える様にお願いする

2021-02-03

* edit: 例えばファイル一覧を表示する機能を付けても良いのではないだろうか。

2021-02-01

* complete: complete_timeout_compvar でタイムアウトした単語の glob 文字を quote しない?
Ref #D1457

現在はグロブ文字も quote して COMP_WORDS と COMP_LINE を構築している。例え
ば **/*.txt に時間がかかった時に COMP_WORDS には "'**/*.txt'" という文字列
が格納されるが、これは本来 "**'/'*'.txt'" であるべきなのではないかという事。

* 一方で、補完関数の方が複雑な quote に対応しているかという問題もある。

* また、ここで quote しないと結局補完関数の方でも時間がかかってしまうのでは
ないかという恐れがある。

という事など考えると、取り敢えずは完全に quote する実装にしておく。後で気が
向いたらまた考える。

* highlight: failglob の時の a/b*/c/d.txt の着色が最後のファイル名になっている。
本来はどの時点で failglob になるか判定して着色するべきなのではないだろうか。

2021-01-28

* progcolor: ble/syntax/progcolor/eval-word を着色を跨いでキャッシュできないか
Expand Down Expand Up @@ -3794,6 +3986,64 @@ bash_tips
Done (実装ログ)
-------------------------------------------------------------------------------

2021-02-28

* 2021-02-06 render-defer.idle の優先順位を下げたい [#D1501]

現在の実装では ble/textarea#render-defer.idle が menu-filter, auto-menu,
auto-complete よりも先に来ているが、これは後に来るべき。特に menu-filter よ
りも先に来ないと絞り込み状態の着色がずっと残ってしまう。

menu-filter を render-defer.idle よりも前に挿入するべきである。どの様にすれ
ば良いか。

a 特定の要素の前に挿入するという操作を実装しても良いと思ったが、その為だけ
に関数を用意するのも変である。それよりはオプションで指定できる様にする方
が実装としては自然である。その時に挿入点よりも後に詰まって存在している要
素はシフトする。

b 或いは初めから各 background の優先順位を指定して登録してしまうという手も
ある。というよりその方が自然である。どうせ決め打ちになるのでその方が柔軟
に対応できる。

現在 background idle (10000+) に登録される処理は以下の通り
- ble/util/msleep/calibrate
- ble/textarea#render-defer.idle
- ble/complete/menu-filter.idle
- push-background ble/complete/auto-complete.idle
- push-background ble/complete/auto-menu.idle

うーん。単に menu-filter を 9999 に登録すれば良い? これが単純で分かりやすい
対応であろう。

* 2021-01-31 complete: change bleopt complete_limit default [#D1500]

実は今回の subshell による実行でしなくても良くなったのではないか。と思った
が、元の報告だと別にグロブパターンと関係なく遅いという話だった気がする。と、
思ったが補完の話だったのでやはりグロブパターンというかファイル名補完に関係
がある。

うーん。やはり 500 というのは上限としては小さすぎる様な気がする。
auto-complete の 200 というのも小さすぎる様な気がする。もっと増やしても良い
のではないかという気がする。5000 vs 2000 ぐらい。というか tab 補完に対して
制限する必要があるのだろうか。

? globpat を含んでいるかのどうかの判定は実は failglob を使った方が早いかも
しれない。現在の正規表現に基づく実装と速度を比較する価値はあるかもしれな
い。しかし、../../.. みたいなパスが含まれている可能性等も考えると下手な事
はできない。

* [自然解消?] 2021-02-01 complete: slow tab completion after globstar words (reported by 3ximus) [#D1499]
https://github.com/akinomyoga/ble.sh/issues/82#issuecomment-770390986

パス名展開を compvar 構築時に全ての単語に対して実行しているのが原因かと思っ
て#D1457 で compvar 用の timeout を導入してみたがどうも関係なかった様だ。報
告に依ると globstar の着色が終わった後でも遅いという話だ。これはこちらの手
元では再現しないという事が分かった。恐らく cache が働いているのだろうと思う。

2021-02-04 新しい commit で改善したそうであるが、それでもパターンがない時よ
りも遅いそうである。

2021-02-27

* canvas/panel: set-height で高さ拡張時にその時の sgr0 が bce で適用されてしまう [#D1498]
Expand Down

0 comments on commit aae553c

Please sign in to comment.