diff --git a/docs/ChangeLog.md b/docs/ChangeLog.md index 85a9e97b..d99ae630 100644 --- a/docs/ChangeLog.md +++ b/docs/ChangeLog.md @@ -55,6 +55,7 @@ - color: adjust default fg values in faces and add `bleopt color_scheme` (requested by mattmc3) `#D2248` e4cce0ea 5f5554a8 `#D2258` d6a38c43 - highlight: add `bleopt highlight_eval_word_limit` (motivated by orionalves) `#D2256` 6833bdf8 - progcomp: support `complete -E` `#D2257` ffac4205 + - progcomp: fix `complete -I` for empty words (reported by blackteahamburger) `#D2262` xxxxxxxx - make: support make variable `USE_DOC=no` (requested by blackteahamburger) `#D2260` 40fe9c95 xxxxxxxx - make: fix condition for the INSDIR_LICENSE rule (reported by Jai-JAP) `#D2260` 5a8dcb4b - edit (`ble/widget/display-shell-version`): print shell options `#D2261` 70b89e5e xxxxxxxx diff --git a/lib/core-complete.sh b/lib/core-complete.sh index bc4ce442..b487541d 100644 --- a/lib/core-complete.sh +++ b/lib/core-complete.sh @@ -6059,7 +6059,11 @@ function ble/complete/source:argument/.generate-user-defined-completion { local comp_words comp_line comp_point comp_cword if ! ble/syntax:bash/extract-command "$COMP2"; then - if [[ :$opts: == *:empty:* || :$opts: == *:initial:* ]]; then + # Note: The extraction of the command fails when the command word is empty, + # yet we want to perform the programmable completions by "complete -E" and + # "complete -I". When the command extraction fails with a non-empty word, + # we do not perform completion because the word is not a command. + if [[ ! $COMPV && ( :$opts: == *:empty:* || :$opts: == *:initial:* ) ]]; then # Note: The completions with "complete -E" and "complete -I" are valid # even with the empty command line. In this case, COMP_WORDS is an empty # array and COMP_CWORD becomes -1. diff --git a/note.txt b/note.txt index d5569a69..ee595e52 100644 --- a/note.txt +++ b/note.txt @@ -7373,6 +7373,43 @@ bash_tips 2024-08-24 + * progcomp: var= でエラーメッセージが発生する (reported by blackteahamburger) [#D2262] + https://github.com/akinomyoga/ble.sh/issues/487 + Ref: regression by #D2257 + + complete -I の時にも comp_words=() comp_cword=-1 を指定していたがこれが駄目 + だった。変数代入 var= の時にはコマンドラインが空でなくても complete -I が発 + 生して extract-command が失敗する可能性がある。 + + では bash では var= に対して complete -I の補完はどの様に振る舞うのだろうか。 + と思ったがそもそも var= が入力されている時点で complete -I が呼び出される事 + はない。ble.sh の拡張で任意のコマンド名補完に対して complete -I を有効にし + ているからこそ発生する問題である。 + + ? ok: 逆に言えばそもそも任意のコマンドの補完の文脈で complete -I を試みる事 + は良いのか? 本当のコマンド名の補完の場所で試すのは良いが、例えば type + command[TAB] の様な箇所での補完では complete -I は使うべきではない。と思っ + たがそもそも type command[TAB] の様な状況では source:command は使われない + ので気にしなくて良い。考えてみれば source:command は ble.sh の + core-syntax から生成される物であり、core-syntax は文脈に従ってコマンドが + 現れる場所でしか基本的に source:command を指定しないので、基本的に + source:command では complete -I の補完を試みるという事で妥当の気がする。 + + ? ok: 何故 var= [TAB] の位置ではなくて var=[tab] の位置でコマンド補完が発生 + しているのだろうか。check-here だとしたら prefix の幅は 0 になる筈では? + うーん。check-prefix で呼び出されている。然し chek-prefix は前回の解析開 + 始点を基準にしているので "var=" の直前の位置における補完としてコマンド名 + も一緒に生成しているのである。なのでこれは OK + + ? ok: 何故 COMP2 COMP1 が 0 なのに COMPV が有限になっているのだろうか。と思っ + たが、どうやら曖昧補完の処理として COMP2 を COMP1 で上書きしている様だ。 + COMP1 が 0 の時には COMP1 は空文字列になるみたいだが、これは問題ない。 + + 色々考えたが $COMPV が有限なのに extract-command に失敗するという状況は既に + その単語がコマンド名ではない事を意味していて complete -I の対象ではない事を + 意味している様に思われる。もし $COMPV が有限で対象だったら extract-command + が失敗する筈はない為である。 + * edit: display-shell-version に SHELLOPTS, BASHOPTS も含めるべき? [#D2261] 追加した。diff が使える時は diff を使って既定のオプションと異なる物だけを指 @@ -7457,6 +7494,7 @@ bash_tips なく全て適当に割り当ててしまう事にする。 * 2021-08-31 complete: -E (_EmptycmD_) に対応していない [#D2257] + Ref: #D2262 一方でこれは一体どの様に振る舞うものとして実装すれば良いのか分からない側面 がある。文字列が本当に空の時にはこれを使って補間するので良い。