ラベル tmux の投稿を表示しています。 すべての投稿を表示
ラベル tmux の投稿を表示しています。 すべての投稿を表示

2020/11/07

tmux 3.1c の window 分割線を ascii character にする

2020/10/30(Fri) に tmux 3.1c がリリースされました
という事で、恒例の EastAsianAmbiguous を ascii に変更したバージョンを作成します。
過去の作業履歴は 3.1b や 3.0a や 2.9a  に、そもそもの問題についてはこの記事にまとめています。


環境

  • OS: macOS Mojave 10.14.6
  • tmux: 3.1c-border-ascii 7e7a923b7cd2e7cc8d2450e8a8e20838ded13298
  • Homebrew: 2.5.8-118-g2ac5cff
    • Homebrew/homebrew-core (git revision ce1b1; last commit 2020-11-06)
  • Font: Ricty 4.1.1


インストール方法

  • $ brew install --HEAD atton/customs/tmux
でインストールできます。


今回の作業

 3.1b と 3.1c の違いはほぼ無いようなものなので、 cherry-pick で対応できました。

2020/05/05

tmux 3.1b の window 分割線を ascii character にする

2020/05/04(Mon) に tmux 3.1b がリリースされました
という事で、いつも通り EastAsianAmbiguous を ascii に変更するバージョンを作成します。
過去の作業履歴は 3.0a や 2.9a や 2.8 に、そもそもの問題についてはこのこのポストにまとめています。


環境

  • OS: macOS Mojave 10.14.6
  • tmux: 3.1b-border-ascii 526f000f29abadeef9f804bb9aea5291b913a312
  • Homebrew:  2.2.15-2-gb06a7af
    • Homebrew/homebrew-core (git revision 0058c; last commit 2020-05-04)
  • Font: Ricty 3.2.2


インストール方法

  • $ brew install --HEAD atton/customs/tmux
でインストールできます。


本家との diff : utf8proc を使わない

しかし、 utf8proc は現時点の最新バージョンである 2.5.0 でも EastAsianAmbiguous 対応はされていません。
前回(2.3, 2.2.0)のように utf8proc を変更する選択肢もありました。
ですが、 tmux のソースを読むと utf8proc が無い場合 wcwidth を使うようなので、変更しない選択肢もありそうです。
試しに utf8proc を抜いてビルドした tmux を軽く触っても、特段違和感は無し。
とりあえず YAGNI の精神で、今回は utf8proc を使わない事にしました。


前回との diff : atton/tmux の default branch を master から border-ascii に変更

これは tmux へパッチを当てる運用方法の変更です。

ローカルで設定している remote repository は以下の2つ。
  • origin: atton/tmux
  • upstream: tmux/tmux
upstream を fetch して origin に反映させつつ、リリースがあれば対応するパッチを当てる、という運用でした。

ここで面倒だったのが、両方の master の使い分け。
例えば upstream/master の変更を origin/master に適用する時は
  • $ git fetch upstream
  • $ git checkout origin/master
  • $ git rebase upstream/master
と、prefix を指定する必要があります。それに加えて、紛らわしいのも改善したい。

そこで、atton/tmux の master は削除して default branch を border-ascii に変更
そしてローカルの tmux は master の remote tracking branch を upstrem/master に指定。具体的には以下のような感じ
  • $ git checkout master
  • $ git branch -u upstream/master
これにより master は tmux/tmux に追従し、他のブランチは atton/tmux に反映される、という状態にできました。


前回との diff : GitHub Actions の追加

GitHub Actions を2ヶ所で利用しています。

1ヶ所目は atton/tmux で、centos 環境で make 可能かチェックしています。
2ヶ所目は atton/homebrew-customs で、macOS 環境で make 可能かチェックしています。

GitHub Actions では mac と docker が使えるので、様々な環境下でテストできる点が良いですね。

2019/12/21

tmux 3.0a の window 分割線を ascii character にする

2019/12/01 に tmux  の version 3.0a がリリースされました
いつも通りに分割線を multibyte character から ascii にする作業をします。
過去の作業ログは 2.9a や 2.8 や 2.7 など。そもそもの問題についてはこの記事にあります。


環境



インストール方法

  • $ brew install --HEAD atton/customs/tmux
でインストールできます。


今回の変更

