Skip to content

Commit

Permalink
menu (menu-style:desc): work around xenl quirks for relative cursor m…
Browse files Browse the repository at this point in the history
…ovements
  • Loading branch information
akinomyoga committed Jan 8, 2022
1 parent 2140d1e commit 3e136a6
Show file tree
Hide file tree
Showing 3 changed files with 94 additions and 2 deletions.
3 changes: 2 additions & 1 deletion docs/ChangeLog.md
Expand Up @@ -274,10 +274,11 @@
- stty: do not remove keydefs for <kbd>C-u</kbd>, <kbd>C-v</kbd>, <kbd>C-w</kbd>, and <kbd>C-?</kbd> (reported by laoshaw) `#D1683` 82f74f0
- builtin: print usages of emulated builtins on option errors `#D1694` 6f74021
- decode (`ble/builtin/bind`): improve compatibility of the deprecated form `bind key:rlfunc` (motivated by cmplstofB) `#D1698` b6fc4f0
- decode (`ble/builtin/bind`): fix a bug that only lowercase is accepted for deprecated form `bind key:rlfunc` (reported by returntrip) `#D1726` a67458e 0000000
- decode (`ble/builtin/bind`): fix a bug that only lowercase is accepted for deprecated form `bind key:rlfunc` (reported by returntrip) `#D1726` a67458e e363f1b
- complete: work around a false warning messages of gawk-4.0.2 `#D1709` 9771693
- main: work around `XDG_RUNTIME_DIR` of a different user by `su` (reported by zim0369) `#D1712` 8d37048
- main (`ble/util/readlink`): work around non-standard or missing `readlink` (motivated by peterzky) `#D1720` a41279e
- menu (`menu-style:desc`): work around xenl quirks for relative cursor movements `#D1728` 0000000

## Internal changes and fixes

Expand Down
12 changes: 11 additions & 1 deletion lib/core-complete.sh
Expand Up @@ -402,7 +402,17 @@ function ble/complete/menu-style:desc/construct-page {
local ncolumn_max=$(((nrest_item+nline-1)/nline))
((ncolumn>ncolumn_max&&(ncolumn=ncolumn_max)))

local wcolumn=$(((cols-${#colsep}*(ncolumn-1))/ncolumn))
# Note #D1727: 相対移動の時は、右端に接すると端末による振る舞いの違
# いが問題になるので、右端に接しない様に col-1 にする。一部の端末
# については右端に接しても相対移動が壊れないと分かっているので、
# white list で右端に接する事を許可する。
local available_width=$cols
case $_ble_term_TERM in
(screen|tmux|kitty|contra) ;;
(*) ((available_width--)) ;;
esac

local wcolumn=$(((available_width-${#colsep}*(ncolumn-1))/ncolumn))
local wcand_limit=$(((wcolumn+1)*2/3))
((wcand_limit<10&&(wcand_limit=wcolumn)))

Expand Down
81 changes: 81 additions & 0 deletions note.txt
Expand Up @@ -5797,6 +5797,87 @@ bash_tips

2022-01-08

* complete: WA terminal glitch on xenl (reported by telometto) [#D1728]
https://github.com/akinomyoga/ble.sh/issues/166

再現できた。desc が一列表示でかつ一番最後の項目が丁度ぎりぎり収まるか、或い
はおさまり切らない時に問題が生じるということの様だ。また、一列表示の時に
ellipsis の位置がおかしい問題も見られる。これらは実の所同根ではないかと思わ
れる。

うーん。一つバグは見つけた。しかしこれは関係ない → #D1727

ellipsis の位置と行の終端位置が一致していないが、調べてみると wcolumn は実
際の端末の幅と同じにして trace が呼び出されている。結果を見ると、行の終端位
置が誤っているのではなくて ellipsis を出力する位置が誤っているという事に見
える。

ble/util/c2w 8230; echo $ret としても実際に表示している通りの 1 になっている。

→うーん。これは分かった。これは端末による振る舞いの違いだ。xenl 状態にある
時に CUB をした時に、一番最後の列に移動するか或いは一番最後から二番目の列に
移動するかである。vte は 2 番目になる。screen と contra は一番最後の列にな
る。

* これは一度まとめた事が contra にある筈。と思ったがこれは ech などの振る舞
いについてだった。contra のモードに xenl_ech が存在する。

# 行末にカーソルがある時に ECH, ICH, DCH は行の最後の文字に作用します。
f--- mode_xenl_ech private true

CUB CUF についても調べた事がある筈だが、それは contra にはまとめられてい
ない。

$ printf '%*s\e[10DX\n' $COLUMNS 0123456789

* CUD 前に最後の列に移動する
- xterm, terminology, urxvt, alacritty
- vte (GNOME, xfce4, terminator, lxterminal)
- mlterm, RLogin

* xenl の時は右端の境界にいるかの様に動作する
- kitty, screen, tmux, termit, konsole
- contra, Poderosa

この振る舞いを吸収する様にシーケンスを構築する事はできるだろうか?

% * この振る舞いの対処を過去にした事はあるだろうか。eol mark の場合には直後に
% \r をしているので関係ない。
%
% a CUU CUD などを使って強制的に一番最後の列に移動してから移動を開始する? 然
% し、高さが一行しか無い場合には信用できない。本当に端末の高さが一行しか無
% い場合には使えるが、実際にはどちらか一方にだけ移動できる様な状態になって
% いたとすると元の位置に戻ってくる事ができない。
%
% b BS を使ったら元の位置に戻る事ができるだろうか。試して見た所 screen は BS
% を使うと一番最後から 1 番目のセルに移動する。contra や vte は2番目のセル
% に移動する。うーん。なので BS を使った場合端末によって位置が異なるという
% 事。一応この振る舞いは vttest にあるので、screen 等の一部の例外を除いて動
% くべきという事にしてしまっても良いのかもしれない。と思ったが tmux も
% screen の仲間だ。うーん。やはりこれは端末によって振る舞いが異なる。
%
% c 本来、本当の COLUMNS と現在の cols を区別するべきなのではないかという気が
% する。本当の COLUMNS と一致している時に限り特別な動作を行う。と思ったが、
% そうしたとしても現在の端末がどちらの振る舞いをするのか分からなければ、結
% 局どちらの端末でも動く様に書かなければならない。或いは端末の振る舞いを事
% 前にテストしておく必要がある。
%
% d 或いは CUB CUF を一回実行したら意外とどの端末でも同じになるのかもしれない。
% 試してみる事にする。
%
% - ok: wt, vscode (xterm.js), tmux, screen, xterm
%
% と思ったが、これは本当に端末の一番右端にいる時には使えるけれども、それ以
% 外の時には異なる結果になるから使えない。CUF CUB CUB CUF をするとどうなる?
% Class A -> 0 (-2), Class B -> 0 (-1). これだと全然駄目である。
%
% やはり以前も同じ考察をして無理と判断した様な気もする。しかしそれは canvas
% の bottom dock の話だった様な気がしないでもない。

うーん。そもそもそういう理由があるからこそ相対移動は右端に接しない様に設計
していたという事の様な気もする。menu-style:desc も右端に接しない様に修正す
る事にする。

* complete (menu-style:desc): fix not working "bleopt menu_desc_multicolumn_width=" [#D1727]

menu_desc_multicolumn_width= として multicolumn を無効化しようとするとゼロ
Expand Down

0 comments on commit 3e136a6

Please sign in to comment.