Skip to content

Commit

Permalink
canvas: adjust GraphemeClusterBreak of hankaku-kana voiced marks
Browse files Browse the repository at this point in the history
  • Loading branch information
akinomyoga committed Oct 1, 2023
1 parent 2783d3d commit 31d168c
Show file tree
Hide file tree
Showing 4 changed files with 128 additions and 0 deletions.
1 change: 1 addition & 0 deletions docs/ChangeLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
- edit: update mc-4.8.29 integration (reported by mooreye) `#D2062` 2c4194a2 68c5c5c4
- make: work around `make-3.81` bug of pattern rules `#D2065` f7ec170b
- decode: work around `convert-meta on` in bash >= 5.2 with broken locale (reported by 3ximus) `#D2069` 226f9718
- canvas: adjust GraphemeClusterBreak of hankaku-kana voiced marks `#D2077` xxxxxxxx

## Contrib

Expand Down
6 changes: 6 additions & 0 deletions lib/test-canvas.sh
Original file line number Diff line number Diff line change
Expand Up @@ -391,6 +391,9 @@ else
fi

(
# Disable terminal-specific tailored grapheme cluster for testing purpose.
_ble_unicode_GraphemeClusterBreak_custom=()

bleopt emoji_opts=ri:tpvs:epvs:zwj
ble/test 'ble/unicode/GraphemeCluster/c2break "$((0x20))"' ret="$_ble_unicode_GraphemeClusterBreak_Other"
ble/test 'ble/unicode/GraphemeCluster/c2break "$((0x41))"' ret="$_ble_unicode_GraphemeClusterBreak_Other"
Expand Down Expand Up @@ -491,6 +494,9 @@ fi

ble/test/start-section 'ble/unicode/GraphemeCluster/c2break (GraphemeBreakTest.txt)' 3251
(
# Disable terminal-specific tailored grapheme cluster for testing purpose.
_ble_unicode_GraphemeClusterBreak_custom=()

bleopt emoji_opts=ri:tpvs:epvs:zwj
tests_cases=(
#%< test-canvas.GraphemeClusterTest.sh
Expand Down
104 changes: 104 additions & 0 deletions note.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1926,6 +1926,20 @@ bash_tips
キャッシュにあった。確認すると builtin bind '"\e[":"\xC0\x9B["' で bind
しているので実行するコマンド自体が壊れていたとかそういう事ではないはず。

* どうやら単に以下を実行しただけで既に再現する。

$ bash-5.2 --norc
$ bind '"\e[":"abcd"'
$ bind -s

そして M-[ を押すと (多少の keymap delay の後に) abcd が入力される。つま
り、実際に \e[\000 が束縛されているというよりは表示の際に変な表示になって
しまっているという事の気がする。

これが実際に何らかの問題を具体的に引き起こす事はあるだろうか。そもそも通
常は \e[ は単独では bind しない。なので、例えば ble-detach の時に復元する
対象にはなっていないと考えられる。

2023-09-03

* complete: copilot
Expand Down Expand Up @@ -7051,6 +7065,96 @@ bash_tips
Done (実装ログ)
-------------------------------------------------------------------------------

2023-10-01

* ext/fzf: $() は blink-matching-paren on の時 `` より遅い [#D2077]
https://github.com/junegunn/fzf/commit/e0b29e437be458066fca4dab39b282dfc11466f6

という謎情報があるが GitHub のエラーで現在ページが見えない。

→これは単に fzf の実装が bind マクロを通じて実装されている為に、$() が実際
にマクロで入力される文字列の中に含まれていると blink-matching-paren on の時
に bash が sleep を挟んで一致する括弧の highlighting を実行するという話だっ
た。

そもそも ble.sh では blink-matching-paren に対応していないし、対応するとし
ても delay は入れない様にするだろうし、またマクロを通じた実装もできるだけ避
ける様にしたい (とは言いつつ bash-3.? with ble.sh で fzf key-bindings を使
おうとすると結局マクロによって文字列を入力する様になる)。

* canvas: ジョン 等の文字列の幅が端末と整合していない [#D2076]

"ジョン" 文字幅が正しく計算されていない。emacs はちゃんと処理できている様だ。
つまり、規則に従うと濁点は前の文字に吸収される事になっているが実際にはそう
ではないという事。これは規則の穴として処理するべき事の気がする。

→実際に ble/util/s2w で計測してみた所、幅3という事になっている。そもそも何
故そのような事になっているのだろうか。処理を確認する。うーん。grapheme
cluster として読み取っている。そしてその grapheme cluster の大きさを台字の
大きさをそのまま返す様にしているのが問題の様である。

? そもそも他の端末では正しく実装できているのだろうか (もしくはどの様に実装
しているのか)

→うーん。他の端末ではちゃんと濁点も幅を持って描画されるし、論理的にも内
部では半角の幅を持って計算されている様である。更に言うならば行末での振る
舞いを見る限りは grapheme cluster としての認識もされていない。

xterm, terminology, lxterminal で確認した。可能な限り Unicode に書かれて
いる物をそのまま実装しようとしている kitty ですらも半角カナの濁点・半濁点
に関しては GraphemeCluster の Extend ではなく独立した文字として行折返し等
を処理している様だ。

つまり、そもそも grapheme cluster として取り扱わない様に修正するべきである。
念の為、濁点がどの様なカテゴリになっているのかについて確認する。
ble/unicode/GraphemeCluster/c2break の出力を確認すると濁点は
GraphemeClusterBreak Extend という事になっている。

[修正方法]

make/canvas.emoji.sh を確認してみると中で _ble_unicode_GraphemeClusterBreak
に値を設定しているので、これに倣って値を上書きして良いのではないかという気
がする。周辺の文字で Extend になっている文字の一覧を見ることができれば良い。
元にしているデータベースの方を先ずは確認する

* 元にしているデータの時点で Extend になっている。

* 半角カナ周辺では濁点と半濁点だけが Extend になっている様に見える。
FE20..FE2F に combining ligature というのがあるが、これは明示的に前の文字
を修飾する物なので、半角カナの様な特別な取り扱いは不要である。

→取り敢えず半角カナの濁点と半濁点だけを修正の対象とする事にする。

* recjt: もう一つ気づいた事は、元の GraphemeClusterProperty.txt では一緒に
GeneralCategory も表示していてカタカナの濁点・反濁点は Lm になっていて他
の Extend と異なっている。或いは、GeneralCategory が L? の時には特別扱い
して表を修正するという事も考えたがそれはやめておく事にする。

x 勝手に GraphemeClusterBreak を変更すると他の用途で参照した時に変更され
たデータベースを参照する事になって混乱の元である。

x Extend / L? が全て同様の取り扱いで良いのか分からない → と思ったが
"Extend # L" で検索してみると半角カナの濁点・反濁点しか存在しなかった。
そういう意味で GeneralCategory と組み合わせて判定しても良いのかもしれな
い、と思ったがそもそも処置が必要な文字が半角カナしか現状で存在しないの
であれば、無闇に将来追加されるかもしれない他の Extend # L? にも影響が出
る様な実装にするべきではない。

* 因みに make/canvas.emoji.sh の中で多くの端末で例外的な振る舞いとなってい
る 0x1F3F{B..F} の範囲の文字についても、この際、既定で修正を加える様にで
きないだろうか。

2023-10-01 手で弄る様にしたら Unicode の例から自動生成したテストが失敗する
様になってしまった。将来的な事を考えると端末毎に修正した
GraphemeClusterBreak を切り替えたりする事なども考えられるので、直接元の
GraphemeClusterBreak を弄るのも避けるべきだろうか。代わりに
_ble_unicode_GraphemeClusterBreak_custom という配列に修正した
GraphemeClusterBreak を記録する事にした。

x これにより多少 GraphemeClusterBreak を読み取る時間が伸びてしまうのではな
いかと思うが、ASCII に関しては処理をスキップして効率化しているので余り気
にしなくても良い気がする。

2023-09-20

* complete: auto_complete 内容を入力しきっても auto_complete mode の中にいる [#D2075]
Expand Down
17 changes: 17 additions & 0 deletions src/canvas.sh
Original file line number Diff line number Diff line change
Expand Up @@ -534,8 +534,25 @@ function bleopt/check:grapheme_cluster {

#%< canvas.GraphemeClusterBreak.sh

# Note #D2076: 多くの端末 (glibc の wcwidth/wcswidth を参照している端末) で以下
# の文字は Unicode とは違う振る舞いで実装されている。kitty 及び RLogin では独自
# に Unicode に従って実装している様だが、取り敢えずは大勢に合わせて
# GraphemeClusterBreak を補正する。
_ble_unicode_GraphemeClusterBreak_custom[0x1F3FB]=$_ble_unicode_GraphemeClusterBreak_Pictographic
_ble_unicode_GraphemeClusterBreak_custom[0x1F3FC]=$_ble_unicode_GraphemeClusterBreak_Pictographic
_ble_unicode_GraphemeClusterBreak_custom[0x1F3FD]=$_ble_unicode_GraphemeClusterBreak_Pictographic
_ble_unicode_GraphemeClusterBreak_custom[0x1F3FE]=$_ble_unicode_GraphemeClusterBreak_Pictographic
_ble_unicode_GraphemeClusterBreak_custom[0x1F3FF]=$_ble_unicode_GraphemeClusterBreak_Pictographic

# Note #D2076: 半角カナの濁点と半濁点は Extended Lm だが、端末上の振る舞いは独
# 立した文字として振る舞っている (xterm, lxterminal, terminology, kitty)。
_ble_unicode_GraphemeClusterBreak_custom[0xFF9E]=$_ble_unicode_GraphemeClusterBreak_Other
_ble_unicode_GraphemeClusterBreak_custom[0xFF9F]=$_ble_unicode_GraphemeClusterBreak_Other

function ble/unicode/GraphemeCluster/c2break {
local code=$1
ret=${_ble_unicode_GraphemeClusterBreak_custom[code]}
[[ $ret ]] && return 0
ret=${_ble_unicode_GraphemeClusterBreak[code]}
[[ $ret ]] && return 0
((ret>_ble_unicode_GraphemeClusterBreak_MaxCode)) && { ret=0; return 0; }
Expand Down

0 comments on commit 31d168c

Please sign in to comment.