Skip to content

Commit

Permalink
blehook: print reusable code to restore the user hooks
Browse files Browse the repository at this point in the history
  • Loading branch information
akinomyoga committed Aug 24, 2022
1 parent bdb7dd6 commit b763677
Show file tree
Hide file tree
Showing 11 changed files with 98 additions and 46 deletions.
11 changes: 6 additions & 5 deletions ble.pp
Expand Up @@ -1766,7 +1766,7 @@ function ble-update {
ble/builtin/trap/install-hook EXIT
ble/builtin/trap/install-hook INT

blehook ERR+='ble/builtin/trap/invoke ERR'
blehook internal_ERR+='ble/builtin/trap/invoke ERR'
blehook ERR+='ble/function#try TRAPERR'

#%x inc.r|@|src/decode|
Expand Down Expand Up @@ -2036,7 +2036,7 @@ function ble/base/install-prompt-attach {
ble/array#push PROMPT_COMMAND ble/base/attach-from-PROMPT_COMMAND
if [[ $_ble_edit_detach_flag == reload ]]; then
_ble_edit_detach_flag=prompt-attach
blehook PRECMD+=ble/base/attach-from-PROMPT_COMMAND
blehook internal_PRECMD+=ble/base/attach-from-PROMPT_COMMAND
fi
else
local save_index=${#_ble_base_attach_PROMPT_COMMAND[@]}
Expand All @@ -2046,7 +2046,7 @@ function ble/base/install-prompt-attach {
ble/function#trace "$PROMPT_COMMAND"
if [[ $_ble_edit_detach_flag == reload ]]; then
_ble_edit_detach_flag=prompt-attach
blehook PRECMD+="$PROMPT_COMMAND"
blehook internal_PRECMD+="$PROMPT_COMMAND"
fi
fi
}
Expand Down Expand Up @@ -2080,7 +2080,7 @@ function ble/base/attach-from-PROMPT_COMMAND {
((ret==keys[${#keys[@]}-1])) || is_last_PROMPT_COMMAND=
ble/idict#replace PROMPT_COMMAND ble/base/attach-from-PROMPT_COMMAND
fi
blehook PRECMD-=ble/base/attach-from-PROMPT_COMMAND || ((1)) # set -e 対策
blehook internal_PRECMD-=ble/base/attach-from-PROMPT_COMMAND || ((1)) # set -e 対策
else
local save_index=$1 lambda=$2

Expand All @@ -2093,7 +2093,7 @@ function ble/base/attach-from-PROMPT_COMMAND {
ble/util/unlocal PROMPT_COMMAND

# 可能なら自身を各 hook から除去
blehook PRECMD-="$lambda" || ((1)) # set -e 対策
blehook internal_PRECMD-="$lambda" || ((1)) # set -e 対策
if [[ $PROMPT_COMMAND == "$lambda" ]]; then
PROMPT_COMMAND=${_ble_base_attach_PROMPT_COMMAND[save_index]}
else
Expand All @@ -2120,6 +2120,7 @@ function ble/base/attach-from-PROMPT_COMMAND {
# るので PRECMD も発火しておく (PROMPT_COMMAND と PRECMD の順序
# が逆になるが仕方がない。問題になれば後で考える)。
if [[ $is_last_PROMPT_COMMAND ]]; then
ble-edit/exec:gexec/invoke-hook-with-setexit internal_PRECMD
ble-edit/exec:gexec/invoke-hook-with-setexit PRECMD
_ble_prompt_hash=$COLUMNS:$_ble_edit_lineno:prompt_attach
fi
Expand Down
4 changes: 3 additions & 1 deletion docs/ChangeLog.md
Expand Up @@ -172,6 +172,8 @@
- complete: do not show option descriptions for the empty-word completion (requested by geekscrapy) `#D1846` 1c7f7a1
- syntax (`extract-command`): extract unexpected command names as commands `#D1848` 5b63459
- main (`ble-reload`): preserve the original initialization options `#D1852` d8c92cc
- blehook: print reusable code to restore the user hooks `#D1857` XXXXXXX
- blehook: separate internal and user hooks `#D1856` XXXXXXX

## Fixes

Expand Down Expand Up @@ -280,7 +282,7 @@
- command-help (`.read-man`): add missing `ble/util/assign/.rmtmp` `#D1840` 937a164
- complete: fix wrong `COMP_POINT` with `progcomp_alias` `#D1841` 369f7c0
- main (`ble-update`): fix error message with system-wide installation of `ble.sh` (fixed by tars0x9752) 1d2a9c1 a450775
- main. util: fix problems of readlink etc. found by test in macOS (reported by aiotter) `#D1849` fa955c1 `#D1855` XXXXXXX
- main. util: fix problems of readlink etc. found by test in macOS (reported by aiotter) `#D1849` fa955c1 `#D1855` a22e145

## Documentation

Expand Down
2 changes: 1 addition & 1 deletion keymap/emacs.sh
Expand Up @@ -132,7 +132,7 @@ function ble/keymap:emacs/update-mode-indicator {

ble/edit/info/default ansi "$str"
}
blehook PRECMD+=ble/keymap:emacs/update-mode-indicator
blehook internal_PRECMD+=ble/keymap:emacs/update-mode-indicator

## @fn ble/prompt/backslash:keymap:emacs/mode-indicator
function ble/prompt/backslash:keymap:emacs/mode-indicator {
Expand Down
2 changes: 1 addition & 1 deletion keymap/vi.sh
Expand Up @@ -504,7 +504,7 @@ function ble/keymap:vi/update-mode-indicator {

ble/edit/info/default ansi "$str" # 6ms
}
blehook PRECMD+=ble/keymap:vi/update-mode-indicator
blehook internal_PRECMD+=ble/keymap:vi/update-mode-indicator

## @fn ble/prompt/backslash:keymap:vi/mode-indicator
## @var[in,opt] prompt_vi_keymap
Expand Down
14 changes: 7 additions & 7 deletions lib/test-util.sh
Expand Up @@ -1041,16 +1041,16 @@ function is-global() (readonly "$1"; ! local "$1" 2>/dev/null)
# add/remove hook
blehook FOO+='echo hello'
ble/test 'blehook --color=never FOO' \
stdout="blehook FOO+='echo hello'"
stdout="blehook FOO='echo hello'"
ble/test 'blehook/has-hook FOO'
blehook FOO+='echo world'
ble/test 'blehook --color=never FOO' \
stdout="blehook FOO+='echo hello'" \
stdout="blehook FOO='echo hello'" \
stdout="blehook FOO+='echo world'"
ble/test 'blehook/has-hook FOO'
blehook FOO-='echo hello'
ble/test 'blehook --color=never FOO' \
stdout="blehook FOO+='echo world'"
stdout="blehook FOO='echo world'"
ble/test 'blehook/has-hook FOO'
blehook FOO-='echo world'
ble/test 'blehook --color=never FOO' \
Expand All @@ -1062,7 +1062,7 @@ function is-global() (readonly "$1"; ! local "$1" 2>/dev/null)
blehook FOO+='echo world'
blehook FOO='echo empty'
ble/test 'blehook --color=never FOO' \
stdout="blehook FOO+='echo empty'"
stdout="blehook FOO='echo empty'"
ble/test 'blehook/has-hook FOO'

# clear hook
Expand All @@ -1078,15 +1078,15 @@ function is-global() (readonly "$1"; ! local "$1" 2>/dev/null)
blehook FOO+='echo world'
blehook FOO!='echo hello'
ble/test 'blehook --color=never FOO' \
stdout="blehook FOO+='echo hello'${_ble_term_nl}blehook FOO+='echo world'"
stdout="blehook FOO='echo hello'${_ble_term_nl}blehook FOO+='echo world'"
# uniq append
blehook FOO-+='echo hello'
ble/test 'blehook --color=never FOO' \
stdout="blehook FOO+='echo world'${_ble_term_nl}blehook FOO+='echo hello'"
stdout="blehook FOO='echo world'${_ble_term_nl}blehook FOO+='echo hello'"
# uniq prepend
blehook FOO+-='echo hello'
ble/test 'blehook --color=never FOO' \
stdout="blehook FOO+='echo hello'${_ble_term_nl}blehook FOO+='echo world'"
stdout="blehook FOO='echo hello'${_ble_term_nl}blehook FOO+='echo world'"

# invoke hook
blehook FOO=
Expand Down
72 changes: 55 additions & 17 deletions note.txt
Expand Up @@ -1961,23 +1961,6 @@ bash_tips
暫く待っても何も反応がなかったら Bugzilla の方にも提出する事にする。もしく
はメーリングリストに直接問い合わせる。

2022-07-13

* blehook: blehook の出力結果を init.sh にそのまま載せている人がいる。+= なの
で重複してハンドラーが登録されてしまう。

設定を保存・復元する為に a=$(blehook) として後で eval "$a" する様な使い方も
考えられるので、最初の項目については += ではなく = にするべきではないか。うー
ん。然しそれだと後で設定を merge する時に不便なのではないか。色々考えるとど
うするのが便利なのかは非自明になってくるが、やはり自然な実装という事を考え
たら設定を完全に復元するのに使えるコマンドという事で、最初の項目が = で追加
が += という形にするべきである。

それとは別に実は内部 hook はユーザーに見えない様にするべきの気もする。つま
り同名の小文字 hook を用意してそちらに登録する。hook の発火については呼び出
し元で両方とも呼び出す。入れ子にするという手もあるが色々変な事が起こると嫌
なので並列にする。

2022-07-10

* syntax: posix syntax check in posix mode?
Expand Down Expand Up @@ -6648,6 +6631,61 @@ bash_tips
Done (実装ログ)
-------------------------------------------------------------------------------

2022-08-21

* 2022-07-13 blehook: blehook の出力結果を init.sh にそのまま載せている人がいる [#D1857]

これだと += なので重複してハンドラーが登録されてしまう。

設定を保存・復元する為に a=$(blehook) として後で eval "$a" する様な使い方も
考えられるので、最初の項目については += ではなく = にするべきではないか。うー
ん。然しそれだと後で設定を merge する時に不便なのではないか。色々考えるとど
うするのが便利なのかは非自明になってくるが、やはり自然な実装という事を考え
たら設定を完全に復元するのに使えるコマンドという事で、最初の項目が = で追加
が += という形にするべきである。

* 2022-07-13 blehook: 内部 hook はユーザーに見えない様にするべきの気もする [#D1856]

つまり同名の小文字 hook を用意してそちらに登録する。hook の発火については呼
び出し元で両方とも呼び出す。入れ子にするという手もあるが色々変な事が起こる
と嫌なので並列にする。

内部使用の trap について確認する。contrib 等によって設定される物は、ユーザー
から見えても良いので、除外する。

* done: blehook DA2R='ble/color/initialize-term-colors'

これはそもそも内部的に使用する hook であって、全て大文字なのは導入時の偶々
の決定だった。後で大文字 = public という事になったので、初めから public
にする意図があった訳では無い。undocumented でもある。なので、これは
term_DA2R に改名してユーザーからは見えない様にする。

* done/checked: blehook ERR='ble/builtin/trap/invoke ERR'
* done/checked: blehook PRECMD='ble/keymap:vi/update-mode-indicator'

* 実は今まで必ず PRECMD が設定されている事により状態 (PS1) の待避・復元が
毎回実行されるという事態になっていた。つまり、本来はユーザーによって設
定された hook もしくは PROMPT_COMMAND がある時にのみ必要だった退避処理
が毎回実行されていたという事。今回新しく internal_PRECMD と PRECMD を分
離した事により待避が必要な時にのみ実行される様になった。

改めて確認した所、待避・復元されている状態は既定では PS1 だけだったので
大した違いはないかもしれない。但し、bleopt
prompt_command_changes_layout が設定されている時には再描画等の複雑な処
理が実行されていた (が、もしユーザーがこの設定変数を設定しているのであ
れば恐らく PROMPT_COMMAND が設定されているので何れにしても再描画は毎回
実行されたのだろうという気はする)。という事を考えるとこの事は大した影響
はなかったと思われる。

* done/checked: blehook EXIT='ble/history:bash/TRAPEXIT'
* done/checked: blehook INT='ble-edit/exec:gexec/.TRAPINT'
* done/checked: blehook WINCH='ble-edit/attach/TRAPWINCH'

* blehook ERR+='ble/function#try TRAPERR'

これは削除しても良いのではないか。undocumented でもある。うーん。取り敢え
ず ERR についての別項目でまとめて対処する事にする。

2022-07-29

* test: cd -P . / README からリンク for nixpkgs (reported by aiotter) [#D1855]
Expand Down
2 changes: 1 addition & 1 deletion src/color.sh
Expand Up @@ -65,7 +65,7 @@ function ble/color/initialize-term-colors {
bleopt term_true_colors="$value"
fi
}
blehook DA2R+=ble/color/initialize-term-colors
blehook term_DA2R+=ble/color/initialize-term-colors


function ble-color-show {
Expand Down
9 changes: 7 additions & 2 deletions src/def.sh
Expand Up @@ -19,14 +19,17 @@ function blehook/declare {
blehook/declare EXIT
blehook/declare INT
blehook/declare ERR
blehook/declare internal_EXIT
blehook/declare internal_INT
blehook/declare internal_ERR
blehook/declare unload
blehook/declare ATTACH
blehook/declare DETACH

# util.sh

blehook/declare DA1R
blehook/declare DA2R
blehook/declare term_DA1R
blehook/declare term_DA2R

# color.sh

Expand All @@ -46,8 +49,10 @@ blehook/declare history_message
# edit.sh

blehook/declare WINCH
blehook/declare internal_WINCH
blehook/declare CHPWD
blehook/declare PRECMD
blehook/declare internal_PRECMD
blehook/declare PREEXEC
blehook/declare POSTEXEC
blehook/declare widget_bell
Expand Down
10 changes: 6 additions & 4 deletions src/edit.sh
Expand Up @@ -1657,6 +1657,7 @@ function ble/prompt/update {
if ((_ble_textarea_panel==0)); then # 補助プロンプトに対しては PROMPT_COMMAND は実行しない
# Note #D1778: version の内の history count は PROMPT_COMMAND の更新には使わない。
if [[ ${_ble_prompt_hash%:*} != "${version%:*}" && $opts != *:leave:* ]]; then
ble-edit/exec:gexec/invoke-hook-with-setexit internal_PRECMD
if ble/prompt/update/.has-prompt_command || blehook/has-hook PRECMD; then
# #D1750 PROMPT_COMMAND 及び PRECMD が何か出力する時は表示が乱れるので
# クリアする。点滅などを避ける為、既定では off にしておく。
Expand Down Expand Up @@ -2578,7 +2579,7 @@ function ble-edit/attach/.attach {
fi

ble/builtin/trap/install-hook WINCH readline
blehook WINCH-+=ble-edit/attach/TRAPWINCH
blehook internal_WINCH-+=ble-edit/attach/TRAPWINCH

ble-edit/adjust-PS1
ble-edit/adjust-READLINE
Expand Down Expand Up @@ -6362,7 +6363,7 @@ function ble-edit/exec:gexec/.TRAPINT {
fi
}
function ble-edit/exec:gexec/.TRAPINT/reset {
blehook INT-='ble-edit/exec:gexec/.TRAPINT'
blehook internal_INT-='ble-edit/exec:gexec/.TRAPINT'
}
function ble-edit/exec:gexec/invoke-hook-with-setexit {
local -a BLE_PIPESTATUS
Expand Down Expand Up @@ -6428,7 +6429,7 @@ function ble-edit/exec:gexec/.begin {

# C-c に対して
ble/builtin/trap/install-hook INT # 何故か改めて実行しないと有効にならない
blehook INT+='ble-edit/exec:gexec/.TRAPINT'
blehook internal_INT+='ble-edit/exec:gexec/.TRAPINT'
ble-edit/exec:gexec/.TRAPDEBUG/restore
}
function ble-edit/exec:gexec/.end {
Expand Down Expand Up @@ -6545,6 +6546,7 @@ function ble-edit/exec:gexec/.epilogue {
local msg=
if ((_ble_edit_exec_lastexit)); then
# SIGERR処理
ble-edit/exec:gexec/invoke-hook-with-setexit internal_ERR
ble-edit/exec:gexec/invoke-hook-with-setexit ERR
if [[ $bleopt_exec_errexit_mark ]]; then
local ret
Expand Down Expand Up @@ -9232,7 +9234,7 @@ function ble/builtin/read/.loop {
local ret; ble/canvas/panel/save-position; local pos0=$ret
ble/builtin/read/.set-up-textarea || return 1
ble/builtin/trap/install-hook WINCH readline
blehook WINCH=ble/builtin/read/TRAPWINCH
blehook internal_WINCH=ble/builtin/read/TRAPWINCH

local ret= timeout=
if [[ $opt_timeout ]]; then
Expand Down
2 changes: 1 addition & 1 deletion src/history.sh
Expand Up @@ -849,7 +849,7 @@ function ble/history:bash/TRAPEXIT {
ble/builtin/history -w
fi
}
blehook EXIT+=ble/history:bash/TRAPEXIT
blehook internal_EXIT+=ble/history:bash/TRAPEXIT

function ble/history:bash/reset {
if ((_ble_bash>=40000)); then
Expand Down
16 changes: 10 additions & 6 deletions src/util.sh
Expand Up @@ -1611,10 +1611,12 @@ function blehook/.print {
Q=$q$sgr0"\'"$sgr3$q
fi

local elem code='
local elem op_assign code='
if ((${#_ble_hook_h_NAME[@]})); then
op_assign==
for elem in "${_ble_hook_h_NAME[@]}"; do
out="${out}${sgr1}blehook$sgr0 ${sgr2}NAME$sgr0+=${sgr3}$q${elem//$q/$Q}$q$sgr0$nl"
out="${out}${sgr1}blehook$sgr0 ${sgr2}NAME$sgr0$op_assign${sgr3}$q${elem//$q/$Q}$q$sgr0$nl"
op_assign=+=
done
else
out="${out}${sgr1}blehook$sgr0 ${sgr2}NAME$sgr0=$nl"
Expand Down Expand Up @@ -2142,6 +2144,8 @@ function ble/builtin/trap/.handler {
# ble.sh hook
ble/util/joblist.check
ble/util/setexit "$_ble_trap_lastexit" "$_ble_trap_lastarg"
blehook/invoke "internal_$_ble_trap_name"
ble/util/setexit "$_ble_trap_lastexit" "$_ble_trap_lastarg"
blehook/invoke "$_ble_trap_name"
ble/util/joblist.check ignore-volatile-jobs

Expand Down Expand Up @@ -5777,7 +5781,7 @@ function ble/term:cygwin/initialize.hook {
}

function ble/term/DA2R.hook {
blehook DA2R-=ble/term/DA2R.hook
blehook term_DA2R-=ble/term/DA2R.hook
case $_ble_term_TERM in
(contra:*)
_ble_term_cuu=$'\e[%dk'
Expand All @@ -5797,7 +5801,7 @@ function ble/term/.initialize {
fi

ble/string#reserve-prototype "$_ble_term_it"
blehook DA2R+=ble/term/DA2R.hook
blehook term_DA2R+=ble/term/DA2R.hook
}
ble/term/.initialize

Expand Down Expand Up @@ -6365,7 +6369,7 @@ function ble/term/DA2/initialize-term {
return 0
}

function ble/term/DA1/notify { _ble_term_DA1R=$1; blehook/invoke DA1R; }
function ble/term/DA1/notify { _ble_term_DA1R=$1; blehook/invoke term_DA1R; }
function ble/term/DA2/notify {
# Note #D1485: screen で attach した時に外側の端末の DA2R が混入する
# 事がある。2回目以降に受信した内容は ble.sh の内部では使用しない事
Expand Down Expand Up @@ -6396,7 +6400,7 @@ function ble/term/DA2/notify {
((depth)) && return 0
fi

blehook/invoke DA2R
blehook/invoke term_DA2R
}

## @fn ble/term/quote-passthrough seq [level] [opts]
Expand Down

0 comments on commit b763677

Please sign in to comment.