Skip to content

Commit

Permalink
util: update workaround of Bash 5.2 checkwinsize for term_stty_restore
Browse files Browse the repository at this point in the history
  • Loading branch information
akinomyoga committed Feb 28, 2024
1 parent a508a82 commit ef8272a
Show file tree
Hide file tree
Showing 5 changed files with 75 additions and 6 deletions.
4 changes: 3 additions & 1 deletion README-ja_JP.md
Original file line number Diff line number Diff line change
Expand Up @@ -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) を必ず
> 御覧ください。
<details open><summary><b><code>git</code> を用いてソースを取得し <code>ble.sh</code> を生成</b></summary>

Expand Down
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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).
<details open><summary><b>Download and generate <code>ble.sh</code> using <code>git</code></b></summary>

Expand Down
1 change: 1 addition & 0 deletions docs/ChangeLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
47 changes: 47 additions & 0 deletions note.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down
25 changes: 21 additions & 4 deletions src/util.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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 で制御文字の効果が解除されているかどうかを保持します。
Expand Down Expand Up @@ -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[@]}"
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit ef8272a

Please sign in to comment.