diff --git a/README-ja_JP.md b/README-ja_JP.md index 868de360..7790cba7 100644 --- a/README-ja_JP.md +++ b/README-ja_JP.md @@ -31,7 +31,9 @@ 詳細は、試用またはインストールに関しては [節1.1](#get-from-source) と [節1.2](#get-from-tarball) を、 `~/.bashrc` の設定に関しては [節1.3](#set-up-bashrc) を御覧ください。 -`fzf` を `ble.sh` と組み合わせてお使いの場合は [節2.8](#set-up-bashrc) を必ず御覧ください。 +> [!NOTE] +> `fzf` を `ble.sh` と組み合わせてお使いの場合は [節2.8](#set-up-bashrc) を必ず +> 御覧ください。
git を用いてソースを取得し ble.sh を生成 diff --git a/README.md b/README.md index e3058340..02b8fc50 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,9 @@ There are two ways to get `ble.sh`: to download and build `ble.sh` using `git`, For the detailed descriptions, see [Sec 1.1](#get-from-source) and [Sec 1.2](#get-from-tarball) for trial/installation, and [Sec 1.3](#set-up-bashrc) for the setup of your `~/.bashrc`. -**If you would like to use fzf** with `ble.sh`, you need to check [Sec 2.8](#fzf-integration). +> [!NOTE] +> If you want to **use fzf with `ble.sh`**, you need to check [Sec +> 2.8](#fzf-integration).
Download and generate ble.sh using git diff --git a/docs/ChangeLog.md b/docs/ChangeLog.md index fc55c385..7aa8848c 100644 --- a/docs/ChangeLog.md +++ b/docs/ChangeLog.md @@ -24,6 +24,7 @@ - keymap/vi_nmap: support `shell-expand-line` `#D2145` aa92b42a - main: support `bash ble.sh --install` `#D2169` 986d26a3 3801a87e - util(stty): support `bleopt term_stty_restore` (requested by TheFantasticWarrior) `#D2170` e64b02b7 + - util: update workaround of Bash 5.2 `checkwinsize` for `term_stty_restore` (reported by TheFantasticWarrior) `#D2184` xxxxxxxx - edit: support `bleopt edit_magic_accept` (requested by pl643, bkerin) `#D2175` 3e9d8907 - main: support shell variable `BLE_VER` `#D2177` a12dedab - edit: support `bleopt edit_magic_accept=verify-syntax` `#D2178` ac84c153 diff --git a/note.txt b/note.txt index 79e28d80..168b0e78 100644 --- a/note.txt +++ b/note.txt @@ -7367,6 +7367,53 @@ bash_tips Done (実装ログ) ------------------------------------------------------------------------------- +2024-02-29 + + * util: term_stty_restore が動かない (reported by TheFantasticWarrior) [#D2184] + https://github.com/akinomyoga/ble.sh/issues/412#issuecomment-1968941175 + + #D2170 + + Bash 5.2 で試したら確かに自分で設定した stty が反映されない。 + ble/term/stty/enter を確認したら全く別の実装になっている。検索してみたら、 + そう言えば Bash 5.2 で checkwinsize が動かない問題の解決の為に + ble/term/stty/enter を上書きしていたのだった。この上書きするコードも同時に + 更新する必要があった。 + + 自分で試してみたが未だ問題がある。最初の initialize の呼び出しの時点で stty + -a の内容が undef になっている。別に internal state で initialize が呼び出 + されている訳でもない。と思ったが PROMPT_COMMAND で attach している時には + readline が用意した internal state で実行されるので stty -a の内容が undef + になっているのである。また bashrc で stty -a をした限りだと、 bashrc を実行 + している段階では stty -a の内容は external になっている。 + term_stty_restore=1 の時には bashrc の中で external state を保存しておく必 + 要がある気がする。 + + x うーん。でも term_stty_restore=1 は blerc で設定されると思うと util.sh の + 読み込みの時点では term_stty_restore=1 になるか分からないのでその場で読み + 取る訳には行かない。blerc を実行した後にまたチェックするのもコードが分散 + して嫌だし、ユーザーが .bashrc で設定を書いた場合に対応できない。 + + term_stty_restore=1 の setter に hook すればこれらの問題は解決するが、 + + x PROMPT_COMMAND の中で term_stty_restore=1 を実行された場合にはやはり問題 + が生じる。取り敢えず、PROMPT_COMMAND の中で最初の term_setty_restore=1 を + 実行する場合は考えない事にする。 + + * 最初から term_stty_restore が設定されている場合については bleopt -I を実 + 行した時点で処理される筈。"bleopt -I" は util.sh の読み込みよりも後にある + のでOK。 + + ble-detach してから stty を変更して再び ble-attach する場合にはまた問題が生 + じる様な気がするが余り気にしない? 或いは問題は簡単に回避できるだろうか? + finalize で clear しておけば問題は生じない。次の initialize の時に設定を読 + み取るから。しかし、その様にすると source ~/.bashrc して新しい ble.sh + session が始まった時にどうなるか不明。うーん。source ~/.bashrc を + PROMPT_COMMAND の中で実行されると困るが (そして実際にその様な事をする人が過 + 去にあった)、そうでなければ問題は起きない気がする。 + + うーん。一応注意書きは何処かに書いておく事にする。 + 2024-02-25 * 2024-02-19 _ble_util_fd_cmd_std* は ble-attach の時の物を覚えるべき [#D2183] diff --git a/src/util.sh b/src/util.sh index 20da2ec2..8a47fe7c 100644 --- a/src/util.sh +++ b/src/util.sh @@ -6462,7 +6462,14 @@ function ble/term/visible-bell/erase { # その場で入力を受信する事ができない。結果として hang した様に見える。 # 従って、enter で -icanon を設定する事にする。 +[[ ${_ble_term_stty_save+set} ]] || _ble_term_stty_save= bleopt/declare -v term_stty_restore '' +function bleopt/check:term_stty_restore { + if [[ $value && ! $_ble_term_stty_save ]]; then + ble/util/assign _ble_term_stty_save 'ble/bin/stty -g' + fi + return 0 +} ## @var _ble_term_stty_state ## 現在 stty で制御文字の効果が解除されているかどうかを保持します。 @@ -6506,10 +6513,10 @@ function ble/term/stty/.initialize-flags { } ble/term/stty/.initialize-flags -_ble_term_stty_save= function ble/term/stty/initialize { if [[ $bleopt_term_stty_restore ]]; then - ble/util/assign _ble_term_stty_save 'ble/bin/stty -g' + [[ $_ble_term_stty_save ]] || + ble/util/assign _ble_term_stty_save 'ble/bin/stty -g' fi ble/bin/stty -ixon -echo -nl -icrnl -icanon \ "${_ble_term_stty_flags_enter[@]}" @@ -6526,6 +6533,10 @@ function ble/term/stty/leave { fi } function ble/term/stty/enter { + # Note (#D2184): This function is overwritten later in Bash 5.2 to work + # around the problem that "checkwinsize" does not work in "bind -x" in Bash + # 5.2. The changes to this function needs to be also reflected in the later + # overwriting version of "ble/term/stty/enter". [[ $_ble_term_stty_state ]] && return 0 if [[ $bleopt_term_stty_restore ]]; then ble/term/stty/initialize @@ -6536,6 +6547,7 @@ function ble/term/stty/enter { } function ble/term/stty/finalize { ble/term/stty/leave + _ble_term_stty_save= } function ble/term/stty/TRAPEXIT { # exit の場合は echo @@ -6658,10 +6670,15 @@ if ((50200<=_ble_bash&&_ble_bash<50300)); then function ble/term/stty/enter { [[ $_ble_term_stty_state ]] && return 0 local ret - ble/util/assign-words ret 'ble/bin/stty -echo -nl -icrnl -icanon "${_ble_term_stty_flags_enter[@]}" size' + if [[ $bleopt_term_stty_restore ]]; then + ble/term/stty/initialize + ble/util/assign-words ret 'ble/bin/stty size' + else + ble/util/assign-words ret 'ble/bin/stty -echo -nl -icrnl -icanon "${_ble_term_stty_flags_enter[@]}" size' + _ble_term_stty_state=1 + fi [[ ${ret[0]} =~ ^[0-9]+$ ]] && LINES=${ret[0]} [[ ${ret[1]} =~ ^[0-9]+$ ]] && COLUMNS=${ret[1]} - _ble_term_stty_state=1 } else ble/term/update-winsize