俺たちの戦いはこれからだ(zetamatta's Book 読者コミュニティー)
本の感想や質問をお気軽にコメントしてください。
さっそくですが、WindowsTerminal 1.4→1.5 のバージョンアップで、U+2000~U+2FFF 以外にも、KeyDown が届かないコードが登場しました。現在、以下のスクラップで格闘中
とりあえず、一旦解決し、go-readline-ny v0.4.2 では普通に MAN FARMER もマウスの右クリックで入力できるようになっているので、スクラップはクローズしました。
-
Unicode 絵文字にまつわるあれこれ (絵文字の標準とプログラム上でのハンドリング) - Qiita
- これは参考になる。
-
src/unicode/tables.go - The Go Programming Language
- Go言語標準の Unicode テーブル
囲み数字:U+0023/U+FE0F/U+20E3 ( #️⃣ )
おそるべき絵文字で言及されてたやつ。go-readline-ny v0.2.6 にて対応した。
WindowsTerminal での表示は本来「#□」みたいになるが、go-readline では「#<20E3>」みたいになっていた。せめて「#□」のままちゃんと編集できるようにした。
この文字の変態性は「ただの半角文字(#)」+「異体字セレクタ15」+「囲み文字□」というコンボな点。囲み文字は異体字セレクタと同じ扱い(型)にすればよかったのだが、問題は異体字セレクタ的処理が二重になるという点。
これは type VariationSequence string
としていたのを type VariationSequence [2]Moji
と変えることで解決した。つまり、何重にでも入れ子にできるわけですわ。
囲み文字を異体字セレクタと同じ扱いにするのは簡単で
return unicode.Is(unicode.Variation_Selector, ch)
としていたのを
return unicode.Is(unicode.Variation_Selector, ch) || unicode.Is(unicode.Me, ch)
としただけ
ひたいに手をあてる女性の異体字15:U+1F926/U+200D/U+2640/U+FE0F (🤦♀️)
- Windows だと、Windowsキー+ピリオドで入力できる。
- WindowsTerminal だと「🤦 ♀」という二文字表示になる。
- go-readline-ny では「🤦 ♀<FE0F>」とか出てしまっていた。
これ、驚くべきは
- 異体字セレクタ(U+FE0F)が ReadConsoleInput 経由で読み込まれていた
- 合字+異体字シーケンスのコンボ
という2点。前者については Ctrl-Y 以外の異体字セレクタ読み込みにも素直に対応するようにした。後者については異体字シーケンスの構造を入れ子にできるようにすることで対応した。
(異体字シーケンスの構造を入れ子は、v0.2.6 でやったみたいに書いてたけど、実は本件の修正(v0.2.5) でやってた修正だった)
他の文字の前に合字を挿入した時に、文字幅計算計算が狂う
go-readline-ny v0.4.4 にて Fix。一部の文字幅計算関数(readline.GetStringWidth)が、合字処理に対応出来てなかったという…あちゃあ案件。同じことをする関数を複数用意してると、こういうことになる。
いずれ統一せんといかんなぁ(readline.GetStringWidthはいずれ廃止するが、今はまだ存続)
diffutils 周りについてちょっと調べてみました。