diff --git a/lib/core-complete.sh b/lib/core-complete.sh index 01f05244..1c1eb55b 100644 --- a/lib/core-complete.sh +++ b/lib/core-complete.sh @@ -2282,12 +2282,23 @@ function ble/complete/progcomp/compopt { return "$ext" } +function ble/complete/progcomp/.check-limits { + # user-input check + ((cand_iloop++%bleopt_complete_polling_cycle==0)) && + [[ ! -t 0 ]] && ble/complete/check-cancel < /dev/tty && + return 148 + ble/complete/source/test-limit $((progcomp_read_count++)) + return "$?" +} function ble/complete/progcomp/.compgen-helper-func { [[ $comp_func ]] || return 1 local -a COMP_WORDS local COMP_LINE COMP_POINT COMP_CWORD COMP_TYPE COMP_KEY ble/complete/progcomp/.compvar-initialize + local progcomp_read_count=0 + local _ble_builtin_read_hook='ble/complete/progcomp/.check-limits || return 148' + local fDefault= local cmd=${COMP_WORDS[0]} cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]} ble/function#push compopt 'ble/complete/progcomp/compopt "$@"' diff --git a/memo/ChangeLog.md b/memo/ChangeLog.md index e8c37a9b..74a76638 100644 --- a/memo/ChangeLog.md +++ b/memo/ChangeLog.md @@ -10,19 +10,20 @@ - 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` aae553c + - complete: inject user interruption and complete limits into `bash-completion` through `read` (motivated by timjrd) `#D1504` 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 - canvas, edit: support `bleopt info_display` (suggested by 0neGuyDev) `#D1458` 69228fa - canvas (panel): always call `panel::render` to update height `#D1472` 51d2c05 - util (visible-bell): work around coordinate mismatches in subshells `#D1495` 01cfb10 - - canvas: work around Kitty's quirk not recognizing DECSTBM (CSI ; r) `#D1503` 0000000 + - canvas: work around Kitty's quirk not recognizing DECSTBM (CSI ; r) `#D1503` eca2976 - prompt: support `bleopt prompt_status_{line,align}` and `face prompt_status_line` `#D1462` cca1cbc - prompt: fix missing height allocation for status line `#D1487` b424fa5 - prompt: support `bleopt prompt_status_align=justify` `#D1494` c30a0db - syntax: properly support case patterns `#D1474` `#D1475` `#D1476` 64b55b7 - keymap/vi: add `ble/keymap:vi/script/get-mode` for user-defined mode strings `#D1488` f25a6e8 462918d -- prompt: support multiline `prompt_rps1` `#D1502` 0000000 +- prompt: support multiline `prompt_rps1` `#D1502` 4fa139a ## Changes diff --git a/note.txt b/note.txt index fb422e3d..162f85fd 100644 --- a/note.txt +++ b/note.txt @@ -1208,6 +1208,11 @@ bash_tips 0.5 ControlPanel/TUI Framework 0.4 progcolor +2021-03-07 + + * システムによってロードされた fzf が悪さをして固まってしまう。 + これは . /etc/bashrc を読み込むと強制的に実行される。 + 2021-02-28 * magic-space で alias 展開する機能があっても良いのでは? @@ -4005,6 +4010,65 @@ bash_tips 2021-03-07 + * progcomp: やはりファイルが大量にあるシステムで遅い (reported by timjrd) [#D1504] + https://github.com/akinomyoga/ble.sh/pull/65#issuecomment-791932281 + + 試しに complete -r して見ると発生しなくなる。 + + という事は bash_completion が悪さをしているのだろうか。 + + * fzf completion も勝手にロードされている。fzf completion の実装が悪いのか + と思って fzf の completion をロードしない様にしたがそれでも問題は発生する。 + + * highlight_filenme= としても特に問題は改善しない。逆に + complete_auto_complete= として highlight_filename=1 のままの場合には特に + 問題も生じない。着色もそんなに時間をかけずに実行できている。という事を考 + えるとやはり progcomp 特有の問題である様に思われる。 + + * bash の progcomp の場合には特に問題は生じていない。という事は -F で呼び出 + した関数を強制的に中断する機能があるのか、或いは -F の関数の呼び出し自体 + にはそんなに処理時間がかかっていなくて後の処理で時間がかかっているという + 事なのか。何れにしても計測が必要になる。 + + 実際に処理をブロックしているのは以下の関数の呼び出しの様だ。 + + $ _minimal 'echo' '' 'echo' + + 然し普通に呼び出してもそんなに時間がかかる事はない。 + + ---- + + _minimal の呼び出しに時間計測をかける。結局 _filedir の中にあるループがいけ + ないのだという事。うーん。ble.sh の中で実行すると 20 秒も待たされるが、bash + progcomp から呼び出すと 1.2 秒で終了する。何故だろう。 + + 実際に候補を bash progcomp 内で生成しているのか確認してみるとちゃんと候補は + 生成されている。 + + もしかして read で変な処理をしているのが行けないという事だろうか。でもそん + なに重い処理はしていない。うーん。オプションの処理をしているが、bash + progcomp の時にも現在 attach しているかどうかのチェックは行っている。そんな + に差が開く物なのか。 + + 実際に unset -f と read() { ble/builtin/read "$@"; } で囲んでみたら 0.6s に + 縮まった。1/60 の時間になった。 + + ---- + + これに対する対策はどのようにするのが良いか。 + + a progcomp で compgen する時だけは unset -f read する? と思ったが、この状態 + で read -e を内部で呼び出されるなどすると変な事になってしまう。 + + b decode-detach/attach するのは処理量的に好ましくない気がする。特に + auto-complete で何度も呼び出されるのに、実際に時間がかかるかどうか分から + ない処理のために毎回 detach/attach するのは大変。 + + c 或いは _filedir 等の各関数に対して .advice around で unset -f read を行う? + + d 或いは read の中に complete_polling_cycle を仕込む。うーん。これが一番 + smart な気がしてきた…。 + * canvas: Kitty が CSI ; r に対して何もしない (reported by timjrd) [#D1503] https://github.com/akinomyoga/ble.sh/pull/65#issuecomment-791932281 diff --git a/src/edit.sh b/src/edit.sh index 99077628..b9a3faa7 100644 --- a/src/edit.sh +++ b/src/edit.sh @@ -7678,6 +7678,10 @@ function ble/builtin/read { return "$?" fi + # used by core-complete to cancel progcomp + [[ $_ble_builtin_read_hook ]] && + builtin eval -- "$_ble_builtin_read_hook" + local __ble_command= __ble_args= __ble_input= ble/builtin/read/.impl "$@"; local __ble_ext=$? [[ $__ble_command ]] || return "$__ble_ext"