Skip to content

Commit

Permalink
complete: inject complete limits into "bash-completion" via "read"
Browse files Browse the repository at this point in the history
  • Loading branch information
akinomyoga committed Mar 7, 2021
1 parent eca2976 commit 856cec2
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 2 deletions.
11 changes: 11 additions & 0 deletions lib/core-complete.sh
Expand Up @@ -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 "$@"'
Expand Down
5 changes: 3 additions & 2 deletions memo/ChangeLog.md
Expand Up @@ -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 <kbd>DECSTBM</kbd> (<kbd>CSI ; r</kbd>) `#D1503` 0000000
- canvas: work around Kitty's quirk not recognizing <kbd>DECSTBM</kbd> (<kbd>CSI ; r</kbd>) `#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

Expand Down
64 changes: 64 additions & 0 deletions note.txt
Expand Up @@ -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 展開する機能があっても良いのでは?
Expand Down Expand Up @@ -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

Expand Down
4 changes: 4 additions & 0 deletions src/edit.sh
Expand Up @@ -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"
Expand Down

0 comments on commit 856cec2

Please sign in to comment.