Skip to content

Commit

Permalink
decode: process @esc generated by CSI sequence
Browse files Browse the repository at this point in the history
  • Loading branch information
akinomyoga committed Jun 2, 2024
1 parent e169e31 commit 365101c
Show file tree
Hide file tree
Showing 3 changed files with 137 additions and 12 deletions.
15 changes: 8 additions & 7 deletions docs/ChangeLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@
- mandb: look for git subcommands (motivated by bkerin) `#D2112` 9641c3b8
- edit (`display-shell-version`): show the `atuin` version `#D2124` 9045fb87
- complete: add widgets `auto_complete/insert-?word` (requested by Tommimon) `#D2127` 0c4b6772
- auto-complete: insert word only when the cursor is at the end of line `#D2212` xxxxxxxx
- auto-complete: insert word only when the cursor is at the end of line `#D2212` b72d78a9
- edit: add widgets `execute-named-command` and `history-goto` `#D2144` aa92b42a
- keymap/vi_nmap: support `shell-expand-line` `#D2145` aa92b42a
- decode: fix quoting of `WIDGET` and `LASTWIDGET` (reported by 3ximus) `#D2205` xxxxxxxx
- decode: fix quoting of `WIDGET` and `LASTWIDGET` (reported by 3ximus) `#D2205` 1313390b
- main: support `bash ble.sh --install` `#D2169` 986d26a3 3801a87e
- util(stty): support `bleopt term_stty_restore` (requested by TheFantasticWarrior) `#D2170` e64b02b7
- util: update workaround of Bash 5.2 `checkwinsize` for `term_stty_restore` (reported by TheFantasticWarrior) `#D2184` ef8272a4
Expand Down Expand Up @@ -55,9 +55,10 @@
- decode: specify the default keymap for the keymap load hooks `#D2141` 4a34ccf2
- progcomp(compopt): refactor the completion option `ble/{no- => }default` `#D2155` 51f9f4f6
- main: export `BLE_SESSION_ID` `#D2188` 5871fea2
- menu-complete: adjust cursor position with `insert-selection` disabled (reported by gvlassis) `#D2206` xxxxxxxx
- decode (`ble-bind`): do not convert registered C0 (motivated by gvlassis) `#D2210` xxxxxxxx
- decode (`ble-bind`): support combined option arguments of the forms `--long=OPTARG` and `-kOPTARG` `#D2211` xxxxxxxx
- menu-complete: adjust cursor position with `insert-selection` disabled (reported by gvlassis) `#D2206` 341179d1
- decode (`ble-bind`): do not convert registered C0 (motivated by gvlassis) `#D2210` cbf87fdc
- decode: process <kbd>@ESC</kbd> generated by CSI sequence (reported by gvlassis, 10b14224cc, lokxii) `#D2214` xxxxxxxx
- decode (`ble-bind`): support combined option arguments of the forms `--long=OPTARG` and `-kOPTARG` `#D2211` 1b16d399

## Fixes

Expand Down Expand Up @@ -99,8 +100,8 @@
- prompt: clear list for the cylic dependency detection (reported by micimize, neilbags) `#D2200` 61968497 00cae745b
- util.hook: fix user DEBUG trap not executed at the top-level context `#D2202` 828fcfc1
- keymap/vi(relative-line.impl): fix uninitialized variable `nmove` `#D2203` 4268650d
- edit: render the final prompt before updating command history (motivated by pallaswept) `#D2207` xxxxxxxx
- keymap/vi: fix <kbd>C-w</kbd> not saving the word into kill ring `#D2208` xxxxxxxx
- edit: render the final prompt before updating command history (motivated by pallaswept) `#D2207` 911a4051
- keymap/vi: fix <kbd>C-w</kbd> not saving the word into kill ring `#D2208` aa7ca45d

## Compatibility

Expand Down
99 changes: 99 additions & 0 deletions note.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7370,6 +7370,105 @@ bash_tips
Done (実装ログ)
-------------------------------------------------------------------------------

2024-06-01