tmux は window や pane を表示するための文字情報を tty-acs.c に持っています。
なので、毎度この定義を修正する事で対応しています。
2.9a の時等は tty-acs.c に変更が無かった為、過去の commit の cherry-pick のみで目的が達成できました。
が、今回は修正が入っているので cherry-pick をすると conflict します。
conflict を解消する形で対応しても良いのですが、今回は新しく修正用の commit を作ることにしました。

過去のパッチ を参考にすると、置換が必要な文字とその対応関係は
  • j,k,l,m,n,t,u,v,w が "+"
  • x が "|"
  • q が "-"
  • ~ が "*"
のようです。これらを元に tty-acs.c を修正。make すると今まで通り動きました。
もちろん後から何か踏む可能性はありますが、今の所問題は発生していません。
ということで tmux のソースコードの更新は以上。
あとは branch 名を homebrew の atton/customs 用に付けてあげればおしまいです。

formula の更新は本家 tmux の --HEAD 版の定義を借りて、branch 名を指定すればOK。

と、いうことで tmux 3.0a-border-ascii の更新ログでした。


おまけ

分割線の定義を間違えると、分割した瞬間に tmux が crash します。こわい。
きちんと定義できれば以下のように割りたい放題しても動きます。


2019/11/02

peep を使って、プロセス終了時に Notification Center へ音付きで通知をする

peep というコマンドがあります。pid を指定することで、そのプロセスが終了した際に通知等が行なえます。
この記事は peep コマンドを macOS 上で使ったり、自前 function を作ったりしたログです。


環境

  • OS: macOS Mojave 10.14.6
  • Homebrew: 2.1.15-63-g090259b
  • Homebrew/homebrew-core (git revision 51ba; last commit 2019-10-25)
  • peep: 0.1.2 (rev: f770419/go1.11.4)
  • terminal-notifier: 2.0.0
  • tmux: 2.9a(border-ascii)


peep の install

Homebrew を使ってインストールしてみます。作成者の Songmu さんの記事 の通り
  • $ brew install Songmu/tap/peep
で install できます。


peep-mac: peep + terminal-notifier

peep を install すると peep-notify というコマンドも一緒に install されます。
peep-notify コマンドは Slack に通知したり、macOS の notification center に通知したりできます。

ただ、notification center への通知は音が鳴らずにメッセージだけ表示されます。
軽く読んでみたところ、peep-notify は内部で gosx-notifier を使っていてTitle と Messge のみ設定されています。

peep 自体は pid を監視するコマンドなので、通知に必ずしも peep-notify を使う必要はありません。
そこで、 macOS で音付きで通知できるものは無いかと探す事にしました。
いくつか試したのですが、 terminal-notifier が良さそうです。

terminal-notifier は homebrew に取り込まれているので
  • $ brew install terminal-notifier
で Install できます。

peep + terminal-notifier を使って peep-mac function を作ってみました。 zsh で動きます。
  • $ peep-mac <PID>
とすると、その pid のコマンド名を表示。
その後、プロセス終了時に terminal-notifier で通知が生成されて "Glass" が鳴ります。便利。


peep-mac-tmux: peep + terminal-notifier + tmux

さて、peep-mac を作ったことで、長いプロセスの実行時、音が鳴るまで別の事ができるようになりました。
しかし、 peep-mac を使っていて思ったのです。「pid 調べるのが面倒」と。

そこで作成したのが peep-mac-tmux function です。
tmux 環境下 + 使い方次第では pid の指定をせずに peep-mac が動きます。

具体的には
  • 長いプロセスが実行中の window に pane を追加。
  • 追加した pane 上で peep-mac-tmux を実行。
すると良いです。ここまで来ると完全に自分専用感もありますね。

peep-mac-tmux の実装に関しては
  • pane は 2 つであること
    • 長い process を実行している pane と
    • それをこれから監視しようとする pane
  • active な pane を tmux list-panes から特定する
  • そこで実行されている zsh の pid を取得
  • ps -o <ZSH_PID> で zsh が parent になっている process 一覧を取得
  • pid を sort -r して、一番上のものを peep-mac に投げる
みたいな感じです。大体良い感じに peep してくれます。

ただ、sort -r で監視対象の pid 取得をするので、pidが 一巡してる時には、上手く指定できない事も。
そういう事態はあまり発生しないので、現状はこの実装で運用してます。何か良い解決策無いかな。

