平衡点
2014/08/23
_ tmux の設定(1/n)
始めに
今更ですが GNU Screen から tmux へ移行しました.
移行できなかった最大の理由は, 古いサーバでのエンコーディング. 未だに UTF-8 じゃないサーバで作業する必要があったりして, screen では window ごとに
# encoding の切りかえ bind 'U' eval "encoding utf8" "stuff 'export LANG=ja_JP.UTF-8\012'" bind 'u' eval "encoding utf8" "stuff 'export LANG=ja_JP.UTF-8\012'" bind 'E' eval "encoding euc" "stuff 'export LANG=ja_JP.eucJP\012'" bind 'e' eval "encoding euc" "stuff 'export LANG=ja_JP.eucJP\012'" # term の切り替え bind 'X' eval "term xterm-256color" "stuff 'export TERM=xterm\012'" bind 'S' eval "term screen-256color-bce" "stuff 'export TERM=screen-256color-bce\012'"
なんて事をしていました.
もはやそういうサーバも少なくなったので(まだあるんですが), 弄れる所は全部 tmux にしてしまおうかな, という気持で気軽に乗り換えてみたらだいぶハマったので, 書いておきます.
ambiguous width characters
UTF-8 環境でターミナル上で日本語を表示する際に嵌るのは ambiguous width characters ですよね? 実際, tmux を設定してみたら emacs on tmux の SKK が酷い事になりました *1
というわけで, じたばたしてみたり
tumx は UTF-8の文字列の文字幅について独自のテーブルを持っています. なので対応としては
- tmux を wcwidth を見に行くように修正する
- locale の修正: 曖昧文字幅を 2 に決め打ちする,
もしくは fumiyas/wcwidth-cjk で 2 文字幅にする
とします.
システムの locale を弄るのはちょっと抵抗があるので, fumiyas/wcwidth-cjk をありがたく使わせて頂くことにしました.
tmux の修正
tmux の修正は PKGBUILD/tmux at master - silenvx/PKGBUILD にあるパッチを使わせて頂きました.
- Debian のソースパッケージを持ってきて
- quilt impot で patch を取り込んで
- dch -n で debian/changelog 修正して
- debuild -rfakeroot -uc -us -tc
できたパッケージを修正しておしまい, です.
wcwidth-cjk
fumiyas/wcwidth-cjk 参照のこと. 私は /usr/local/stow 以下に install して管理してます.
- git clone https://github.com/fumiyas/wcwidth-cjk && cd wcwith-cjk
- make && make install prefix=/usr/local/stow/wcwidth-cjk
- cd /usr/local/stow && stow wcwidth-cjk
でおしまいです. あとは tmux を wcwidth-cjk 経由で起動すれば良いです.
aptitude や alsamixer の罫線が気になるでしょうから, tmux の設定ファイルには
set-environment -g NCURSES_NO_UTF8_ACS 0
を追記しておくと良いでしょう *2
sticky weechat
Screen の時の様に 常に画面の下に weechat を表示させておきたいのですが, tmux には sticky pane みたいな概念がありません.
を参考に, 適当な shell script をでっちあげてみました.
# source: sh
#! /bin/sh
tmp=$HOME/.tmux/weechat.tmp
current_weechat_window=`tmux lsp -a -F "#I: #T" | grep weechat | cut -d":" -f 1`
current_weechat_pane=`tmux lsp -a -F "#P: #T" | grep weechat | cut -d":" -f 1`
current_active_window=`tmux lsw | grep active | cut -d":" -f 1`
current_active_pane=`tmux lsp | grep active | cut -d":" -f 1`
if [ ${current_weechat_window} -ne ${current_active_window} ] ; then
tmux join-pane -l 12 -s :${current_weechat_window}.${current_weechat_pane} -t :${current_active_window}
tmux select-pane -t 0
else
if [ -e $tmp ] ; then
tmux resize-pane -t ${current_weechat_pane} -Z
rm -f $tmp
else
tmux resize-pane -t ${current_weechat_pane} -Z
tmux select-pane -t 0
touch $tmp
fi
fi
これを適当なキーにバインドしておくと,
- 今いる window に weechat の pane を持ってくる
- 同じキーで, 全画面と下部はりつきを toggle する
なんて事ができるようになります. 私は - にバインドして, weechat の表示をトグルしてます.
そんなこんなで
まだ慣れてないので, 今後もジタバタすると思いますが, weechat の表示が全然崩れないので, だいぶ満足度が上がりました.
次は tmuxinator/tmuxinator あたりの設定ですかね...