Skip to content

Instantly share code, notes, and snippets.

@z80oolong
Last active October 4, 2021 22:50
Show Gist options
  • Star 29 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save z80oolong/e65baf0d590f62fab8f4f7c358cbcc34 to your computer and use it in GitHub Desktop.
Save z80oolong/e65baf0d590f62fab8f4f7c358cbcc34 to your computer and use it in GitHub Desktop.
tmux 2.5 以降において East Asian Ambiguous Character を全角文字の幅で表示する

tmux 2.5 以降において East Asian Ambiguous Character を全角文字の幅で表示する

告知 (2019/03/15, 2020/04/29)

これまで、本稿の Gist にて公開しておりました tmux 2.5 以降において East Asian Ambiguous Character を全角文字の幅で表示する為の差分ファイルについて、差分ファイルの分量が多くなったことに伴い、今後は以下の Github のリポジトリにて tmuxEast Asian Ambiguous Character 対応差分ファイルを公開することと致します。

また、今後 East Asian Ambiguous Character 対応の tmux の導入を御考えの方は、後述する Linuxbrew を用いた差分ファイルの適用及びインストール若しくは、 AppImage パッケージを用いたインストールを御勧め致します。

なお今後、本 Gist には本稿のみを残しておきますので、差分ファイルにつきましては上記 URL より取得して下さいますよう御願い致します。以上誠に勝手ながらどうか御了承下さいますよう御願い致します。

概要

tmux 2.5 以降において、 Unicode の規格における東アジア圏の各種文字のうち、いわゆる "◎" や "★" 等の記号文字及び罫線文字等、 East_Asian_Width 特性の値が A (Ambiguous) となる文字 (以下、 East Asian Ambiguous Character) が、日本語環境で文字幅を適切に扱うことが出来ずに表示が乱れる問題が発生しています。

ファイル tmux-x.y-fix.diff (ここに、 x.y は tmux の安定版のバージョン番号。以下同様) 及び tmux-HEAD-xxxxxxxxx-fix.diff (ここに、 xxxxxxxx は tmux の HEAD 版の最新の commit ID 番号。以下同様) は、 tmux 2.5 以降において East Asian Ambiguous Character の幅を漢字や全角カナ文字等と同じ幅 2 で表示するように修正するための差分ファイルです。

なお、この差分には、 koie-hidetaka 氏によって作成された tmux画面分割におけるボーダーラインの罫線文字を判別し、適切に描画するためのソースコードの修正が含まれています。

差分ファイルの適用とインストール

tmux のソースコードに差分ファイルを適用するには、安定版の tmux には、差分ファイル tmux-x.y-fix.diff を、 github 上の tmux の HEAD のソースコードには、 tmux-HEAD-xxxxxxxx-fix.diff をそれぞれ適用して下さい。

従って、安定版の tmux のソースコードにおける差分ファイルについては、 tmux のソースコードが置かれているディレクトリより、以下のようにして差分ファイル tmux-x.y-fix.diff を適用後、tmux をコマンド ./configure, make を用いてビルド及びインストールすると、 tmux において、 East Asian Ambiguous Character が全角文字の幅と同じ幅で表示されるようになります。

 $ patch -p1 < /path/to/diff/tmux-x.y-fix.diff
 (ここに、/path/to/diff は、 tmux-x.y-fix.diff が置かれたディレクトリのパス名)
 $ ./configure --prefix=/path/to/install ...
 (ここに、 /path/to/install は tmux のインストール先。なお、 ./configure の引数は適宜追加すること。)
 $ make
 $ make install

また、github 上の tmux の HEAD のソースコードにおける差分ファイルについても、 github 上の tmux の HEAD のソースコードが置かれているディレクトリより、以下のようにして、最近の差分ファイルを適用後、 tmux の HEAD 版をコマンド ./configure, make を用いてビルド及びインストールすると、 tmux において、 East Asian Ambiguous Character が全角文字の幅と同じ幅で表示されるようになります。

なお、 tmux の HEAD 版でのビルドの場合、コマンド ./configure の実行に先立ち、シェルスクリプト ./autogen.sh を実行して ./configure を生成する必要があることに留意する必要があります。

 $ patch -p1 < /path/to/diff/tmux-HEAD-xxxxxxxx-fix.diff
 (ここに、 /path/to/diff は、 tmux-HEAD-xxxxxxxx-fix.diff が置かれたディレクトリのパス名)
 $ sh ./autogen.sh
 $ ./configure --prefix=/path/to/install ...
 (ここに、 /path/to/install は tmux のインストール先。なお、 ./configure の引数は適宜追加すること。)
 $ make
 $ make install

