Skip to content

Commit

Permalink
progcomp: fix "complete -I" for empty words
Browse files Browse the repository at this point in the history
  • Loading branch information
akinomyoga committed Aug 24, 2024
1 parent 134a38d commit 9270b52
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 1 deletion.
1 change: 1 addition & 0 deletions docs/ChangeLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 5 additions & 1 deletion lib/core-complete.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
38 changes: 38 additions & 0 deletions note.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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 を使って既定のオプションと異なる物だけを指
Expand Down Expand Up @@ -7457,6 +7494,7 @@ bash_tips
なく全て適当に割り当ててしまう事にする。

* 2021-08-31 complete: -E (_EmptycmD_) に対応していない [#D2257]
Ref: #D2262

一方でこれは一体どの様に振る舞うものとして実装すれば良いのか分からない側面
がある。文字列が本当に空の時にはこれを使って補間するので良い。
Expand Down

0 comments on commit 9270b52

Please sign in to comment.