Skip to content

Commit

Permalink
keymap/vi (decompose-meta): translate "S-a" to "A"
Browse files Browse the repository at this point in the history
  • Loading branch information
akinomyoga committed Mar 1, 2023
1 parent 6d61388 commit 600e845
Show file tree
Hide file tree
Showing 5 changed files with 110 additions and 8 deletions.
7 changes: 5 additions & 2 deletions docs/ChangeLog.md
Expand Up @@ -166,7 +166,10 @@
- decode (`ble-bind`): output bindings of the specified keymaps with `ble-bind -m KEYMAP` (fixup 750ca38) `#D1559` 6e0245a
- keymap/vi: update mode names on change of `bleopt keymap_vi_mode_name_*` (motivated by huresche) `#D1565` 11ac106
- main: show notifications against debug versions of Bash `#D1612` 8f974aa
- term: update `vte` identification `#D1620` 00e74d8
- term: terminal identification
- term (`_ble_term_TERM`): update `vte` identification `#D1620` 00e74d8
- term (`_ble_term_TERM`): detect wezterm-20220408 `#D1909` 486564a
- term (`_ble_term_TERM`): detect konsole `#D1988` xxxxxxx
- edit: suppress only `stderr` with `internal_suppress_bash_output` (motivated by rashil2000) `#D1646` a30887f
- prompt: do not evaluate `PROMPT_COMMAND` for subprompts `#D1654` 08e903e
- Makefile: work around the case the repository is cloned without `--recursive` `#D1655` 22ace5f
Expand Down Expand Up @@ -228,9 +231,9 @@
- color: let `bleopt term_index_colors` override the default if specified `#D1878` 7d238c0
- canvas: update Unicode version 15.0.0 `#D1880` 49e55f4
- decode (`vi_imap-rlfunc.txt`): update the widget for `backward-kill-word` as `kill-backward-{u => c}word` `#D1896` e19b796
- term (`_ble_term_TERM`): detect wezterm-20220408 `#D1909` 486564a
- color: rearrange color table by `ble palette` (suggested by stackoverflow/caoanan) `#D1961` bb8541d
- util (`ble/util/idle`): process events before idle sleep `#D1980` xxxxxxx
- keymap/vi (`decompose-meta`): translate <kbd>S-a</kbd> to <kbd>A</kbd> `#D1988` xxxxxxx

## Fixes

Expand Down
10 changes: 7 additions & 3 deletions keymap/vi.sh
Expand Up @@ -117,7 +117,9 @@ function ble/widget/vi_imap/__default__ {
local esc=27 # ESC
# local esc=$((_ble_decode_Ctrl|0x5b)) # もしくは C-[
ble/decode/widget/skip-lastwidget
ble/decode/widget/redispatch-by-keys "$esc" "$((KEYS[0]&~_ble_decode_Meta))" "${KEYS[@]:1}"
((flag&=~_ble_decode_Meta))
((flag==_ble_decode_Shft&&0x61<=code&&code<=0x7A&&(flag=0,code-=0x20)))
ble/decode/widget/redispatch-by-keys "$esc" "$((flag|code))" "${KEYS[@]:1}"
return 0
fi

Expand All @@ -138,7 +140,9 @@ function ble/widget/vi-command/decompose-meta {
if ((flag&_ble_decode_Meta)); then
local esc=$((_ble_decode_Ctrl|0x5b)) # C-[ (もしくは esc=27 ESC?)
ble/decode/widget/skip-lastwidget
ble/decode/widget/redispatch-by-keys "$esc" "$((KEYS[0]&~_ble_decode_Meta))" "${KEYS[@]:1}"
((flag&=~_ble_decode_Meta))
((flag==_ble_decode_Shft&&0x61<=code&&code<=0x7A&&(flag=0,code-=0x20)))
ble/decode/widget/redispatch-by-keys "$esc" "$((flag|code))" "${KEYS[@]:1}"
return 0
fi

Expand Down Expand Up @@ -8010,7 +8014,7 @@ function ble-decode/keymap:vi_imap/define-meta-bindings {
ble-bind -f 'M-t' 'transpose-ewords'

ble-bind -f 'M-m' '@nomarked non-space-beginning-of-line'
ble-bind -f 'S-M-m' '@marked non-space-beginning-of-line'
ble-bind -f 'M-S-m' '@marked non-space-beginning-of-line'
ble-bind -f 'M-M' '@marked non-space-beginning-of-line'

#----------------------------------------------------------------------------
Expand Down
88 changes: 88 additions & 0 deletions note.txt
Expand Up @@ -6661,6 +6661,94 @@ bash_tips

2023-03-01

* vi_imap: M-S-o に対する fallback が ESC o になっている [#D1988]

これは redispatch の時に S-o が O になっていないのが原因。そもそもの問題と
して S-o も ble-bind を用意しておくべきなのかそれとも常に S に解決するべき
なのかという疑問がある。うーん。然しキーボード上で両者を区別する事に意味は
ない様な気がするのでこれで良い気がする。

? CapsLock が入っている場合にはどうするべきなのか。この場合には実際のキー入
力として [Shift]+[O key] を送っている気がするが、操作としては "o" を送っ
ているつもりなのではないか…。うーん。CapsLock の状態を取得するのは難しい。
それも送信する様にするプロトコルもある様だが、そういうプロトコルばかりで
はないので CapsLock の情報に依存せずに処理できる方法が望ましい。

うーん。結局 CapsLock は信用できないし CapsLock が入っているからと言って
操作体系を変更するのも変な気がするので、そのまま S-o を信じて S-o は常に
O に変換するということで良い気がする。

* 実は類似の箇所が他にもあるのではないか。検索してみると以下の様なものが見つかった。

$ grc 'KEYS(\[[^][]+\])?&~_ble_decode_Meta'
./keymap/vi.sh:120: ble/decode/widget/redispatch-by-keys "$esc" "$((KEYS[0]&~_ble_decode_Meta))" "${KEYS[@]:1}"
./keymap/vi.sh:141: ble/decode/widget/redispatch-by-keys "$esc" "$((KEYS[0]&~_ble_decode_Meta))" "${KEYS[@]:1}"
$ grc '&=?~_ble_decode_Meta'
(同じ物しか当たらなかったので省略)

* reject: 既に似たような処理を何処かで実装している様な気がする。例えばレジ
スターの文字を取得する箇所など。確認する。_ble_decode_Shft で検索すれば見
つかる筈…と思ったが見つからない。 k2c という名前の関数だった気がする。→
ble/keymap:vi/k2c だった。然しこの関数は C-? を byte に戻す役割であって
S-o を O にするなどの処理を実装した物ではなかった。

なので今回はまた別に実装する必要がある。と思ったが既に上記の検索で当たっ
ていた 141 行目が decompose-meta という関数で汎用に用意した物だった。120
だけ特別に実装したものだった。なので基本的にこの二箇所を修正するだけで良
い。

修正した。と思ったが動作していない。

% うーん。実際に流れてきているキーを確認してみたら既に M-S-o は
% M-O に翻訳されていた。なのでわざわざこの場所で再構成する必要はな
% いのであった。という事はちゃんと処理されていない原因は別の場所に
% あるという事になる。

→よく見たら M-O になっていて欲しいのに M-S-o でも M-O でもなく単
に M-o になっていた。受信しているのは 27;2;111 でありこれは S-o で
あるのにも関わらずちゃんと復元できないという事。

===== keys =====
M-o ESC o C-u b l e auto_complete_enter
/ d e b u g C-e C-_ e auto_complete_ente
r n d C-m C-m

うーん。最初に受信した時点で S が消えている。どの時点で消滅したの
か確認する必要がある。

分かった。これは意図的に通常文字に対して S だけが付加されている時にそれを削
除している。何故なら xterm & vte で <Meta-Shift-o> というキー入力に対して
M-S-O というシーケンスを送ってくる為。M-S-o というシーケンスが来た場合には
CapsLock が有効になった状態で Meta+Shift+O → M-S-o となったという解釈なの
である。一方で contra は CapsLock 等関係なく実際のキーの組み合わせに一対一
対応する様に処理している。

* 今回はどの様に修正するか。取り敢えず contra での取り扱いについてはそれ専
用に実装する事にした。一方で他の端末での振る舞いについても考える。konsole
はそもそも modifyOtherKeys に対応していない。単に ESC O を最初から送信し
て来ている。

xterm は CSI 27;4;79 ~ で M も S も同時に指定した状態で来ている。これだと
M-S-o になってしまう。然し本当は M-O になって欲しい。どの様に処理するべき
だろうか。

受信時点で調整しようかと思ったがやはり両方許容しておいて良い様な気がして
きた。もし ESC 大文字 で送られてきたら M-O 等の形式にするのは自然だが、
CSI 27;4;79 ~ 等の形式で来た時にどの様に取り扱うかは微妙。

実際に確認してみると既存の binding は M-S-y と M-Y の両方の形式を同時に設
定する様になっている。取り敢えずは現状のままにしておく事にする。

* konsole の端末判定

https://qiita.com/kefir_/items/0bda5e55f43392420d66 '0;115;0'
https://github.com/KDE/konsole/blob/0bd20ac6542de5ea16d06f5af255389a3afa8f67/src/Vt102Emulation.cpp#L2051 '1;115;0'

以下 (2022-02-24) によると v22.03.80 (2022-03-18) より 1 に変わった様だ。
https://github.com/KDE/konsole/commit/0cc64dcf7b90075bd17e46653df3069208d6a590
以下 (2001-09-16) によると v3.0.0 から 0;115;0 だった様だ。
https://github.com/KDE/konsole/commit/2d93fed82aa27e89c9d7301d09d2e24e4fa4416d

* vim mode ! で複数行の結果を返すと描画位置がずれて変な事になる [#D1987]

どうやら行数が増えると駄目な様だ。単に複数行を replace-range で挿入する
Expand Down
9 changes: 6 additions & 3 deletions src/decode.sh
Expand Up @@ -856,13 +856,16 @@ function ble-decode-char/csi/.modify-key {
# Note: xterm, mintty では modifyOtherKeys で通常文字に対するシフトは
# 文字自体もそれに応じて変化させ、更に修飾フラグも設定する。
# Note: RLogin は修飾がある場合は常に英大文字に統一する。
local term=${_ble_term_TERM[${#_ble_term_TERM[@]}-1]}
if ((33<=key&&key<_ble_decode_FunctionKeyBase)); then
if (((mod&0x01)&&0x31<=key&&key<=0x39)) && [[ $_ble_term_TERM == RLogin:* ]]; then
if (((mod&0x01)&&0x31<=key&&key<=0x39)) && [[ $term == RLogin:* ]]; then
# RLogin は数字に対する S- 修飾の解決はしてくれない。
((key-=16,mod&=~0x01))
elif ((mod==0x01)); then
# S- だけの時には単に S- を外す
mod=0
if [[ $term != contra:* ]]; then
# S- だけの時には単に S- を外す
((mod&=~0x01))
fi
elif ((65<=key&&key<=90)); then
# 他の修飾がある時は英大文字は小文字に統一する
((key|=0x20))
Expand Down
4 changes: 4 additions & 0 deletions src/util.sh
Expand Up @@ -5882,6 +5882,10 @@ function ble/term/DA2/initialize-term {
('0;0;0') _ble_term_TERM[depth]=wezterm:0 ;;
('1;277;0') _ble_term_TERM[depth]=wezterm:20220408 ;; # 2022-04-07 https://github.com/wez/wezterm/commit/ad91e3776808507cbef9e6d758b89d7ca92a4c7e

# Konsole も大体決め打ちにしている。最近変更した様だ。
('0;115;0') _ble_term_TERM[depth]=konsole:30000 ;; # 2001-09-16 https://github.com/KDE/konsole/commit/2d93fed82aa27e89c9d7301d09d2e24e4fa4416d
('1;115;0') _ble_term_TERM[depth]=konsole:220380 ;; # 2022-02-24 https://github.com/KDE/konsole/commit/0cc64dcf7b90075bd17e46653df3069208d6a590

('0;10;1') # Windows Terminal
# 現状ハードコードされている。
# https://github.com/microsoft/terminal/blob/bcc38d04/src/terminal/adapter/adaptDispatch.cpp#L779-L782
Expand Down

0 comments on commit 600e845

Please sign in to comment.