sistema_progs

Programas para customizar o meu entorno de traballo nos meus equipos persoais
Log | Files | Refs

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