と、いうことで、『実行時間長いから終わったら呼んで』みたいな事ができるので便利、みたいなお話でした。


参考

2019/08/29

tmux 2.9a の window 分割線を ascii character にする

2019/05/01 に tmux 2.9a がリリースされていました
残念ながら 2.9 は見逃がしてしまいました。
ということで恒例の分割線を EastAsianAmbiguous から ascii の線に変更するバージョンを作成。
2.8の時とか2.7 の時とかの作業履歴とかもまとめてあります。
そもそもどういう問題なのかはこの記事で。


環境

  • OS: macOS mojave 10.14.6 (18G95)
  • tmux: 2.9a-border-ascii ( f976aed943f322a3652f51846b0fe472534ab6d6 )
  • Homebrew: 2.1.11
  • Homebrew/homebrew-core: (git revision 269c; last commit 2019-08-29)
  • Font: Ricty: 3.2.2(no option)


作業

今回も割とあっさりできました。cherry-pick して tag 更新して終わり。
  • $ git pull upstream
  • $ git checkout 2.9a
  • $ git cherry-pick border-ascii
  • $ git checkout -b 2.9a-border-ascii
make できるかの確認は
  • $ sh autogen.sh
  • $ ./configure 
  • $ make
で。

ちなみに brew edit tmux して本家のビルド手順を参考にしてます。
あと、 dependencies から utf8proc が消えて ncurses が追加。

make すると current directory に tmux command ができるので、動作確認も可能。
  • $ ./tmux -V
    • tmux 2.9a
  • $ ./tmux
    • border-ascii 版の tmux が起動します。
あとは自分用の tap に反映しておしまい。


インストール方法

1からインストールする場合のコマンドは
  • $ brew install --HEAD atton/customs/tmux
でいけます。
必要あらば自動で atton/cusoms を tap してくれるようになってました。便利。

2019/06/03

utf8proc が 2.3 から East Asian Ambiguous の文字幅を 2 と判定するようになった

Homebrew でインストールできる tmux は文字幅判定の方法をいくつか持っています。
その中に utf8proc というソフトウェアに任せる、という方法があります。
しかし、その utf8proc は East Asian Ambiguous の幅を固定で 1 にするよう実装していました。
なので、自分用に patch を当てた formula を作ったりして対応していました。

ですが、utf8proc 2.3 から East Asian Ambiguous を 2 と判定する用になりました。
とりあえず自分が使っている patched 2.8 な tmux では問題無さそうなので公式の utf8proc を使うようにします。

蛇足
本当は LC_CTYPE を見て動的に判定する、という実装が理想っぽいですが流石にそこまではしてもらえないようです。

2019/01/23

EastAsianAmbiguous の幅を2に固定した utf8proc のバージョンを 2.2.0 に上げた

さて、今私が使っている tmux は

ようにしています。
が、 utf8proc 側の更新は何気に初ですね。


How to version up

brew で tap 済みなら
  • $ brew upgrade
で終わりです。丁寧に再インストールするのなら
  • $ brew uninstall utf8proc
  • $ brew install atton/customs/utf8proc
でしょうか。便利。


脱線: 楽をするための苦労の話

brew で install できるようにするまでで一番面倒だったのが環境構築。
なのですが、関連ファイルの生成は結構面倒。
www.unicode.org から Unicode の定義ファイルを落としてきてスクリプトで処理とかしているので。
スクリプトには ruby とか julia とか使われてるので微妙に mac の上に作るのはダルい。
今回は docker で fedora 28 の上に使い捨ての環境を作って解決。

fedora 29 だと julia が新しすぎてダメとか、CentOS7 にはデフォルトで julia が無かったりとか、寄り道はいろいろ。
最終的には fedora 28 の上に call-by-need で環境を作って patch を cherry-pick して make update をかけて終了。
brew の formula 回りは tmux で何度も触ってるので特筆すべきことは発生せず。
途中であった謎現象としては www.unicode.org 自体が落っこちていて make update が上手くくいかない事がありました。
何度も make してスパム判定されたとかなのかもしれない。

2018/10/31

tmux 2.8 を全角記号対応させる

ということで恒例の分割線を EastAsianAmbiguous から ascii の線に変更するバージョンを作成。
2.7 の時とか 2.6 の時とかの作業履歴とかもまとめてあります。
そもそもどういう問題なのかはこの記事で。


