Skip to content

Commit

Permalink
prompt: support multiline "prompt_rps1"
Browse files Browse the repository at this point in the history
  • Loading branch information
akinomyoga committed Mar 3, 2021
1 parent aae553c commit 4fa139a
Show file tree
Hide file tree
Showing 5 changed files with 460 additions and 166 deletions.
58 changes: 53 additions & 5 deletions lib/test-canvas.sh
Expand Up @@ -2,8 +2,15 @@

ble-import lib/core-test

_ble_test_canvas_contra=
if [[ -x ext/contra ]]; then
_ble_test_canvas_contra=ext/contra
elif [[ $(printf 'hello world' | contra test 5 2) == $' worl\nd ' ]]; then
_ble_test_canvas_contra=contra
fi

function ble/test:canvas/trace.contra {
[[ -x ext/contra ]] || return 0 # skip
[[ $_ble_test_canvas_contra ]] || return 0 # skip

local w=${1%%:*} h=${1#*:} esc=$2 opts=$3 test_opts=$4
local expect=$(sed 's/\$$//')
Expand All @@ -21,14 +28,14 @@ function ble/test:canvas/trace.contra {
ble/string#quote-word "$esc"; local q_esc=$ret
ble/string#quote-word "$opts"; local q_opts=$ret
ble/test --depth=1 --display-code="trace $q_esc $q_opts" \
'{ printf "\e['$((y0+1))';'$((x0+1))'H"; ble/util/put "$out";} | ext/contra test "$termw" "$termh"' \
'{ printf "\e['$((y0+1))';'$((x0+1))'H"; ble/util/put "$out";} | "$_ble_test_canvas_contra" test "$termw" "$termh"' \
stdout="$expect"
}

#------------------------------------------------------------------------------
# from lib/test-canvas.sh

ble/test/start-section 'ble/canvas/trace (relative:confine:measure-bbox)' 6
ble/test/start-section 'ble/canvas/trace (relative:confine:measure-bbox)' 10

# test1

Expand All @@ -49,6 +56,14 @@ ble/test:canvas/trace.contra 20:1 '12345678901234567890hello' confine << EOF
12345678901234567890$
EOF

ble/test:canvas/trace.contra 10:1 $'hello\nworld' confine << EOF
helloworld$
EOF
ble/test:canvas/trace.contra 10:2 $'hello\nworld check' confine << EOF
hello $
world chec$
EOF

# ble/test:ble/canvas/trace

ble/test:canvas/trace.contra 10:6 $'hello\e[B\e[4D123' measure-bbox x=3:y=2 << EOF
Expand All @@ -67,6 +82,19 @@ ble/test:canvas/trace.contra 10:2 日本語 measure-bbox << EOF
EOF
ble/test '[[ $x1-$x2:$y1-$y2 == 0-6:0-1 ]]'

ble/test:canvas/trace.contra 10:2 $'hello\eDworld' measure-bbox << EOF
hello $
world$
EOF
ble/test '[[ $x1-$x2:$y1-$y2 == 0-10:0-2 ]]'

ble/test:canvas/trace.contra 10:2 $'hello\eMworld' measure-bbox << EOF
world$
hello $
EOF
ble/test '[[ $x1-$x2:$y1-$y2 == 0-10:-1-1 ]]'


#------------------------------------------------------------------------------
# from test/check-trace.sh

Expand Down Expand Up @@ -130,7 +158,7 @@ ble/test:canvas/check-trace
#------------------------------------------------------------------------------
# test-trace.sh

ble/test/start-section 'ble/canvas/trace (justify)' 16
ble/test/start-section 'ble/canvas/trace (justify)' 24

ble/test:canvas/trace.contra 30:1 'a b c' justify << EOF
a b c$
Expand Down Expand Up @@ -210,5 +238,25 @@ quick check bar$
test $
EOF

ble/test/end-section
ble/test:canvas/trace.contra 30:3 $'hello\n2021-01-01\nA' right:measure-bbox:measure-gbox << EOF
hello$
2021-01-01$
A$
EOF
ble/test '[[ bbox:$x1,$y1-$x2,$y2 == bbox:0,0-30,3 ]]'
ble/test '[[ gbox:$gx1,$gy1-$gx2,$gy2 == gbox:20,0-30,3 ]]'

ble/test:canvas/trace.contra 30:3 $'hello\n2021-01-01\nA' center:measure-bbox:measure-gbox << EOF
hello $
2021-01-01 $
A $
EOF
ble/test '[[ bbox:$x1,$y1-$x2,$y2 == bbox:0,0-20,3 ]]'
ble/test '[[ gbox:$gx1,$gy1-$gx2,$gy2 == gbox:10,0-20,3 ]]'

ble/test:canvas/trace.contra 10:1 $'xyz\e[4Daxyz' relative:measure-bbox x=3 << EOF
axyz $
EOF
ble/test '[[ bbox:$x1,$y1-$x2,$y2 == bbox:2,0-6,1 ]]'

ble/test/end-section
5 changes: 3 additions & 2 deletions memo/ChangeLog.md
Expand Up @@ -9,7 +9,7 @@
- decode (`ble-decode-kbd`): support various specifications of key sequences `#D1439` 0f01cab
- edit: support new options `bleopt edit_line_type={logical,graphical}` (motivated by 3ximus) `#D1442` 40ae242
- complete: support new options `bleopt complete_limit{,_auto}` (contributed by timjrd) `#D1445` b13f114 5504bbc
- complete: update the default value of `bleopt complete_limit{,auto}` `#D1500` 0000000
- complete: update the default value of `bleopt complete_limit{,auto}` `#D1500` aae553c
- edit (kill/copy): combine multiple kills and copies (suggested by 3ximus) `#D1443` 66564e1
- edit (`{kill,copy}-region-or`): fix unconditionally combined kills/copies (reported by 3ximus) `#D1447` 1631751
- canvas: update emoji database and support `bleopt emoji_version` (motivated by endorfina) `#D1454` d1f8c27
Expand All @@ -21,6 +21,7 @@
- prompt: support `bleopt prompt_status_align=justify` `#D1494` c30a0db
- syntax: properly support case patterns `#D1474` `#D1475` `#D1476` 64b55b7
- keymap/vi: add `ble/keymap:vi/script/get-mode` for user-defined mode strings `#D1488` f25a6e8 462918d
- prompt: support multiline `prompt_rps1` `#D1502` 0000000

## Changes

Expand All @@ -32,7 +33,7 @@
- syntax (`simple-word/is-simple-noglob`): suppress error messages on expansions `#D1461` a56873f
- syntax (`simple-word/eval`): fix unperformed tilde expansions in the background (reported by 3ximus) `#D1463` 6ebec48
- syntax (`simple-word/eval`): propagate timeouts in sync highlighting (reported by 3ximus) `#D1465` c2555e2
- edit: change the priority of `render-defer` and `menu-filter` `#D1501` 0000000
- edit: change the priority of `render-defer` and `menu-filter` `#D1501` aae553c
- complete: perform pathname expansions in subshells (motivated by 3ximus) `#D1450` d511896
- complete: support `bleopt complete_timeout_compvar` to time out pathname expansions for `COMP_WORDS` / `COMP_LINE` `#D1457` cc2881a
- prompt: rename `bleopt prompt_{status_line => term_status}` `#D1462` cca1cbc
Expand Down
126 changes: 122 additions & 4 deletions note.txt
Expand Up @@ -1230,12 +1230,29 @@ bash_tips
空白は既定で '%1.0( ) ' に相当する。その他の文字は '%0.0()X' に相当する物
とする。

* canvas/trace: align=right,center に対応する。高さについても同様に対応して
も良いのかもしれないがそれは必要になってからで良い。

2021-02-24

* trace の g0 は後で合成するのではなくて \e[m の段階で設定するべきなのではないか。
* canvas/trace: trace の g0 は後で合成するのではなくて \e[m の段階で設定する
べきなのではないか。

後、g0 という名前も余りよくない気がする。他の x0 y0 からの連想で初期の g の
値という雰囲気が出てしまう。然し一方で sgr0 からの連想で背景色という雰囲気
もある。実際に別の場所では sgr0 を指定する事によって背景色を設定できる様に
なっている。

名前はさておきどの様に振る舞うのが良いのか。例えば \e[39m で既定色に戻すと
いう操作の場合は本当に端末既定色に戻すべきなのか、或いは g0 で指定した色に
するべきなのかというのは微妙な所である。g0 で指定した色にするべきの気がする。

一方で、下線などの属性に関しては g0 で指定したものから解除できる様にするの
が自然な気もするし、或いは g0 で指定した物は常に設定されているのが自然の様
な気もする。どちらが良いのかは分からない。やはり現状の実装で良い様な気もす
る。

うーん。単に設定のあるなしという捉え方ではなくて下線ありと下線なしという独
立したスタイルがそれぞれあるのだと思えば、やはり g0 を毎回上書きするのでは
なくて、\e[m 等に対応する操作の時にだけ g0 の値に設定するというのが正解の気
がする。

2021-02-23

Expand Down Expand Up @@ -3986,6 +4003,107 @@ bash_tips
Done (実装ログ)
-------------------------------------------------------------------------------

2021-03-03

* 2021-02-28 canvas/trace: align=right,center に対応する [#D1502]

高さについても同様に対応しても良いのかもしれないがそれは必要になってからで
良い。

rps1 の各行右揃えに対応しようと思ったが問題がある。範囲計算がちゃんとできな
いという事。rps1 が横幅一杯に広がれる様にする為には trace の計測開始点は
x=0 でなければならない。然しこれで measure-bbox すると範囲が x=0..COLUMNS
になって横幅一杯になってしまう。一方で、rps1 を表示する時には実際に文字が出
力される範囲を取得したい。これはどの様にするのが良いか。

a 描画開始点を実際に文字が出力される範囲の bbox の左上になる様にする? 然し
それは最後まで範囲計算をしないと求められない。一番最後に、出力シーケンス
の先頭に移動シーケンスをつけ加えれば実装できるが実装が汚くなる。特に右寄
せしていない場合でも同様の機能を提供する等の事を考えると変である。

更に、bbox の左上の位置というのが分かりやすいのかも不明である。何故なら呼
び出し元は配置の結果として何処が bbox の左上になるのかという事を知らない
からである。これは、呼び出し元で bbox の中身の配置について全く関知せずに、
一つの blackbox として取り扱うという場合にのみ妥当である様に思われる。

b 或いは描画開始点を右上にするという手も考えられる。右寄せの場合にはその方
が自然に思われる。

b1 計測の時には取り敢えず x=0 にして計測を行って、その後でユーザーが指定
した (x,y) を起点とした描画シーケンスを構築するのである。然し、その時に
は左に向かうシーケンス等が何処で壁に当たって止まるのかという振る舞いが
変わってしまう。

b2 代わりに unbounded な空間で計測をしてから再配置をするという事を考える
と、今度は折角計測した内容が実は一行の中に収まらなかったという様な自体
が生じる可能性もある。然し、これに関しては現在の実装でも似たような物で
ある。しかし、少なくとも一つのフィールドの幅が行内に収まっていればOK。
一つ一つのフィールドについて絶対範囲ではなくて幅や高さで制限をかける事
になるが、それはまた実装が無駄に複雑になってしまう。

c 或いは measure-bbox で文字列の範囲とカーソル移動の範囲の二種類のどちらを
計測するか指定する事ができるようにする?

両方の情報が欲しい場合も考えられるので、x1 x2 y1 y2 に加えて、x1c x2c y1c
y2c 等を用意する? 少なくともカーソル移動は文字列を包摂するべきである。変
数が増えるのも面倒なので x1[1] x2[1] y1[1] y2[1] 等の様に配列にしてその第
二要素以降に値を格納するという考え方もある。然し、これはインターフェイス
として分かりにくい。

measure-bbox の振る舞いを切り替えられる様にするというのはやはり問題がある
気がする。何れにしても両方の情報が必要になるからである。justify で配置を
する時に出力された文字列の範囲を元にして配置を行うと、端にぶつかった時に
座標計算がずれてしまう可能性がある。一方で、right align の大きさを調べる
為には right を表示する必要がある。

d 行毎に ret x1 x2 y1 y2 x y を算出する。これらの変数を全て配列にする。各行
の bbox の左上 (x1,y1) を ret の出力開始点とする? (x1,y1) への移動に関し
ては自前で実行する。その他の align も全て自分で処理する。

これは微妙。これならそもそも trace に実装する必要もない様な気がする。
(一応 sc/rc で囲んでいる部分やシーケンスを跳ばすという処理が非自明だが)
そもそも trace に渡す前に分割して指定していれば良かったのである。

% 調べて見た所、実は現在の実装は既に文字を出力した範囲の bbox を使う様になっ
% ていた。という事は…。現在の実装で既に right を指定した時の範囲も表示して
% いる物の範囲になっているという事?
% →勘違いだった。ループの最後で記録しているが、これは制御機能によって移動
% した後でも通過する場所に書かれている。

表示が乱れる場合の事を考えると right の時には一旦右端に移動してから其処から
の相対移動で描画するのが良い気がする。これは right の時の特別な取り扱い。

* 現在の範囲追跡のコードを整理するという可能性。現在は移動を伴わないエスケー
プシーケンスであっても記録を行う様になっている。これは無駄な気がする。

また、全てに対して一律に範囲追跡を行っているので、文字列出力のみに対して
計算する等の事ができない。と思ったが、結局最終的に文字列範囲とカーソル移
動範囲の両方の情報が必要になるのであれば、文字列出力範囲に関しては独立し
たコードで実装を行う筈で、これは気にしなくて良い。

opts measure-gbox として出力した文字列の範囲を計算する事にした。

* justify の時に最後に jg[xy][12] から g[xy][12] に転写する

* main-loop の下部の ((w>0)) の処理について

* 何故折返し処理を此処でしているのだろうか? w として有限の幅を設定する制
御機能は限られている。調べた所、print+ と単一文字の時の二通りしか無い。
単一文字に関しては行に収まらない場合には事前に改行を実施している。行に
ぎりぎり収まる時の振る舞いはどうなっているか。うーん。

* gbox は此処で処理するべきの気がする。有限幅の文字列がある時には此処に来
るのだから。というよりこの処理自体を関数にしても良いのではないかという
気もする。

* そもそも此処で行っている処理は put-ascii や put-atomic で行うべきなので
はないだろうか。

→全て各制御機能及び print の内部で measure-bbox, gbox の処理を行う様に変
更した。

取り敢えず rps1 の複数行も実装して動作確認した。OKだと思う。

2021-02-28

* 2021-02-06 render-defer.idle の優先順位を下げたい [#D1501]
Expand Down

0 comments on commit 4fa139a

Please sign in to comment.