From 365101cf5cbe276486c7e1b1a130770dc64fa2ff Mon Sep 17 00:00:00 2001 From: Koichi Murase Date: Sun, 2 Jun 2024 11:45:32 +0900 Subject: [PATCH] decode: process @ESC generated by CSI sequence --- docs/ChangeLog.md | 15 +++---- note.txt | 99 +++++++++++++++++++++++++++++++++++++++++++++++ src/decode.sh | 35 ++++++++++++++--- 3 files changed, 137 insertions(+), 12 deletions(-) diff --git a/docs/ChangeLog.md b/docs/ChangeLog.md index a2f26d1d..a51530bc 100644 --- a/docs/ChangeLog.md +++ b/docs/ChangeLog.md @@ -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 @@ -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 @ESC 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 @@ -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 C-w 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 C-w not saving the word into kill ring `#D2208` aa7ca45d ## Compatibility diff --git a/note.txt b/note.txt index 54daefb6..17e48355 100644 --- a/note.txt +++ b/note.txt @@ -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] diff --git a/src/decode.sh b/src/decode.sh index 9bb5d750..b22447bb 100644 --- a/src/decode.sh +++ b/src/decode.sh @@ -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 ;;