Skip to content

Commit

Permalink
decode: reflect changes after "ble-bind --cursor"
Browse files Browse the repository at this point in the history
  • Loading branch information
akinomyoga committed Sep 9, 2022
1 parent 4d2dd35 commit 39efcf9
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 6 deletions.
1 change: 1 addition & 0 deletions docs/ChangeLog.md
Expand Up @@ -27,6 +27,7 @@
- canvas: fix wrong coordinate calculation on linefolding (reported by telometto) `#D1602` 9badb5f
- syntax: support tilde expansions in parameter expansions `#D1513` 0506df2
- decode: support `ble-bind -m KEYMAP --cursor DECSCUSR` (motivated by jmederosalvarado) `#D1514` `#D1515` `#D1516` 79d671d
- decode: reflect changes after `ble-bind --cursor` `#D1873` XXXXXXX
- edit: support `nsearch` options (motivated by Alyetama, rashil2000, carv-silva) `#D1517` 9125795
- edit: support `nsearch` opts `empty=emulate-readline` (motivated by jainpratik163) `#D1661` d68ba61
- edit: support bash-5.2 binding of `prior/next` to `history-search-{for,back}ward` `#D1661` d26a6e1
Expand Down
44 changes: 44 additions & 0 deletions note.txt
Expand Up @@ -6554,6 +6554,50 @@ bash_tips
Done (実装ログ)
-------------------------------------------------------------------------------

2022-09-06

* decode: ble-bind --cursor で設定したカーソルが反映されない [#D1873]

vi のモードを遷移した時にしか反映されない。set -o emacs や set -o vi を実行
してもそのままである。調べたら keymap#{push,pop} の時にしか cursor を設定し
ていない気がする。base を変更した時や ble-bind で cursor を設定した時にも設
定を反映するべきではないか。

* 現在キーを受け付けている状態かどうかをどうやって判定するか。現在表に出て
いる時にだけ cursor 設定をその場で変更する。それ以外の時には記録してある
状態を書き換える、という具合にすれば良いだろうか。

→これは ble/term/cursor-state/set-internal を指定すれば良いだろうか。
実際、keymap/{push,pop} ではこの set-internal を指定している。

他の箇所で一時的に cursor を書き換えていたりはしないか。つまり、同じ
keymap であっても別の要因で別の cursor を表示しているという事はあるだろう
か。→調べたがその場所はない。基本的に keymap/{push,pop} でしか cursor
shape は変更していない様だ。

* base map を設定している箇所を確認する。恐らく reset-default-keymap だけだ
ろう。他は ble-bind -P で INITIALIZE_DEFMAP をしているがここでは
_ble_decode_keymap はしていない。改めて確認したが _ble_decode_keymap を変
更しているのはやはり decode.sh の中では keymap/{push,pop} と
reset-default-keymap だけである。

* ble-bind で cursor を設定した時にもその場で反映したい→対応した。動作も確
認した。

また、以前の xterm.js の為に指定した workaround が動いていないのではないか。
結局 term enter する時に unknown を設定してしまっている。そして、コメントを
見る限りはこれは vim がカーソルの状態を残したまま終了してしまう事に対する対
策の様である。

うーん。これに対してはどの様に対処するべきだろうか。vim の設定が悪いのだと
思えばわざわざ直さなくても良い。と思ったが元々これは ble.sh の中で keymap
の cursor を設定しているのにも拘らず vim の実行後にその設定が変わってしまう
というのが問題なのであった。

default と unknown という値を区別する事にして、ble.sh が cursor 設定を変更
していない時は default という事にしてユーザーコマンドが変更した cursor につ
いては関知しない事にする。

2022-08-31

* 2022-08-23 complete: progcomp 引数について [#D1872]
Expand Down
7 changes: 7 additions & 0 deletions src/decode.sh
Expand Up @@ -1704,6 +1704,9 @@ function ble/decode/keymap#set-cursor {
return 0
fi
builtin eval "_ble_decode_${keymap}_kmap_cursor=\$cursor"
if [[ $keymap == "$_ble_decode_keymap" && $cursor ]]; then
ble/term/cursor-state/set-internal "$((cursor))"
fi
}

## @fn ble/decode/keymap#print keymap [tseq nseq]
Expand Down Expand Up @@ -4016,6 +4019,10 @@ function ble/decode/reset-default-keymap {
[[ $old_base_keymap ]] &&
_ble_decode_keymap=$old_base_keymap ble-decode/widget/.invoke-hook "$_ble_decode_KCODE_DETACH"
ble-decode/widget/.invoke-hook "$_ble_decode_KCODE_ATTACH" # 7ms for vi-mode

# update cursor
local cursor; ble/decode/keymap#get-cursor "$_ble_decode_keymap"
[[ $cursor ]] && ble/term/cursor-state/set-internal "$((cursor))"
fi
}

Expand Down
19 changes: 13 additions & 6 deletions src/util.sh
Expand Up @@ -5595,14 +5595,20 @@ _ble_term_cursor_internal=0
_ble_term_cursor_hidden_current=unknown
_ble_term_cursor_hidden_internal=reveal

# #D1516 今迄にカーソル変更がなく、且つ既定値に戻そうとしている時は
# 何もしない。xterm.js で DECSCUSR(0) がユーザー既定値でない事への
# 対策。外部コマンドがカーソル形状を復元するという事を前提にしている。
_ble_term_cursor_current=0
# #D1516 今迄にカーソル変更がなく、且つ既定値に戻そうとしている時は何
# もしない為、初めから 0 にしておく事にする。xterm.js で DECSCUSR(0)
# がユーザー既定値でない事への対策。外部コマンドがカーソル形状を復元
# するという事を前提にしている。
# #D1873 単に 0 を指定しているだけだと cursor をユーザー設定していなく
# ても、コマンド実行後の term/enter の時に結局 unknown が設定されて、
# DECSCUSR(0) が送信されて問題になる。未だ一度も ble.sh として変更し
# ていない事を表す値として default という物を導入する事にした。
# default の時には term/enter 時のクリアをしない。
_ble_term_cursor_current=default

function ble/term/cursor-state/.update {
local state=$(($1))
[[ $_ble_term_cursor_current == "$state" ]] && return 0
[[ ${_ble_term_cursor_current/default/0} == "$state" ]] && return 0

if [[ ! $_ble_term_Ss ]]; then
case $_ble_term_TERM in
Expand Down Expand Up @@ -6177,7 +6183,8 @@ function ble/term/leave {
ble/term/stty/leave
ble/term/rl-convert-meta/leave
ble/term/leave-for-widget
_ble_term_cursor_current=unknown # vim は復元してくれない
[[ $_ble_term_cursor_current == default ]] ||
_ble_term_cursor_current=unknown # vim は復元してくれない
_ble_term_cursor_hidden_current=unknown
_ble_term_state=external
}
Expand Down

0 comments on commit 39efcf9

Please sign in to comment.