環境

  • macOS Sierra 10.12.6
  • tmux: 2.8-border-ascii (4283f6b6e3f3c46b8665ce398a164063a7ef0aab)
  • utf8proc: 2.1(562edab805b82d66622914d06a5da3f53cd54a17)
  • Homebrew: 1.8.0-76-gcbb2e1b
  • Homebrew/homebrew-core: (git revision 95614; last commit 2018-10-30)
  • Ricty: 3.2.2(no option)


作業

今回は割とあっさりできました。cherry-pick して tag 更新して終わり。
  • $ git pull upstream
  • $ git checkout 2.8
  • $ git cherry-pick border-ascii
  • $ git checkout -b 2.8-border-ascii
くらい。

make できるかの確認は
  • $ sh autogen.sh
  • $ ./configure --enable-utf8proc
  • $ make
くらいで。

current directory に tmux command ができるので、動作確認とかもできます。
  • $ ./tmux -V
    • tmux 2.8
  • $ ./tmux
    • border-ascii 版の tmux が起動します。
あとは自分用の tap に反映しておしまい。


インストール方法

1からインストールする場合のコマンドは
  • $ brew tap atton/customs
  • $ brew install atton/customs/utf8proc
  • $ brew install --HEAD atton/customs/tmux
でいけます。


ぼやき

これで分割時の線が ascii になりました。良し良し。

自分用にメンテし続けてるけれど、tui を使う時とかはどうしても崩れてしまう。
特定の文字を表示する時かけられる hook があれば、置換表を config に書くと tui も問題無く表示できるとは思うのだけれど、そんなの無いかなー。

2018/04/15

tmux 2.7 を全角記号対応させる

2018/03/29 に tmux 2.7 がリリースされました。
ということで自分用の border-ascii 版も update しました。(2.6 の時はこんな感じ)
実際やったことは cherry-pick して細かいところの修正とか。


環境

  • OS: macOS 10.12.6
  • tmux: 2.7-border-ascii (65784831fcf0040b78d68b180c6ca8c1210e4317)
  • utf8proc: 2.1(562edab805b82d66622914d06a5da3f53cd54a17)
  • Homebrew: 1.6.0-19-gf9f9dbc
  • Homebrew/homebrew-core: (git revision 6e3b1; last commit 2018-04-14)


利用方法

  • $ brew tap atton/customs
  • $ brew install atton/customs/utf8proc
  • $ brew install --HEAD atton/customs/tmux
これで縦に画面分割する時の線が - になります。
--------------------------------- みたいな感じですね。


おまけ: update 手順

私は tmux の自分用 fork を持っているので、まずはそれに patch を当ててビルド。
OK なら homebrew の formula にしてインストール。
最後に homebrew の tap としてインストール、という流れで作業をしました。
今回はちょろっとした問題があったので、メモてがら書いておきます。


tmux の make

まずは最新の tmux を落としてきてpatch を当てます。
  • $ git pull upstream # upstream は公式の tmux/tmux です。
  • $ git checkout 2.7
  • $ git cherry-pick border-ascii # patch の 1 commit を拾います
  • $ git checkout -b 2.7-border-ascii
これで patched 2.7 ができました。

次に make します。
  • $ ./configure --enable-utf8proc
  • $ make
すると以下のような文言が。

WARNING: 'aclocal-1.15' is missing on your system.
         You should only need it if you modified 'acinclude.m4' or
         'configure.ac' or m4 files included by 'configure.ac'.
         The 'aclocal' program is part of the GNU Automake package:
         <http://www.gnu.org/software/automake>
         It also requires GNU Autoconf, GNU m4 and Perl in order to run:
         <http://www.gnu.org/software/autoconf>
         <http://www.gnu.org/software/m4/>
         <http://www.perl.org/>
make: *** [aclocal.m4] Error 127
んー。 aclocal はあるのだけれどどうしてかな。
  • $ which aclocal
    • /usr/local/bin/aclocal
  • $ aclocal --version
    • aclocal (GNU automake) 1.16.1
バージョンが 1.15 固定じゃないと動かないとかなのだろうか。

とりあえず調べてみる。
そうすると
  • $ touch *
うーん。タイムスタンプ周りの問題か。
にしてもこんなんで解決……しました。はい。
ということで動作確認。
  • $ ./tmux -V
    • tmux master
  • $ tmux
    • うん。問題無く起動するし画面分割も問題無し。
