sistema_progs

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

D1738.wa-old-patsub_replacement.patch (9911B)


      1 From e945e1f541b09b47db1353b0ebf001761cee40ef Mon Sep 17 00:00:00 2001
      2 From: Koichi Murase <myoga.murase@gmail.com>
      3 Date: Thu, 13 Jan 2022 18:04:32 +0900
      4 Subject: [PATCH] [stub] global: work around bash-5.2a patsub_replacement
      5 
      6 ---
      7  keymap/vi.sh       |   8 ++-
      8  lib/core-syntax.sh |  36 ++++++++------
      9  src/edit.sh        |  12 +++--
     10  src/util.sh        | 121 ++++++++++++++++++++++++++++++++++++---------
     11  4 files changed, 133 insertions(+), 44 deletions(-)
     12 
     13 diff --git a/keymap/vi.sh b/keymap/vi.sh
     14 index e586e54..f3824e0 100644
     15 --- a/keymap/vi.sh
     16 +++ b/keymap/vi.sh
     17 @@ -6971,7 +6971,13 @@ function ble/widget/vi_xmap/visual-replace-char.hook {
     18      fi
     19  
     20      local ins=${_ble_edit_str:beg:end-beg}
     21 -    ins=${ins//[!$'\n']/"$s"}
     22 +    if ((_ble_bash>=50200)) && shopt -q patsub_replacement; then
     23 +      shopt -u patsub_replacement
     24 +      ins=${ins//[!$'\n']/"$s"}
     25 +      shopt -s patsub_replacement
     26 +    else
     27 +      ins=${ins//[!$'\n']/"$s"}
     28 +    fi
     29      ble/widget/.replace-range "$beg" "$end" "$ins"
     30      ble/keymap:vi/needs-eol-fix "$beg" && ((beg--))
     31      _ble_edit_ind=$beg
     32 diff --git a/lib/core-syntax.sh b/lib/core-syntax.sh
     33 index e3214a2..00362f4 100644
     34 --- a/lib/core-syntax.sh
     35 +++ b/lib/core-syntax.sh
     36 @@ -972,16 +972,16 @@ function ble/syntax:bash/cclass/update {
     37      local histc1=${_ble_syntax_bash_histc12:0:1}
     38      local histc2=${_ble_syntax_bash_histc12:1:1}
     39      for key in "${!_ble_syntax_bash_charsFmt[@]}"; do
     40 -      local a=${_ble_syntax_bash_charsFmt[key]}
     41 -      a=${a//@h/$histc1}
     42 -      a=${a//@q/$histc2}
     43 -      _ble_syntax_bash_chars[key]=$a
     44 +      local ret=${_ble_syntax_bash_charsFmt[key]}
     45 +      ble/string#replace "$ret" @h "$histc1"
     46 +      ble/string#replace "$ret" @q "$histc2"
     47 +      _ble_syntax_bash_chars[key]=$ret
     48      done
     49  
     50 -    local a=$_ble_syntax_bash_chars_simpleFmt
     51 -    a=${a//@h/$histc1}
     52 -    a=${a//@q/$histc2}
     53 -    _ble_syntax_bashc_simple=$a
     54 +    local ret=$_ble_syntax_bash_chars_simpleFmt
     55 +    ble/string#replace "$ret" @h "$histc1"
     56 +    ble/string#replace "$ret" @q "$histc2"
     57 +    _ble_syntax_bashc_simple=$ret
     58    fi
     59  
     60    if [[ $seed == *x ]]; then
     61 @@ -2251,8 +2251,9 @@ function ble/syntax:bash/check-history-expansion/.initialize-event {
     62    else
     63      local A="[$histc1]"
     64      [[ $histc1 == '^' ]] && A='\^'
     65 -    rex_event=$_ble_syntax_bash_histexpand_RexEventFmt
     66 -    rex_event=${rex_event//@A/$A}
     67 +    local ret=$_ble_syntax_bash_histexpand_RexEventFmt
     68 +    ble/string#replace "$ret" @A "$A"
     69 +    rex_event=$ret
     70    fi
     71  }
     72  ## @fn ble/syntax:bash/check-history-expansion/.initialize-quicksub
     73 @@ -2262,9 +2263,10 @@ function ble/syntax:bash/check-history-expansion/.initialize-quicksub {
     74    if [[ $histc2 == '^' ]]; then
     75      rex_quicksub=$_ble_syntax_bash_histexpand_RexQuicksubDef
     76    else
     77 -    rex_quicksub=$_ble_syntax_bash_histexpand_RexQuicksubFmt
     78 -    rex_quicksub=${rex_quicksub//@A/[$histc2]}
     79 -    rex_quicksub=${rex_quicksub//@C/$histc2}
     80 +    local ret=$_ble_syntax_bash_histexpand_RexQuicksubFmt
     81 +    ble/string#replace "$ret" @A "[$histc2]"
     82 +    ble/string#replace "$ret" @C "$histc2"
     83 +    rex_quicksub=$ret
     84    fi
     85  }
     86  function ble/syntax:bash/check-history-expansion/.check-modifiers {
     87 @@ -4450,8 +4452,12 @@ function ble/syntax:bash/ctx-heredoc-word/escape-delimiter {
     88    local ret=$1
     89    if [[ $ret == *[\\\'$_ble_term_IFS$_ble_term_FS]* ]]; then
     90      local a b fs=$_ble_term_FS
     91 -    a=\\   ; b="\\$a"; ret="${ret//"$a"/$b}"
     92 -    a=\'   ; b="\\$a"; ret="${ret//"$a"/$b}"
     93 +    if ((_ble_bash>=50200)) && shopt -q patsub_replacement; then
     94 +      b='\\&'; ret="${ret//[\\\']/$b}"
     95 +    else
     96 +      a=\\   ; b="\\$a"; ret="${ret//"$a"/$b}"
     97 +      a=\'   ; b="\\$a"; ret="${ret//"$a"/$b}"
     98 +    fi
     99      a=' '  ; b="$_ble_syntax_bash_heredoc_EscSP"; ret="${ret//"$a"/$b}"
    100      a=$'\t'; b="$_ble_syntax_bash_heredoc_EscHT"; ret="${ret//"$a"/$b}"
    101      a=$'\n'; b="$_ble_syntax_bash_heredoc_EscLF"; ret="${ret//"$a"/$b}"
    102 diff --git a/src/edit.sh b/src/edit.sh
    103 index 4650217..bdee4e7 100644
    104 --- a/src/edit.sh
    105 +++ b/src/edit.sh
    106 @@ -601,10 +601,14 @@ _ble_prompt_term_status_data=()
    107  function ble/prompt/print {
    108    local text=$1 a b
    109    if [[ ! $prompt_noesc && $text == *['$\"`']* ]]; then
    110 -    a='\' b='\\' text=${text//"$a"/$b}
    111 -    a='$' b='\$' text=${text//"$a"/$b}
    112 -    a='"' b='\"' text=${text//"$a"/$b}
    113 -    a='`' b='\`' text=${text//"$a"/$b}
    114 +    if ((_ble_bash>=50200)) && shopt -q patsub_replacement; then
    115 +      text=${text//[\\\$\"\`]/\\\\&}
    116 +    else
    117 +      a='\' b='\\' text=${text//"$a"/$b}
    118 +      a='$' b='\$' text=${text//"$a"/$b}
    119 +      a='"' b='\"' text=${text//"$a"/$b}
    120 +      a='`' b='\`' text=${text//"$a"/$b}
    121 +    fi
    122    fi
    123    ble/canvas/put.draw "$text"
    124  }
    125 diff --git a/src/util.sh b/src/util.sh
    126 index 3a7c16a..6ce9e42 100644
    127 --- a/src/util.sh
    128 +++ b/src/util.sh
    129 @@ -115,7 +115,13 @@ function bleopt/.read-arguments {
    130  
    131          if [[ $op ]]; then
    132            var=("${var[@]}") # #D1570: WA bash-3.0 ${scal[@]/x} bug
    133 -          ble/array#push specs "${var[@]/%/=$value}" # #D1570 WA checked
    134 +          if ((_ble_bash>=50200)) && shopt -q patsub_replacement; then
    135 +            shopt -u patsub_replacement
    136 +            ble/array#push specs "${var[@]/%/=$value}" # #D1570 WA checked
    137 +            shopt -s patsub_replacement
    138 +          else
    139 +            ble/array#push specs "${var[@]/%/=$value}" # #D1570 WA checked
    140 +          fi
    141          else
    142            ble/array#push pvars "${var[@]}"
    143          fi
    144 @@ -771,11 +777,18 @@ function ble/array#replace {
    145  }
    146  
    147  function ble/dense-array#fill-range {
    148 -  ble/array#reserve-prototype $(($3-$2))
    149 -  local _ble_script='
    150 -    local -a sARR; sARR=("${_ble_array_prototype[@]::$3-$2}")
    151 -    ARR=("${ARR[@]::$2}" "${sARR[@]/#/$4}" "${ARR[@]:$3}")' # WA #D1570 checked
    152 -  builtin eval -- "${_ble_script//ARR/$1}"
    153 +  if ((_ble_bash>=50200)) && shopt -q patsub_replacement; then
    154 +    shopt -u patsub_replacement
    155 +    ble/dense-array#fill-range "$@"
    156 +    shopt -s patsub_replacement
    157 +    return
    158 +  else
    159 +    ble/array#reserve-prototype $(($3-$2))
    160 +    local _ble_script='
    161 +      local -a sARR; sARR=("${_ble_array_prototype[@]::$3-$2}")
    162 +      ARR=("${ARR[@]::$2}" "${sARR[@]/#/$4}" "${ARR[@]:$3}")' # WA #D1570 checked
    163 +    builtin eval -- "${_ble_script//ARR/$1}"
    164 +  fi
    165  }
    166  
    167  function ble/idict#copy {
    168 @@ -796,15 +809,48 @@ function ble/string#reserve-prototype {
    169    done
    170  }
    171  
    172 +## @fn ble/string#replace str before after
    173 +##   @param[in] str before after
    174 +##   @var[out] ret
    175 +if ((_ble_bash>=50200)); then
    176 +  function ble/string#replace {
    177 +    if shopt -q patsub_replacement; then
    178 +      shopt -u patsub_replacement
    179 +      ret=${1//"$1"/$2}
    180 +      shopt -s patsub_replacement
    181 +    else
    182 +      ret=${1//"$1"/$2}
    183 +    fi
    184 +  }
    185 +else
    186 +  function ble/string#replace {
    187 +    ret=${1//"$1"/$2}
    188 +  }
    189 +fi
    190 +
    191  ## @fn ble/string#repeat str count
    192  ##   @param[in] str
    193  ##   @param[in] count
    194  ##   @var[out] ret
    195 -function ble/string#repeat {
    196 -  ble/string#reserve-prototype "$2"
    197 -  ret=${_ble_string_prototype::$2}
    198 -  ret="${ret// /$1}"
    199 -}
    200 +if ((_ble_bash>=50200)); then
    201 +  function ble/string#repeat {
    202 +    ble/string#reserve-prototype "$2"
    203 +    ret=${_ble_string_prototype::$2}
    204 +    if shopt -q patsub_replacement; then
    205 +      shopt -u patsub_replacement
    206 +      ret="${ret// /$1}"
    207 +      shopt -s patsub_replacement
    208 +    else
    209 +      ret="${ret// /$1}"
    210 +    fi
    211 +  }
    212 +else
    213 +  function ble/string#repeat {
    214 +    ble/string#reserve-prototype "$2"
    215 +    ret=${_ble_string_prototype::$2}
    216 +    ret="${ret// /$1}"
    217 +  }
    218 +fi
    219  
    220  ## @fn ble/string#common-prefix a b
    221  ##   @param[in] a b
    222 @@ -1074,16 +1120,41 @@ function ble/string#rtrim {
    223  ##   @param[in]     chars1
    224  ##   @param[in,opt] chars2
    225  ##   @var[out] ret
    226 -function ble/string#escape-characters {
    227 -  ret=$1
    228 -  if [[ $ret == *["$2"]* ]]; then
    229 -    local chars1=$2 chars2=${3:-$2}
    230 -    local i n=${#chars1} a b
    231 -    for ((i=0;i<n;i++)); do
    232 -      a=${chars1:i:1} b=\\${chars2:i:1} ret=${ret//"$a"/$b}
    233 -    done
    234 -  fi
    235 -}
    236 +if ((_ble_bash>=50200)); then
    237 +  function ble/string#escape-characters {
    238 +    ret=$1
    239 +    if [[ $ret == *["$2"]* ]]; then
    240 +      local patsub_replacement=
    241 +      shopt -q patsub_replacement && patsub_replacement=1
    242 +      if [[ $3 ]]; then
    243 +        shopt -s patsub_replacement
    244 +        ret=${ret//["$2"]/\\\\&}
    245 +        [[ $patsub_replacement ]] ||
    246 +          shopt -u patsub_replacement
    247 +      else
    248 +        shopt -u patsub_replacement
    249 +        local chars1=$2 chars2=${3:-$2}
    250 +        local i n=${#chars1} a b
    251 +        for ((i=0;i<n;i++)); do
    252 +          a=${chars1:i:1} b=\\${chars2:i:1} ret=${ret//"$a"/$b}
    253 +        done
    254 +        [[ ! $patsub_replacement ]] ||
    255 +          shopt -s patsub_replacement
    256 +      fi
    257 +    fi
    258 +  }
    259 +else
    260 +  function ble/string#escape-characters {
    261 +    ret=$1
    262 +    if [[ $ret == *["$2"]* ]]; then
    263 +      local chars1=$2 chars2=${3:-$2}
    264 +      local i n=${#chars1} a b
    265 +      for ((i=0;i<n;i++)); do
    266 +        a=${chars1:i:1} b=\\${chars2:i:1} ret=${ret//"$a"/$b}
    267 +      done
    268 +    fi
    269 +  }
    270 +fi
    271  
    272  ## @fn ble/string#escape-for-sed-regex text
    273  ## @fn ble/string#escape-for-awk-regex text
    274 @@ -5301,8 +5372,9 @@ function ble/term/visible-bell:term/init {
    275    _ble_term_visible_bell_prev=(term "$message")
    276  }
    277  function ble/term/visible-bell:term/show {
    278 -  local sgr=$1 message=${_ble_term_visible_bell_prev[1]}
    279 -  ble/util/put "${_ble_term_visible_bell_show//'%message%'/$sgr$message}" >&2
    280 +  local sgr=$1 message=${_ble_term_visible_bell_prev[1]} ret
    281 +  ble/string#replace "$_ble_term_visible_bell_show" %message% "$sgr$message"
    282 +  ble/util/put "$ret" >&2
    283  }
    284  function ble/term/visible-bell:term/update {
    285    ble/term/visible-bell:term/show "$@"
    286 @@ -5619,7 +5691,8 @@ function ble/term/cursor-state/.update {
    287    local state=$(($1))
    288    [[ $_ble_term_cursor_current == "$state" ]] && return 0
    289  
    290 -  local ret=${_ble_term_Ss//@1/$state}
    291 +  local ret
    292 +  ble/string#replace "$_ble_term_Ss" @1 "$state"
    293  
    294    # Note: 既に pass-through seq が含まれている時はスキップする。
    295    [[ $ret && $ret != $'\eP'*$'\e\\' ]] &&
    296 -- 
    297 2.33.1
    298