* decode: kitty で ESC が動かなくなった (reported by gvlassis, 10b14224cc, lokxii) [#D2214]
https://github.com/akinomyoga/ble.sh/issues/445#issuecomment-2131223529
https://github.com/akinomyoga/ble.sh/issues/454
Ref #D2210

どういう時に ESC を Meta として解釈してどういう時に C-[ として扱い、どうい
う時に ESC として扱えば良いのか分からなくなった。

今までは C-[ か M- かの二種類の解釈しかなかった。ここで ESC になる事も許そ
うと思うとどうしたら良いのか。ESC ESC が入ってきた時に M-ESC になる可能性も
残しておく必要がある?

現在の処理だと 27 が単発で来た時には C-[ に変換されてから unmodified-key に
入ってくる? もし ble-bind -k で map されている場合には ESC の儘入ってくる?
どちらの場合であっても正しく処理する為に key を見るのではなくて seq を見て
ESC である可能性について調べている。

或いは @ESC として受信した場合にはどうするのか。この場合には

? ble-bind -k ESC ESC とした場合に Meta として活性を @ESC と同程度までに落
とす必要はあるだろうか。うーん。というか、そもそも ESC で受信した物は
ble-bind -k ESC で翻訳できるのかという問題もある。ble-bind -k ESC ESC を
実行してもこれに引っかかるのは、prefix として使用された ESC だけである。
なので、ble-bind -k ESC ESC が修飾としての役割を抑制するのだとしたら、こ
れを実行しても孤立 ESC に対して何も効果がないどころか、修飾 ESC も動かな
くなってしまう。

ble-bind -k ESC ESC を実行しても Meta としての役割は保持する様にするべき。

そう思うとやはり meta の判定は元の seq に対して行うべきである。一方で、複
数の文字から翻訳によって得られた ESC に関しては一括で IsolatedESC として
取り扱うべきの気がする。

? 一方で、いざ通常キーとして処理する事になった時に C-[ を送出するべきか ESC
を送出するべきか。今までは一括で C-[ を送っていたが、新しい実装では ESC
を生成した場合には ESC を送るべきなのではないか。これはどの様にして判定す
るべきか。

修飾 ESC が来て通常通りに処理された時は key = C-[ になっている筈なのでそ
れを使えば良い。ユーザーが ble-bind -k ESC ESC を設定している時には key =
ESC のままになっている筈なのでこれもそのまま使えば良い。CSI seq によって
ESC が指定で生成された時にはどうすれば良いか。これは ESC のままで良いので
はないか。そしてこの場合も key は既に ESC になっているので敢えて修正しな
くて良いのでは? と思ったが現在の実装だと @ESC になっている可能性があるの
でそれを ESC か C-[ のどちらかに翻訳する必要がある。

うーん。key = @ESC だった時に二つの可能性がある。CSI seq から ESC が生成
された時にそれを @ESC に変換した物だとすれば、実際に送るべきは ESC の気が
する。一方で、@ESC として初めから readline から受け取った場合には、受診時
には単独の 27 だったという事を暗示しているので C-[ に変換したい。一方で、
ユーザーが明示的に ble-bind -k ESC ESC としている場合にはそのまま C-[ に
変換しても良いのだろうか? 或いは ble-bind -k @ESC ESC とすると、今度は修
飾ESCとして扱われる様になってしまう。

期待する動作について改めて整理する。

通常の設定の場合には ESC が来たらそれは meta 修飾で解釈する。連続で来る等し
て修飾ではなくキーとして解釈する場合には C-[ で解釈する。@ESC が来たらそれ
は @ESC として解釈する。これもキーとして解釈する時には C-[ で解釈する。CSI
u などにより ESC を受け取った時は修飾としては @ESC として取り扱い、キーとし
て解釈する時は ESC として取り扱う。ble-bind -k ESC ESC 等によって変換されて
いる時には meta 修飾で解釈し、キーとして解釈する場合には ESC で解釈する。

? ble-bind -k @ESC X 等と変換している時に、@ESC は Meta 修飾になる事を許す
か? うーん。これは際どいが、@ESC を明示的に X に変換しているのだとしたら、
単体 ESC の作用としての M- を削除していると考えられるので、charseq=(@ESC)
は @ESC として扱わないのが自然の気がする。

(charseq, key) の組を見ればこれらの振る舞いをちゃんと実装できるだろうか。例
えば、

* 前段階で char ESC は単体で key C-[ に変換する。もし ble-bind -k ESC ESC
が設定されている時には key ESC になる。charseq=(27) になる筈なので、何れ
の場合においても meta 修飾として働くかどうかは charseq=(27) である事を確
認すれば良い。

もし既に M- が設定されていて修飾として働かないという場合には、そのまま
C-[ もしくは ESC の解釈に対して M- を設定して M-C-[ もしくは M-ESC とすれ
ば良い。既に key には変換された値が入っているのでそのまま通常文字の如くに
処理を進めれば良い。

char @ESC が来た時にはそのまま key @ESC になっている筈。もしユーザーがe、
ble-bind -k @ESC X で敢えて別のキーに変換している時には @ESC としての振る
舞いは失効させるというので良い。なので、@ESC に関しては key だけ確認すれ
ば良い。

CSI u を通して受信した ESC の取り扱いはどうするか。現在は CSI 受診の側で
強制的に @ESC に変換しているが、寧ろ ESC を処理する側で 2 文字以上のシー
ケンスで ESC を生成した場合は常に @ESC として取り扱うという規則でも良いの
ではないか。その方が例外的な処理が CSI decoder の側で減らせて都合が良い気
がする。

? ユーザーが ble-bind -k ESC X 等として変換したい時に単体 ESC を変換できな
いという文句が出た時にどうするか? そもそも -k は char に対する変換操作な
ので、 CSI u で送られてきた ESC に対しては作用しないのは作用しない。一方
で、ユーザーは ble-bind -k @ESC ... を実行する事はできる。

2024-05-24

* syntax: LS_COLORS='ln=target' (requested by akhilkedia) [#D2213]
Expand Down
35 changes: 30 additions & 5 deletions src/decode.sh
Original file line number Diff line number Diff line change
Expand Up @@ -1399,18 +1399,43 @@ function ble/decode/send-unmodified-key {

local seq
ble/string#split-words seq "${2//_/ }"
local meta=; ((${#seq[@]}==1)) && meta=${seq[0]}
# Note: @ESC は現在の実装では seq の先頭にしか来ない筈。
((seq[0]==_ble_decode_IsolatedESC)) && seq[0]=27

if ((meta==27)); then
# Processing of prefix ESC characters.
if [[ $2 == _27 ]]; then
# We configure readline so that char 27 means a prefix ESC character (which
# is sent immediately before the subsequent characters). We attempt to
# interpret it as the meta modifier regardless of custom conversions to
# key. The key is used as is when the meta modifier is already set.
ble/decode/send-unmodified-key/.add-modifier "$_ble_decode_Meta" && return 0
elif ((meta==_ble_decode_IsolatedESC)); then
((key=(_ble_decode_Ctrl|91)))
fi

# Processing of independent ESC keys. We first convert @ESC to C-[ or ESC.
# Then, we attempt independent ESC keys as the meta modifier.
if
if ((key==_ble_decode_IsolatedESC)); then
if [[ $2 == "_$_ble_decode_IsolatedESC" ]]; then
# When it is generated by a single character @ESC, it means the timeout
# ESC received by readline. In this case, we translate it to key C-[.
key=$((_ble_decode_Ctrl|91))
else
# Otherwise, it is generated by a CSI sequence or a custom conversion by
# "ble-bind -k". In this case, we trnslate it to 27.
key=27
fi
else
# A key ESC explicitly specified by the user can also operate as the meta
# modifier when "bleopt decode_isolated_esc" is enabled.
((key==27))
fi
then
if ! ble/decode/uses-isolated-esc; then
ble/decode/send-unmodified-key/.add-modifier "$_ble_decode_Meta" && return 0
fi
elif ((_ble_decode_KCODE_SHIFT<=$1&&$1<=_ble_decode_KCODE_HYPER)); then
fi

if ((_ble_decode_KCODE_SHIFT<=key&&key<=_ble_decode_KCODE_HYPER)); then
case $1 in
($_ble_decode_KCODE_SHIFT)
ble/decode/send-unmodified-key/.add-modifier "$_ble_decode_Shft" && return 0 ;;
Expand Down

0 comments on commit 365101c

Please sign in to comment.