Skip to content

Commit

Permalink
decode (ble-bind): do not convert registered C0
Browse files Browse the repository at this point in the history
  • Loading branch information
akinomyoga committed May 22, 2024
1 parent aa7ca45 commit cbf87fd
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 12 deletions.
1 change: 1 addition & 0 deletions docs/ChangeLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
- 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

## Fixes

Expand Down
55 changes: 55 additions & 0 deletions note.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7388,6 +7388,61 @@ bash_tips

2024-05-22

* decode (ble-bind): ble-bind -k TAB TAB で TAB をそのまま透過する様にできたら良い気がする (motivated by gvlassis) [#D2210]
https://github.com/akinomyoga/ble.sh/issues/445

現在の実装を確認すると ble-bind -k は _ble_decode_cmap_* のテーブルにキーを
登録する様になっている。実際の decode の順序としては 1. (.getent) まず最初
に単体キーを _ble_decode_cmap_ の中に見つけて、その後で
2. (send-unmodified-key) 修飾などの処理を行う様になっている。TAB -> C-i の
変換は二段目の修飾等の処理を行う時点で実行される事になっている。これが問題
である。

C0 の変換に関しては send-unmodified-key の呼び出し元で処理するべきなのでは
ないか? send-unmodified-key の呼び出し元は3箇所ある。.getent で何も見つから
なかった場合 (2箇所の send-unmodified-key の呼び出し) には現在の処理のまま
で良い。一方で、.getent で \d+ で見つかった時の send-unmodified-key に関し
ては変換を抑制する機能があっても良い。実装方法には複数の選択肢がある。

a. send-unmodified-key の外側で変換を行う。

この場合処理の順序が変わる事になるのでそれによって変な問題が起こらないか
考える必要がある。改めて処理を確認してみると変換の前に処理しているのは単
に CHARS (_ble_decode_key__chars を介して渡される) に格納する為の
isolatedESC の翻訳の様なので問題はない。

少し見て send-unmodified-key の呼び出し箇所に応じて変換を実行すれば良いと
思ったが、reach で保存されているキーを取り出す時に .getent で見つかったキー
なのか或いは fallback として名前の値が入っていたのかを区別する方法がない。
状態が区別できる様にする必要がある。もしくは、reach に格納する前に変換を
既に実行する様にするべきか。

b. send-unmodified-key にオプションとして変換抑制を指示する物を追加する。

? ok: ble-bind -k を通して登録した C0 が変換されない様な設定で問題が起こる
可能性は? もし本当に C-h 等に変換して欲しいのであれば、ble-bind -k seq BS
等ではなく初めから ble-bind -k seq C-h と記述する筈だから問題ない気がする。

では今まで M-TAB 等として受信した物は M-C-i 等に変換していなかったのか?
→ 確認してみた所変換していない。よく考えてみれば当然だ。例えば C-TAB 等
として受信したのだとしたらそれは恐らく modifyOtherKeys 等を介して受信した
物だろうから更に変換されてしまっては困る。それに C-TAB を変換すると C-C-i
つまり C-i に等価になってしまって意味がない。

手元の端末では正確にはチェックできないが ble-bind -k TAB TAB を実行した時に
ちゃんと TAB のまま保持される事を確認した。

x 動いていると思っていたら M-* 関連の keybinding が全て動かなくなっていた。
確認してみると send-unmodified-key は ESC / IsolatedESC を見てそれを M-
に変換しているのだった。なので send-unmodified-key に渡す前に C-[ に変換
されていると処理できなくなってしまう。

では C-[ に変換された物を M- にすれば良いのかというとそうでもない。そうす
ると今度は本当に C-[ と入力した物まで M- に変換されてしまうから。

仕方がないので meta を意味するかどうかの判定として seq として単体の文字を
受け取った時にその文字を直接判定に使う事にした。

* keymap/vi: vi での既定の C-w の振る舞いがおかしい [#D2208]

うーん。色々衝撃な事が分かった。
Expand Down
36 changes: 24 additions & 12 deletions src/decode.sh
Original file line number Diff line number Diff line change
Expand Up @@ -1253,7 +1253,9 @@ function ble-decode-char {
((ble_decode_char_rest+=${#rest[@]}))
chars=("${rest[@]}" "${chars[@]:ichar}") ichar=0
else
ble/decode/send-unmodified-key "$char" "_$char"
local ret
ble/decode/process-char/.convert-c0 "$char"
ble/decode/send-unmodified-key "$ret" "_$char"
fi
elif [[ $ent == *_ ]]; then
# /\d*_/ (_ は続き (1つ以上の有効なシーケンス) がある事を示す)
Expand All @@ -1263,7 +1265,9 @@ function ble-decode-char {
_ble_decode_char2_reach_seq=$_ble_decode_char2_seq
elif [[ ! $_ble_decode_char2_reach_key ]]; then
# 1文字目
_ble_decode_char2_reach_key=$char
local ret
ble/decode/process-char/.convert-c0 "$char"
_ble_decode_char2_reach_key=$ret
_ble_decode_char2_reach_seq=$_ble_decode_char2_seq
fi
else
Expand Down Expand Up @@ -1342,6 +1346,20 @@ function ble-decode-char/.getent {
# ble/util/assert '[[ $ent =~ ^[0-9]*_?$ ]]'
}

## @fn ble/decode/process-char/.convert-c0 char
## C0制御文字および [DEL] を [C-文字] に変換します。char = 0..31,127 はそれぞ
## れ C-@ C-a ... C-z C-[ C-\ C-] C-^ C-_ C-? に変換されます。
## @param[in] char
## @var[out] ret
function ble/decode/process-char/.convert-c0 {
ret=$1
if ((0<=ret&&ret<32)); then
((ret|=(ret==0||ret>26?64:96)|_ble_decode_Ctrl))
elif ((ret==127)); then # C-?
((ret=63|_ble_decode_Ctrl))
fi
}

## @fn ble/decode/send-unmodified-key/.add-modifier mod
## @param[in] mod
## The modifier flag
Expand All @@ -1368,7 +1386,6 @@ function ble/decode/send-unmodified-key/.add-modifier {

## @fn ble/decode/send-unmodified-key key seq
## 指定されたキーを修飾して ble-decode-key に渡します。
## key = 0..31,127 は C-@ C-a ... C-z C-[ C-\ C-] C-^ C-_ C-? に変換されます。
## ESC は次に来る文字を meta 修飾します。
## _ble_decode_IsolatedESC は meta にならずに ESC として渡されます。
## @param[in] key
Expand All @@ -1380,20 +1397,15 @@ function ble/decode/send-unmodified-key {
local key=$1
((key==_ble_decode_KCODE_IGNORE)) && return 0

# Note: @ESC は現在の実装では seq の先頭にしか来ない筈。
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 ((0<=key&&key<32)); then
((key|=(key==0||key>26?64:96)|_ble_decode_Ctrl))
elif ((key==127)); then # C-?
((key=63|_ble_decode_Ctrl))
fi

if (($1==27)); then
if ((meta==27)); then
ble/decode/send-unmodified-key/.add-modifier "$_ble_decode_Meta" && return 0
elif (($1==_ble_decode_IsolatedESC)); then
elif ((meta==_ble_decode_IsolatedESC)); then
((key=(_ble_decode_Ctrl|91)))
if ! ble/decode/uses-isolated-esc; then
ble/decode/send-unmodified-key/.add-modifier "$_ble_decode_Meta" && return 0
Expand Down

0 comments on commit cbf87fd

Please sign in to comment.