TL;DR
unicodeの罫線素片がうまく表示されないフォントでも綺麗に罫線を表示するため、tmuxの罫線素片にVT100 alternate character setを強制できるようにした。
背景
プログラミングフォントはITエンジニアの生産性に直結する要素の一つであり、この選択肢を広げることは我々の業務環境を改善する上でとても重要である。ところで、tmux 2.4ではUTF-8環境での罫線素片の描画にunicodeの罫線素片1を使用しており、使用フォントのU+2500からU+257Fの対応状況によっては罫線が連続した線にならない。例えば、次の図はM+ MN Type-12を使用して画面を左右に分割したところである。中央を横切っているペイン分割線が破線になってしまっていることが分かる。
一方、tmuxはCUIの描画ライブラリにncursesを使用している。ncursesはVT100のalternate character set(ACS)3に対応しており、unicodeの罫線素片を使用することなく罫線を描画することができる。したがって、UTF-8環境でもACSを使用して罫線を描画するためのオプションがあれば、使用しているフォントの罫線素片対応状況によらず連続した罫線を表示することができる。
実装
そこで上記を実現するため、まずは素朴な実装を作ってtmuxの公式リポジトリにプルリクエストを送ってみた。これはtmuxを-aオプション付きで起動するとACSを強制するというものである。最初は私の文章がイマイチだったこともあり意図が伝わらなかったが、hattya氏が援護してくれたこともあり根気よく説明しているとtmux開発者のnicm氏に火が点いてきた。以下はその議論の要約。
- nicm「やりたいことの意味はわかったけど起動オプションでやるほどのこと?」
- yanma「じゃあ.tmux.confで設定するのは?」
- hattya「.tmux.confで設定する方法ならパッチあるよ」
- nicm「いや、NCURSES_NO_UTF8_ACSっていう環境変数がもうあるからそっち使うべきでは。別パッチ作ったよ」
- yanma「オプション逆じゃね?」
- nicm「確かに……というか調べてて気付いたけどterminfoに指定できるからそれに指定するのが正解。パッチ作ったから見て」
- hattya「オプション逆じゃね?」
- nicm「確かに……。ややこしすぎる。これでどう?」
- yanma「動いた! プルリク変えたよ」
- nicm「反映させたよ」
というわけで、最終的にtmux.conf
に下記のように書けばACSが強制できるようになった。次回のtmuxリリースから使えるはずである。
set -ag terminal-overrides ',*:U8=0'
次の図は冒頭の環境に今回の設定を適用したところである。確かにペイン分割線がACSで描画されている。
感想
tmuxレベルの有名プロジェクトにプルリクを送るのは初めてだったが、無事意見が反映されて嬉しかった。またこちらの意図が伝わってからのnicm氏の動きが洗練されていて、とても勉強になった。コマンドラインオプションや.tmux.conf
で設定するのはすぐに思いつく安直な解決策なのだが、ncursesがterminfoを使用して文字を描画している以上、それと独立なパラメータをtmux側に定義することは設定の二重定義になり混乱を招く。これは言われてみれば正しいがtmuxのレイヤースタックを理解していなければ絶対にたどり着かない解決策であり、自分では思いつかなかっただけにローカル変更に留めずにプルリクを送ってみて正解だったなと思う。
参考資料
-
Unicode 罫線素片 http://www.unicode.org/charts/PDF/U2500.pdf ↩
-
M+ FONTS https://mplus-fonts.osdn.jp/about.html ↩
-
NCURSES Extended Characters http://melvilletheatre.com/articles/ncurses-extended-characters/index.html ↩