diff --git a/docs/ChangeLog.md b/docs/ChangeLog.md
index bfbc7d4a..0f4ee072 100644
--- a/docs/ChangeLog.md
+++ b/docs/ChangeLog.md
@@ -337,6 +337,7 @@
- highlight: fix a bug that `bleopt filename_ls_colors` is not working (reported by qoreQyaS) `#D1919` b568ade
- bind: fix M-C-@, C-x C-@, and M-C-x (`bash-4.2 -o emacs`) `#D1920` a410b03
- complete (action:file): support `ble/syntax-raw` in the filename extraction (reported by qoreQyaS) `#D1921` 32277da
+- decode: fix a bug that the tab completion do not work with bash-4.4 and lower `#D1928` xxxxxxx
## Documentation
diff --git a/note.txt b/note.txt
index 584da535..a635fd46 100644
--- a/note.txt
+++ b/note.txt
@@ -6846,6 +6846,31 @@ bash_tips
Done (実装ログ)
-------------------------------------------------------------------------------
+2023-01-31
+
+ * decode: bash-4.4 以下で補完が全く起動されない [#D1928]
+
+ cygwin で completion を起動しようとすると固まる。何故?
+ 最近の変更が原因かもしれない。確認する必要がある。
+
+ そもそも complete が全く呼び出されていない。色々試してみたがそもそもキー入
+ 力がちゃんと通っていない気がする。
+
+ auto-complete 候補が出ていても出ていなくても関係ない。
+
+ どうも 138c476 の前後で振る舞いが変わっている。+o posix を追加すると問題が
+ 再現する。どうもそもそも $_ble_bash_options_adjusted が有効になっていない状
+ 態で .hook が呼び出されている。然し、それもなぜだか分からない。
+
+ Linux でも bash-4.4 以下で再現する。
+
+ うーん。分かって来た。set +o posix すると complete が bash の complete に変
+ わってしまう。ここで readline のコマンドラインは空なのでコマンド名補完が行
+ われる。no_empty_cmd_completion off にしているので、そのまま全てのコマンド
+ の補完を処理しようとして固まる。
+
+ set +o posix は実際に変化がある時にのみ実行するべきである。
+
2023-01-30
* main: 空の LANG に対して警告を表示する (movivated by Ultra980) [#D1927]
diff --git a/src/decode.sh b/src/decode.sh
index 0b400ed6..bea005b2 100644
--- a/src/decode.sh
+++ b/src/decode.sh
@@ -638,6 +638,18 @@ elif ((_ble_bash>=40000)); then
ble/function#suppress-stderr ble/decode/nonblocking-read
fi
+function ble-decode/.hook/adjust-volatile-options {
+ # Note: bind -x 内の set +v は揮発性なのでできるだけ先頭で set +v しておく。
+ # (PROLOGUE 内から呼ばれる) stdout.on より前であれば大丈夫 #D0930
+ if [[ $_ble_bash_options_adjusted ]]; then
+ set +ev
+ fi
+ if [[ $_ble_bash_POSIXLY_CORRECT_adjusted && ${POSIXLY_CORRECT+set} ]]; then
+ set +o posix
+ ble/base/workaround-POSIXLY_CORRECT
+ fi
+}
+
_ble_decode_hook_Processing=
function ble-decode/.hook {
if ble/util/is-stdin-ready; then
@@ -645,7 +657,7 @@ function ble-decode/.hook {
local buflen=${#_ble_decode_input_buffer[@]}
if ((buflen%257==0&&buflen>=2000)); then
- [[ ! $_ble_bash_options_adjusted ]] || set +ev +o posix
+ ble-decode/.hook/adjust-volatile-options
local IFS=$_ble_term_IFS
local _ble_decode_hook_Processing=prologue
@@ -678,9 +690,7 @@ function ble-decode/.hook {
return 0
fi
- # Note: bind -x 内の set +v は揮発性なのでできるだけ先頭で set +v しておく。
- # (PROLOGUE 内から呼ばれる) stdout.on より前であれば大丈夫 #D0930
- [[ ! $_ble_bash_options_adjusted ]] || set +ev +o posix
+ ble-decode/.hook/adjust-volatile-options
local IFS=$_ble_term_IFS
local _ble_decode_hook_Processing=prologue