手で make する分には動く状態になりました。
ということで github の自分用 fork に反映
  • $ git push


formula の修正

さて、お次は brew で install できるようにします。
自分用の formula は atton/customs で持っているのでそこへ修正をかける。
その前に local の repository で install できるかを確認します。

素直に 2.6 を 2.7 に置換して、local で install
  • $ brew install --HEAD tmux.rb
とすると
Error: Calling <<-EOS.undent is disabled!
Use <<~EOS instead.
と怒られた。ので素直に <<~ を使う

もう一度 install
  • $ brew install --HEAD tmux.rb
install できました。 tmux -V は tmux master と出るので少々確認しづらいですが。


homebrew の tap へ反映

最後に homebrew の tap で使えるようにします。
といっても既に repository は作ってあるので、そこに push するだけです。
さて、最後の install 確認。
  • $ brew install --HEAD atton/customs/tmux
問題無く install されました。良し良し。

2017/11/12

tmux 2.6 を全角記号対応させる

2017/08/30 に tmux 2.6 がリリースされました。
それに伴ない、例によって分割線を ascii にするバージョンをリリースしました。
分割線の表示が変になる問題は Terminal.app が原因だったので、細々と自分用のをリリースしていこうかと(2.5の時)。

なお、作業としては rebase のみでパッチの変更点はありません。


環境

  • OS: macOS 10.12.6
  • tmux: border-ascii-2.6(65784831fcf0040b78d68b180c6ca8c1210e4317) (patched)
  • utf8proc: 2.1(562edab805b82d66622914d06a5da3f53cd54a17)
  • Homebrew: 1.3.6-217-g441c212
  • Homebrew/homebrew-core: git revision cf537; last commit 2017-11-11
  • Ricty: 3.2.2(no option)


インストール用コマンド

  • $ brew tap atton/customs
  • $ brew install atton/customs/utf8proc
  • $ brew install --HEAD atton/customs/tmux

2017/11/01

tmux のバグを踏んだので Pull Request を作ったら Terminal.app のバグだった話

さて。私は tmux の線を ascii にするパッチを自分であてています
tmux は線を ascii で表示するか、UTF-8 で表示するのオプションがあります。
今日日 UTF-8 非対応というのは稀なので、基本は UTF-8 で表示される筈です。


問題

tmux の線に使われている文字が曲者で、EastAsianAmbiguous という文字種です。
これは文字幅を1にするか2にするか、言語圏によって決めます。
そんな文字を分割線に使うと、言語圏によって線の長さが変わってしまいます。
幅を決める部分は tmux の内部実装と glibc と utf8proc があります。
それらが EastAsianAmbiguous に対応していると問題ないのですが、 全部非対応。これはつらい。

UTF-8 で表示する際は、EastAsianAmbiguous を幅固定の線にする Pull Request を作りました


Pull Request による変更点

単に文字の置換です。

という変更をしています。
両方とも固定で幅が1なので、言語圏に依存しません。

例えば、このように表示が崩れていた場合でも
この Pull Request によってこのように綺麗に表示してくれます。やったね。

修正と文字リテラル

さて、当然ですが、文字を置換するにはソースをいじる必要があります。
tty-acs.c というファイルに文字テーブルがあるのでそれらを変更。具体的には x と q です。
さてこれで修正完了、と思ったら "\342\224\200" という謎の表記がある

実はこいつが分からなくて今まで PR を作ってませんでした。
q に相当する ─ (0x2500) のページを見つめていると、
  • UTF-8 (binary) 11100010:10010100:10000000
という表記が。

こいつをさらに良く見ると8進数で 3bit ずつ表記されていることに気がつく。
修正する予定の (0xffda) は
  • UTF-8 (binary) 11101111:10111111:10011010
なので
  • 11 101 111:10 111 111:10 011 010
  • 3 5 7: 2 7 7: 2 3 2
  • \357\277\232
書いてみると動いた。やったね。
単に私がこの文字リテラルを知らなかっただけなのですが、閃いた時は楽しかったですね。


メンテナのコメント

この PR で EastAsianAmbiguous を排除するので言語圏に依存せず正しい線が引けます。
なのでマージされると思っていましたが、メンテナの環境では上手くいかないらしい

