delay-mc-STOP.patch (2240B)
1 diff --git a/lib/keymap.vi.sh b/lib/keymap.vi.sh 2 index 73ff1e51..692bc637 100644 3 --- a/lib/keymap.vi.sh 4 +++ b/lib/keymap.vi.sh 5 @@ -506,6 +506,11 @@ function ble/keymap:vi/update-mode-indicator { 6 str=$str${str:+' '}$'\e[1;31mREC\e[m' 7 fi 8 9 + if [[ $_ble_edit_integration_mc_precmd_hook && $keymap == vi_imap ]]; then 10 + ble/edit/info/clear 11 + return 12 + fi 13 + 14 ble/edit/info/default ansi "$str" # 6ms 15 } 16 blehook internal_PRECMD!=ble/keymap:vi/update-mode-indicator 17 diff --git a/src/edit.sh b/src/edit.sh 18 index b9d53219..f6e780b6 100644 19 --- a/src/edit.sh 20 +++ b/src/edit.sh 21 @@ -3477,6 +3477,16 @@ function ble/textarea#render { 22 "${_ble_textarea_cur[@]}" 23 "$_ble_textarea_gendx" "$_ble_textarea_gendy") 24 fi 25 + 26 + # Note: mc-4.8.29 以降は PROMPT_COMMAND で kill -STOP を呼び出して、その後 27 + # bash がプロンプトを表示してから停止する瞬間を見てプロンプトを抽出している。 28 + # 一方で、ble.sh は PROMPT_COMMAND で kill -STOP を実行された瞬間に停止してし 29 + # まう。なので、PROMPT_COMMAND に仕掛けられた kill -STOP を削除して代わりに描 30 + # 画した後で自前で kill -STOP $$ を実行する。 31 + if [[ $_ble_edit_integration_mc_precmd_event ]]; then 32 + _ble_edit_integration_mc_precmd_event= 33 + builtin eval -- "$_ble_edit_integration_mc_precmd_hook" 34 + fi 35 } 36 function ble/textarea#redraw { 37 ble/textarea#invalidate 38 @@ -7089,6 +7099,8 @@ function ble-edit/hist_expanded.update { 39 fi 40 } 41 42 +_ble_edit_integration_mc_precmd_hook= 43 +_ble_edit_integration_mc_precmd_event= 44 function ble/widget/accept-line/.is-mc-init { 45 [[ $MC_SID == $$ ]] || return 1 46 47 @@ -7106,6 +7118,11 @@ function ble/widget/accept-line/.is-mc-init { 48 # PS1='\u@\h:\w\$ ' 49 # ------------------------------------- 50 if ((_ble_edit_LINENO<=5)) && [[ $_ble_edit_str == *'PROMPT_COMMAND=${PROMPT_COMMAND:+$PROMPT_COMMAND'* ]]; then 51 + if ble/string#match "$_ble_edit_str" 'pwd>&[0-9]+;kill -STOP \$\$'; then 52 + _ble_edit_integration_mc_precmd_hook=$BASH_REMATCH 53 + local str=${_ble_edit_str//"$BASH_REMATCH"/'_ble_edit_integration_mc_precmd_event=1'} 54 + ble-edit/content/reset-and-check-dirty "$str" 55 + fi 56 return 0 57 fi 58