D1435.spike1.patch (5302B)
1 From 0bcc167a48f4052db23dcb0111b640e46a24a317 Mon Sep 17 00:00:00 2001 2 From: Koichi Murase <myoga.murase@gmail.com> 3 Date: Sun, 20 Dec 2020 13:18:21 +0900 4 Subject: [PATCH] D1435 spike1 5 6 --- 7 lib/core-syntax.sh | 9 +++++++++ 8 src/edit.sh | 9 +++++++-- 9 src/util.sh | 34 +++++++++++++++++++++++++++++++++- 10 3 files changed, 49 insertions(+), 3 deletions(-) 11 12 diff --git a/lib/core-syntax.sh b/lib/core-syntax.sh 13 index bcdffa8..fce7f13 100644 14 --- a/lib/core-syntax.sh 15 +++ b/lib/core-syntax.sh 16 @@ -5897,6 +5897,15 @@ function ble/syntax/highlight/cmdtype1 { 17 # #D1341 #D1355 locale 対策 18 function ble/syntax/highlight/cmdtype/.jobs { local LC_ALL=C; jobs; } 2>/dev/null 19 function ble/syntax/highlight/cmdtype/.is-job-name { 20 + # #D1435 trap handler の中で動作している時には jobs はサブシェルの中で実行す 21 + # る。jobs を直接実行する為にはジョブ変化の情報を失わない為に、直前に 22 + # joblist.check でジョブ情報を読んでおかなければならないが、trap handler の中 23 + # だと変なジョブ情報が混入してしまう。 24 + if [[ $ble_builtin_trap_processing ]] && ! ble/util/is-running-in-subshell; then 25 + (ble/syntax/highlight/cmdtype/.is-job-name) 26 + return "$?" 27 + fi 28 + 29 ble/util/joblist.check 30 31 local value=$1 word=$2 32 diff --git a/src/edit.sh b/src/edit.sh 33 index ad05923..06f5450 100644 34 --- a/src/edit.sh 35 +++ b/src/edit.sh 36 @@ -4413,7 +4413,7 @@ function ble/builtin/exit { 37 ((${#opt_args[@]})) || ble/array#push opt_args "$ext" 38 39 local joblist 40 - ble/util/joblist 41 + ble/util/joblist force 42 if ((${#joblist[@]})); then 43 local ret 44 while 45 @@ -4427,6 +4427,11 @@ function ble/builtin/exit { 46 fi 47 [[ $cancel_reason ]] 48 do 49 + # #D1435: trap handler の中だったとしてもサブシェルの中ではなくて直接 50 + # jobs を実行する。何れにしても情報を出力するので、ユーザの目には変なジョ 51 + # ブが混入するのを防げない。サブシェルの中で実行すると、いつまでも変なジョ 52 + # ブ情報が消えず蓄積するので、此処では敢えて trap handler の中でも直接 53 + # jobs を実行する。 54 jobs 55 ble/builtin/read -ep "\e[38;5;12m[ble: There are $cancel_reason]\e[m Leave the shell anyway? [yes/No] " ret 56 case $ret in 57 @@ -7451,7 +7456,7 @@ function ble/widget/command-help/.type { 58 fi 59 60 if [[ $type == keyword && $command != "$literal" ]]; then 61 - if [[ $command == %* ]] && jobs -- "$command" &>/dev/null; then 62 + if [[ $command == %* ]] && ble/util/joblist/is-job "$command"; then 63 type=jobs 64 else 65 # type -a の第二候補を用いる #D1406 66 diff --git a/src/util.sh b/src/util.sh 67 index 91bed57..3641561 100644 68 --- a/src/util.sh 69 +++ b/src/util.sh 70 @@ -1519,6 +1519,7 @@ function ble/builtin/trap/.handler { 71 local _ble_trap_ext=$? _ble_trap_sig=$1 _ble_trap_name=$2 72 73 # ble.sh hook 74 + local ble_builtin_trap_processing=1 75 ble/util/setexit "$_ble_trap_ext" 76 blehook/invoke "$_ble_trap_name" 77 78 @@ -2694,9 +2695,31 @@ function ble/urange#shift { 79 } 80 81 #------------------------------------------------------------------------------ 82 -## 関数 ble/util/joblist 83 + 84 +## 関数 ble/util/joblist/is-job name 85 +## 指定した文字列が jobs によって認識されるジョブ名かどうかを判定します。 86 +function ble/util/joblist/is-job { 87 + if [[ $ble_builtin_trap_processing ]]; then 88 + # #D1435 変なジョブ情報が混入するので trap handler の中では 89 + # ジョブ情報は更新しない。サブシェルの中で判定を行う。 90 + (jobs -- "$1") 91 + else 92 + # ジョブ情報が失われない様に先にジョブ情報を確認してから判定を行う。 93 + ble/util/joblist.check 94 + jobs -- "$1" 95 + fi 96 +} &>/dev/null 97 + 98 +## 関数 ble/util/joblist opts 99 ## 現在のジョブ一覧を取得すると共に、ジョブ状態の変化を調べる。 100 ## 101 +## @var[in] opts 102 +## force trap handler の中でもジョブ情報更新を強制する。 103 +## trap handler の中だと変なジョブ情報を拾うので、 104 +## 通常は trap handler の中ではジョブ一覧は更新しない (#D1435)。 105 +## 然し、exit 等明示的に現在のジョブをチェックする必要がある所では 106 +## 現在のジョブの確認を強制する必要がある。 107 +## 108 ## @var[in,out] _ble_util_joblist_events 109 ## @var[out] joblist ジョブ一覧を格納する配列 110 ## @var[in,out] _ble_util_joblist_jobs 内部使用 111 @@ -2712,6 +2735,15 @@ _ble_util_joblist_jobs= 112 _ble_util_joblist_list=() 113 _ble_util_joblist_events=() 114 function ble/util/joblist { 115 + local opts 116 + # #D1435 trap handler の中で jobs を実行すると変なジョブも拾ってしまうので、 117 + # trap handler の中では joblist の更新は実行しない事にする。単に前回の結果を 118 + # そのまま返して終了する。 119 + if [[ $ble_builtin_trap_processing && :$opts: != *:force:* ]]; then 120 + joblist=("${_ble_util_joblist_list[@]}") 121 + return 0 122 + fi 123 + 124 local jobs0 125 ble/util/assign jobs0 'jobs' 126 if [[ $jobs0 == "$_ble_util_joblist_jobs" ]]; then 127 -- 128 2.21.3 129