んで、以下のオプションを試してくれと
set -as terminal-overrides ',*:U8=0'
こいつを .tmux.conf に書くも、やっぱり私の環境だと上手くいかない。

UTF-8 表示に強制するオプションのようなのですが、そいつを修正するパッチなのに……
正確には ACS というものを使って線を描画するようです

ちなみに Terminal.app + Ricty では上手くいかない。こうなります。

動かないよって文句を言ったら、「ACS サポートしてないターミナル使ってない?」と。

いやいや公式の Terminal.app ですよと内心思いましたが、iTerm2 と xterm を試すことにしました。
そうしたら何と綺麗に表示されるではありせんか

どうやら Terminal.app は ACS をサポートしていないようです。つらい。

iTerm2 に乗り換えを検討しましたが、今度は EastAsianAmbiguous に対応しているか問題に変わる。
面倒になったので今まで通りの
  • Terminal.app
  • 独自パッチの tmux
で運用していこうと思います。

しかし tmux のバグだと思ったら Terminal.app だとは。
流石にそれは修正できない。

これはちょっとしたぼやきなのですが、Terminal.app は結構バグがあるらしい。
Terminal Multiplexer のメンテナが言うからには、色々あったんだろうな、と察する。
しかし nicm さん対応が早い。最初のコメントは10分とかでついた気がする。
反応が早いのはこちらとしても助かるし、いろいろと助言を貰えました。
まー助言の結果 Terminal.app は残念というオチなのですが。

ということで、tmux のバグを踏だので Pull Request を作ったら Terminal.app のバグでした。


環境



参考

2017/06/02

tmux 2.5 を全角記号対応させる

2017/05/13 に tmux 2.5 が Release されていたので、2.3を全角記号対応させた時のパッチを 2.5 にも当てました。
tmux 2.5 の border-ascii + EastAsianAmbiguous を強制2幅 版です。

作業としては rebase のみでパッチそのものの変更点はありません。

環境

  • macOS Sierra 10.12.5
  • Homebrew 1.2.1-143-gdaa67886
  • Homebrew/homebrew-core (git revision cce65; last commit 2017-06-02) 
  • tmux 2.5 (hash だと ae2c5ad76852d6d2e2463e45b13fc8c15b66e4b7 )
  • utf8proc 2.1
  • フォントは Ricty

インストール手順

  • $ brew tap atton-/customs
  • $ brew install atton-/customs/utf8proc
  • $ brew install --HEAD atton-/customs/tmux

過去のバージョンが利用したい方は /usr/local/Homebrew/Library/Taps/atton-/homebrew-customs
 などにある atton-/customs/tmux の git repository から古いバージョンを checkout してください。
他にも昔のバージョンを参照する方法はあると思いますがちょっと把握していません。

2017/04/22

tmux 2.4 を全角記号対応させる

2017/04/20 に tmux 2.4 が Release されていたので、前回の記事に書いたパッチを 2.4 にも当ててみました。
tmux 2.4 の border-ascii + EastAsianAmbiguous を強制2幅 版です。

作業としてはは rebase したただけなので修正点は全くありません。

環境

  • macOS Sierra 10.12.4
  • Homebrew 1.1.12-40-g02f018933
  • Homebrew/homebrew-core (git revision 5559; last commit 2017-04-15)
  • tmux 2.4 (正確には 2.4リリース以降の fd13731049148d0205fa6ed1843041dad0573677)
  • utf8proc 2.1
  • フォントは Ricty

インストール手順

  • $ brew tap atton-/customs
  • $ brew install atton-/customs/utf8proc
  • $ brew install --HEAD atton-/customs/tmux


atton-/customs/tmux の formula は HEAD build しか対応していないので、もし 2.3 のパッチ版が使いたい場合は tap したリポジトリを巻き戻すことで 2.3 が使えるはずです。
おそらくもっと楽な巻き戻し方があると思いますが、個人的には最新しか使っていないので調べていません。

2017/04/16

tmux 2.3 を全角記号対応させる

tmux 2.3 をちょっといじって全角記号の幅を2にした版を作ってみました。


環境

  • macOS Sierra 10.12.4
  • Homebrew 1.1.12-40-g02f018933
  • Homebrew/homebrew-core (git revision 5559; last commit 2017-04-15)
  • tmux 2.3 (正確には 2.3リリース以降の 640666fb36d7465b188f9d0bedc83ad60b83a1d7)
  • utf8proc 2.1
  • フォントは Ricty