Linuxbrew を用いた差分ファイルの適用とインストール

Linuxbrew を導入した端末において、East Asian Ambiguous Character 対応の差分ファイルを適用した tmux をインストールする際には、これらの差分ファイルを適用した tmux を導入するための Linuxbrew 向け Tap リポジトリ z80oolong/tmux を使用することを強く御勧め致します。

Tap リポジトリ z80oolong/tmux では、最新の安定版の tmux 及び github 上の最新の tmux の HEAD のインストールの他、旧安定版の tmux のインストールも可能です。

z80oolong/tmux の詳細な使用法につきましては、 z80oolong/tmux の README.md を御覧下さい。

AppImage パッケージを用いたインストール

tmux のソースコードへの East Asian Ambiguous Character 対応の差分ファイルの適用及びソースコードのビルドによるインストールが困難な環境及び状況の方に向けて、East Asian Ambiguous Character 対応の差分ファイルを適用したソースコードからのビルド済みの tmuxAppImage パッケージを用意しました。ソースコードからのビルド作業がお手数な方は、 tmuxAppImage パッケージの使用を強く御勧めします。

tmux の AppImage パッケージは、以下の URL にて配布されています。詳細な使用法についても、以下の URL を御覧下さい。

各種設定について

本節では、本差分ファイルを適用後に拡張される tmux のオプション及び tmux が参照する環境変数について述べます。

utf8-cjk

East Asian Ambiguous Character の文字幅を 2 とすることを有効化するかどうかを設定するオプションです。

このオプションの設定値を on とすると、 East Asian Ambiguous Character の文字幅が 2 となり、 off とすると、文字幅が 1 となります。例えば、East Asian Ambiguous Character を全角文字として表示する場合は、 tmux の設定ファイル .tmux.conf に以下の設定を追記します。

set-option -g utf8-cjk on

なお、オプション utf8-cjk の初期値は、 locale に関する環境変数 LC_CTYPE の値が "ja*", "ko*", "zh*" の場合は on となり、それ以外の場合は off となります。

pane-border-ascii

tmux において画面分割を行う場合に罫線文字に ascii 文字を使用するためのオプションです。

通常は tmux での画面分割において使用する罫線文字は、環境に応じて UTF-8 の罫線文字か、端末が対応している ACS か、若しくは ascii 文字が使用されます。

このオプションを on に指定すると、 tmux での画面分割において使用する罫線文字に ascii 文字を使用します。

pane-border-acs

tmux において画面分割を行う場合に罫線の描画に ACS を使用するためのオプションです。

このオプションを on に指定すると、 tmux での画面分割において罫線の描画に ACS を使用します。

なお、このオプションと pane-border-ascii の両方を on に指定した場合は、 pane-border-acs が有効となることに留意する必要があります。

環境変数 TMUX_ACS

環境変数 TMUX_ACS に以下の値を設定すると、tmux での画面分割において以下のように罫線の描画を行います。

  • utf8, utf-8 … 罫線の文字に UTF-8 の罫線文字を使用します。
  • acs … 罫線の描画に ACS を使用します。
  • ascii … 罫線の文字に ascii 文字を使用します。

なお、環境変数 TMUX_ACS による設定は、オプション pane-border-ascii, pane-border-acs の設定に優先する事に留意する必要があります。

謝辞

先ず最初に、本差分ファイルを作成するに当たっては、下記の URL にある、 Markus Kuhn 氏が作成した East_Asian_Width 特性が A の文字の扱いを考慮した wcwidth(3) 関数の実装を使用しました。 Markus Kuhn 氏には心より感謝いたします。

また、本差分ファイルについて、 tmux の画面分割の為のボーダーラインの罫線文字について判別と適切な描画を行う為の修正を作成して頂いた koie-hidetaka 氏に心より感謝致します。 koie-hidetaka 氏におきましては、他にも本差分ファイルに関して有益な指摘も幾つか頂きました。

最後に、 tmux の作者である Nicholas Marriott 氏を初めとする tmux の開発コミュニティ及び tmux に関わる全ての人々に心より感謝致します。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment