Skip to content

Commit

Permalink
complete: fix parsing output of "complete -p" in bash-5.2
Browse files Browse the repository at this point in the history
  • Loading branch information
akinomyoga committed Nov 21, 2023
1 parent a643f0e commit a7eb5d0
Show file tree
Hide file tree
Showing 3 changed files with 34 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 @@ -38,6 +38,7 @@
- history (`ble/builtin/history`): fix error message on the empty `HISTFILE` `#D2061` a2e2c4b6
- complete: exit auto-complete mode on complete self-insert `#D2075` 2783d3d0
- complete: fix error messages on empty command names `#D2085` xxxxxxxx
- complete: fix parsing the output of `complete -p` in bash-5.2 `#D2088` xxxxxxxx

## Compatibility

Expand Down
6 changes: 5 additions & 1 deletion lib/core-complete.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3450,6 +3450,7 @@ function ble/complete/progcomp/.parse-complete {
comp_func=${compdef%%' -C '*}
else
comp_func=${compdef%' '}
((_ble_bash>=50200)) && builtin eval "comp_func=($comp_func)"
fi
compdef=

Expand Down Expand Up @@ -3701,7 +3702,10 @@ function ble/complete/progcomp/.compgen {
ble/util/assign compdef 'builtin complete -p -- "$compcmd" 2>/dev/null'
fi
# strip -I, -D, or command_name
# #D1579 bash-5.1 では空コマンドに限り '' と出力する様である。
# Note (#D1579): bash-5.1 では空コマンドに限り '' と出力する様である。
# Note (#D2088): bash-5.2 ではコマンド名に特殊文字が含まれている時 '...' と出
# 力するが、一方で安全に eval で評価する事ができるのでこの時点でコマンド名
# を削除しなくても良い。
compdef=${compdef%"${compcmd:-''}"}
compdef=${compdef%' '}' '

Expand Down
28 changes: 28 additions & 0 deletions note.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7052,6 +7052,34 @@ bash_tips

2023-11-22

* complete: 'x?' に対する補完設定読み取りに失敗する (reported by maheis) [#2088]
https://github.com/akinomyoga/ble.sh/issues/371#issuecomment-1820927585

complete -p の出力の解析に失敗している。

? reject: というか bash-5.2 以降では普通に eval すれば OK なのでは?

と思ったが解析コードを書き直すのが面倒なので既存のコードをできるだけ使う
事にする。

過去の記録を見ると #D1535 で議論している。この時には 5.2 は未だ登場してい
なくて 5.1 以下の振る舞いについて纏められている。5.2 では更に振る舞いが変
わった (というか patch を送った気がする) ので、それに応じて修正が必要とい
う事。

現在の処理では末尾のコマンド名を削除してから文字列的に -F の引数を抽出する
形になっているが、先ず、末尾のコマンド名の削除に失敗しているのでコマンド名
が -F の引数の中に混入している。更に、-F の引数の quoting が削除できていな
い。bash-5.2 以降では -F の引数やコマンド名も quote される様になったので実
は単純に eval すれば良い。

x ok: 更に関数定義の途中でもエラーが発生する。"x?() { echo [TAB]" 等を実行
している途中で以下のエラーメッセージが出る。

bash: _minimal 'x?()': コマンドが見つかりません

これも実は上の修正で直った。

* 2022-06-14 eterm: Emacs に実装されている M-x term 若しくは M-x ansi-term [#D2087]

端末実装が色々滅茶苦茶である。infocmp にて対応している事になっている機能で
Expand Down

0 comments on commit a7eb5d0

Please sign in to comment.