状況

tmux を使っていると ─(U+2500) や(U+25bd) な文字の幅が半角扱いになってしまい、表示がおかしくなる時があります。
例えば、画面を縦2つに分割すると



のように線が何故か二本表示されたり、記号の表示が変になってしまいます。

これは分割に使用されている文字(─)の幅の扱いを tmux が勘違いしているために起こる問題です。
─ といった記号は EastAsianAmbiguous といった種類に区分され、言語圏によって文字幅が違います。
例えば英語圏では基本的に使う文字幅は1なので ─ の幅は1ですが、日本語圏では全角が基本なので文字幅は2となります。
この問題に関しては https://github.com/hamano/locale-eaw などが詳しいです。


解決法

これは Terminal の設定と locale の設定とフォントに依存するので解決方法はいくつかあります。
今回は
  • Terminal は EastAsianAmbigous を Full-Width にしている
  • フォントは日本語フォント( EastAsianAmbiguous は幅2)
  • locale には依存しない (en_US.UTF-8 でも ja_JP.UTF-8 でもOK)
の時を想定しています。
具体的には tmux が文字幅の取得に使っている utf8procちょっといじって、EastAsianAmbiguous の幅を強制的に2にしています。
あと、画面分割に使う文字を ascii にしています。


インストール方法

formula にしてあるので

  • $ brew tap atton-/customs
  • $ brew install atton-/customs/utf8proc
  • $ brew install --HEAD atton-/customs/tmux
でインストールできます。
縦に分割した時に


のようにきちんと線が1本になるはずです。



まとめ

強制的に EastAsianAmbiguous の幅を2にして日本語フォントとの相性を良くしました。
実はこれは対処療法的な解決案で、根本的な解決ではありません。
その辺りは結構長くなると思うので書くなら別の記事で書きます。


参考文献

2015/05/14

tmux 2.0 と Ricty と East Asian Ambiguous

先日 tmux 2.0 がリリースされましたね。

最近は Terminal.app + tmuxinator を使って作業とかしてるので、 tmux もアップデート。
そうすると U+22BD(▽) とかの East Asian Ambiguous 文字の幅が tmux 上だと single になってしまう問題が発生。
tmux の上で eskk.vim を使って変換すると文字の表示がズレてしまうのでちょっと不便。

East Asian Amniguous の幅を2にする patch が tmux 1.7 の時に作ってくれた方がいるみたいなので、それを借りて自分向けに formula を作ってみました。
homebrew-customs って名前でついでに tap も作成。

$ brew tap atton-/customs
$ brew install atton-/customs/tmux

で patch が当たった版の tmux が入ります。
一応これで eskk.vim を使う分には快適に。

環境

  • Mac OSX Yosemite
  • Terminal.app 2.5.3
  • Ricty 3.2.2 (no build option)
  • tmux 2.0

蛇足

eskk.vim を使うのには快適になりましたが、 Agda の一部の文字はやっぱりズレる。
例えば U+2248(≈)とか U+2080 - U+2089 (₀₁₂₃₄₅₆₇₈₉) とか。

U+2248(≈) はフォント上では single width なのだけれど、 Width が Ambiguous
Terminal 側で Ambiguous は2にする設定をしているので、幅が2つ取られてフォントは1つ分になって無駄な空白が入っちゃう。

U+2080 - U+2089 も同じようにフォントは single width。
でも何故か U+2081 - U+2084 だけが Ambiguous で、U+2085 とかは Neutral 。
これは Unicode 作った時に何を考えてたのか謎……。

そんな感じなので、East Asian Ambiguous の幅を 2 にすると空白が出てくる文字があって、1にすると重なってしまう文字が出てくるので消化不良……。
とりあえず空白入ってても良いや、という趣旨で基本的に幅を2にしてます。

ちなみに Ricty の生成スクリプトに -a というFull Width を切ってくれるオプションがあるのだけれど、U+22BD は Full Width になってしまってる。
fontforge とかで調べてみるとそもそも Inconsolata に U+22BD のフォントが無いので、 Migu 側が使われてちゃって Full と Half がいりまじることに。
うーん。 英語は Inconsolata, 日本語は Migu 1M, Ambiguous は全部 1 or 2 のフォントって無いかな。