ターミナルの文字重複を緩和する

Unicodeの文字をターミナルで表示すると、×や→といった一部の記号類が重複表示され見づらくなることがあります。
これはEast Asian Ambiguous Width(EAM)という仕様によるもので、フォントが全角幅であってもシステムの表示設定が半角幅になっていることが多い事情によります。

漢字やかなはUnicode上も全角幅と明示されていますが、Ambiguous Widthに該当する文字は多くの場合表示がずれます。

たとえばskkの場合、変換モードを示す▽が該当しているため、日本語を入力するたびに先頭が読みづらい問題が起きます。

EAMをロケールで全角幅に

ひとつの解決アプローチは、該当文字を全角幅と指定したロケールデータを作成して利用する方法です。
この方法を用いると、記号類が全角幅グリフになっている多くの日本語フォントで適切に動作します。

ただしターミナルソフトやtmuxなど、描画に関わるツールが増えるとそれらを整合的に設定する必要があり、中途半端に設定するとむしろ画面が崩れる要因となります。

EAM記号を半角幅で実装したフォントを使う

もう1つの方法は、→などのAmbiguous Width対象が半角幅グリフになっているフォントを利用することです。

たとえば 白源フォントHackGen ConsoleHack由来のグリフを優先的に採用しているため、よく使う記号が半角幅になっています。

いくつかのバリアントが同梱され、HackGen35についてはmonospace表示するターミナルでは全角幅グリフが5/6左詰めで表示されます。欧文フォントのオリジナルデザインを優先している分、和文がトレードオフになります。
35バリアントについては、和文の横幅が広い UDEV Gothicの方が横書きのつながりが自然かもしれません。

alacrittyの場合、フォントをインストールしたうえで以下のような設定で切り替えられます。

font:
  normal:
    family: HackGen Console
    style: Regular
  bold:
    family: HackGen Console
    style: Bold

白源フォント以外にもAmbiguous Widthコードの対象文字を半角幅のグリフで実装しているフォントがあれば同じ効果を得られるでしょう。
たとえば白源リポジトリにリンク掲載されているUDEV Gothicなどのコンソールフォントは同様のデザインになっています。

Linuxインストール済フォントのfamily nameはfc-listコマンドで確認できます。

ターミナルソフトや国際化ライブラリのこの分野にアジア人があまり参加していないため、今後とも状況はあまり変わらないでしょう。
フォントの幅を欧米圏のUnicode解釈と一致させるとツールにパッチする必要がなくなるため手軽です。

EAMを2文字化すると生じるtmuxのペイン分割の副作用も、罫線が半角幅のフォントであれば意図どおりに表示されます。

ターミナルのフォントは1つ決定版が定まれば変更の必要性は低いため、機能的なフォント探しも有効な解決策と言えます。

⁋ 2022/06/06↻ 2024/12/18
中馬崇尋
Chuma Takahiro