maehachi08 Anything Blog

2013年05月06日
tmux + tmux_powerline + Rictyフォント でエンジニアらしいtmux環境を。

What's tmux(terminal multiplexer)?

tmuxは端末をセッションという形で管理することで端末を多重化するためのツールです。アタッチ/デタッチすることでターミナルアプリケーションを閉じた状態でも端末セッションを保持でき、保持しているセッションに再接続することも出来ます。それだけでなく、1つのセッションで複数のウィンドウを立ち上げたり、1つのウィンドウを複数の画面に分割するペイン分割などが行えます。複数の端末画面を見て作業したい場合や1つの画面で複数のセッションを切り替えたい場合に使用します。

tmux操作を行う場合はControlキー(以下、大文字Cで表記) + bのプレフィックスキーと、それに続く特定操作キーで行う。特定操作キーのデフォルトでのキーバインドは以下のとおりです。

キー説明
c新しいウィンドウを作成
dカレントクライアントをデタッチ。
l直前に選択されていたウィンドウに移動。
n次のウィンドウに切り替え。
p前のウィンドウに切り替え。
&カレントウィンドウをkill。
,カレントウィンドウをリネーム。
?全キーバインドを列挙。

Install tmux

OS環境は以下のとおりです。

# uname -an
Linux manage001.pachi.local 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

# cat /etc/redhat-release 
CentOS release 6.4 (Final)

CentOS6.4でtmuxを入れる時、おなじみのepelレポジトリではtmux 1.5が入ります。dagレポジトリでもtmux 1.6でした。最新のtmux 1.8をソースコードからインストールします。

その前に、tmux 1.8ではlibevent 2.0以上が必要なので、libeventの最新ソースコードを先にインストールします。

# wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
# tar xzvf libevent-2.0.21-stable.tar.gz 
# cd libevent-2.0.21-stable
# ./configure ; make ; make install

### ライブラリlibevent-2.0.so.5のシンボリックリンクを既にパスが通っている/usr/libに作成
# ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib/libevent-2.0.so.5

# ldconfig -p | grep libevent
       libevent_extra-1.4.so.2 (libc6,x86-64) => /usr/lib64/libevent_extra-1.4.so.2
       libevent_core-1.4.so.2 (libc6,x86-64) => /usr/lib64/libevent_core-1.4.so.2
       libevent-2.0.so.5 (libc6,x86-64) => /usr/lib/libevent-2.0.so.5
       libevent-1.4.so.2 (libc6,x86-64) => /usr/lib64/libevent-1.4.so.2

最後に実行しているldconfig -pコマンドでlibevent-2.0.so.5が表示されればインストール成功です。
続いてtmuxをインストールします。

# wget http://sourceforge.net/projects/tmux/files/tmux/tmux-1.8/tmux-1.8.tar.gz
# tar xzvf tmux-1.8.tar.gz 
# cd tmux-1.8
# ./configure LDFLAGS=-L/usr/local/lib/
# make -j8
# make install

# tmux -V
tmux 1.8

最後に実行しているtmux -Vコマンドで"tmux 1.8"と表示されればインストール成功です。

Rictyフォントのインストール

Ricty(リクティ)はUnix/Linux環境で開発するのに適したフリーなプログラミング用TrueTypeフォントです。InconsolataMigu 1Mの2つのフォントを組み合わせ、更にプログラミング用フォントとしてのいくつかのチューニングを行って生成されるフォントで、プログラミング用フォント Rictyからフォントを生成するためのスクリプトが配布されています。

まず、fontforgeをインストールします。

### by Mac
brew install fontforge

### by linux
# yum -y install fontforge

次に、Rictyフォント生成スクリプトをダウンロードし、ダウンロードしたディレクトリに移動します。以下のgit cloneコマンドはgithubのRictyレポジトリにあるBetaバージョンであるHEADブランチを指定していますので、Current Vervionを指定したい場合は公式ページを参照してください。

# git clone https://github.com/yascentur/Ricty.git
# cd Ricty

次に、Inconsolataをダウンロードします。

# wget http://levien.com/type/myfonts/Inconsolata.otf

次に、M+とIPAの合成フォントのページからMigu-1Mをダウンロードします。MigMixではなく、Miguであることに注意しましょう。更に、Migu 1Mですから。
ダウンロード出来たらzip圧縮を解凍し、migu-1m-bold.ttfとmigu-1m-regular.ttfの2つのフォントファイルをRictyディレクトリ直下に移動します。

# wget http://sourceforge.jp/projects/mix-mplus-ipa/downloads/57240/migu-1m-20121030.zip
# unzip migu-1m-20121030.zip
# mv ./migu-1m-20121030/migu-1m-bold.ttf .
# mv ./migu-1m-20121030/migu-1m-regular.ttf .

いよいよ、Rictyフォントを生成し、生成されたファイルを適切なフォントディレクトリにコピーします。

# sh ricty_generator.sh Inconsolata.otf migu-1m-bold.ttf migu-1m-regular.ttf

または、
# sh ricty_generator.sh auto


# mkdir /usr/share/fonts/Ricty
# cp -f Ricty-*.ttf /usr/share/fonts/Ricty/
# fc-cache -vf

最後のコマンドはフォントリストの更新コマンドで、おまじないみたいなものです。
これで、ターミナルアプリケーション(Windowsならさくらエディタとか、MacならTerminal.appとか)のフォント設定にRictyが表示されるはずです。

Install tmux-powerline

tmux-powerlineをインストールすることでステータスラインの見栄えをカッコよくして、表示可能な情報をカスタマイズすることが可能です。ステータスラインに表示可能な情報はシェルスクリプトを用意することで、際限が無いのが特徴で、デフォルトで天気予報、地震情報等の表示ができるシェルスクリプトが揃っています。
インストール自体はgit cloneで落とすだけで、~/.tmux.confに数行設定するだけで最低限のことはできます。
見栄えがかっこ良くなる上、シェルスクリプト次第で様々な情報を表示させることが可能なので、業務効率化に1役買うだろうと思い導入します。

ただ、ターミナルアプリケーションで使用するフォントは、vim-powerlineに付属する./vim-powerline/fontpatcher/fontpatcherというパッチを適用することでカレントディレクトリに生成されるパッチ適用済みのフォントファイル([指定したフォントの名前]-powerline.ttf)を~/Library/Fonts/ディレクトリ以下にコピーして使用しないとステータスラインの矢印のような形が文字化けしてしまいます。今回は、前項でインストールしたRictyフォントを題材にします。

# mkdir ~/.tmux
# git clone git://github.com/erikw/tmux-powerline.git ~/.tmux/tmux-powerline

では、使用するフォントにパッチを適用します。

# fontforge -script ./vim-powerline/fontpatcher/fontpatcher ~/Library/Fonts/Ricty-Bold.ttf
# cp ./Ricty-Bold-Powerline.ttf ~/Library/Fonts/
# fc-cache -vf

これでターミナルアプリケーションのフォント設定でRicty-Bold-Powerlineを選んでください。

~/.tmux.confを作成して使いやすい外観とキーバインドを手に入れよう

tmuxのキーバインドや色設定等は~/.tmux.confを作成し、設定を記述することで恒常的に設定できます。

#-------------------------------------
# ReadMe
#-------------------------------------
# ~/.tmux.conf
# 以下のように省略して記述する
# set-option        => set
# set-window-option => setw


#-------------------------------------
# キーバインド設定
#-------------------------------------
# prefixのキーバインドを変更
unbind-key    C-b
set -g prefix C-t

# ~/.tmux.confの読み込みキーバインド
unbind r
bind   r source-file ~/.tmux.conf \; display-message "tmux RELOADED!!"

# tmuxセッションをkillする時に下部に確認ダイアログを表示する
unbind K
bind   K confirm-before "kill-window"


#-------------------------------------
# 基本設定
#-------------------------------------
set -g default-shell /bin/bash
set -g status on
set -g status-interval 2
set -g status-utf8 on
set -g status-justify "left"
set -g status-left-length 80
set -g status-right-length 100
setw -g automatic-rename off
setw -g mode-key vi
# マウスでペイン移動
set -g mode-mouse on
set -g mouse-resize-pane on
set -g mouse-select-pane on
set -g mouse-select-window on


#-------------------------------------
# 色設定
# カラーコードは以下コマンドで確認
# ~/.tmux-powerline/color_palette.sh 
#-------------------------------------
# status
set -g status-fg cyan
set -g status-bg black

# window-status-current
setw -g window-status-current-fg black
setw -g window-status-current-bg cyan
setw -g window-status-current-attr bold#,underscore

# pane-active-border
set -g pane-active-border-fg black
set -g pane-active-border-bg cyan


#-------------------------------------
# tmux-powerline
#-------------------------------------
set -g status-left "#(~/.tmux/tmux-powerline/powerline.sh left)"
set -g status-right "#(~/.tmux/tmux-powerline/powerline.sh right)"
setw -g window-status-current-format "#[fg=colour235, bg=colour27]⮀"#[fg=colour255, bg=colour27] #I ⮁ #W #[fg=colour27, bg=colour235]⮀"

tmuxのウィンドウ、ペイン操作

まず、tmuxを起動します。起動方法は単純に"tmux"コマンドのみ実行でもOKですし、オプションおよび引数を付加すればセッション名を指定できます。セッション名を指定しない場合、list-sessionで確認したりアタッチする際に生成順に付けられるセッション番号で指定する必要があるのでセッション数が多くなると面倒です。仕事で使う場合や、デタッチ/アタッチ操作を行う場合などは"develop_of_testapp"等のわかり易いセッション名を付けることをおすすめします。

# tmux

または、
# tmux new-session -s [ Session name ]

セッションを生成したと同時にウィンドウが1つ作成されてます。tmuxのステータスラインを見ると、ウインドウ名が起動時のシェル名(bashとか)で表示されています。このままだと、複数のウィンドウを開くと、どのウィンドウの操作内容が何なのかを1つ1つ確認しないといけないので、ウィンドウに名前を付けます。
先述した~/.tmux.confの設定内容に基づくキーバインドで記述しますのでプレフィックスはControll + tです(デフォルトはControll + b)。

C-t + ,

これでステータスラインのウィンドウ名が編集可能な状態となりますので、作業内容がわかる名前を付けます。

更に、このウィンドウでmessagesログをtail -fしておきましょう。

tail -f /var/log/messages

今のウィンドウは/var/log/messagesをtailしている訳で、このままログを出し続けておきたいですよね。でも、他にも作業したい!!
新しいウィンドウを開いてみましょう。

C-t + c

新しいウィンドウが生成されました。先ほどの要領でウィンドウに名前つけましょう。
ウィンドウ間の移動はウィンドウリストを前後する形で2パターン使えます。

C-t + p

または、
C-t + n

ここまで実行すればわかるのですが、ウィンドウはターミナルアプリケーション画面を分割して表示できません。画面を分割して表示させるにはペイン(pane)という機能を利用します。

### 縦(上下)に画面分割
C-t + "

### 横(左右)に画面分割
C-t + %

ペイン間を移動したい場合は以下のように操作します。

C-t + o

または直感的に以下の様な操作でもペイン間移動が可能です。
C-t ↑
C-t ↓
C−t →
C−t ←

ペインのサイズを変更したい場合もありますね。横分割したときに左の画面を狭く、右の画面を広くしたいとか。縦分割した時に上の画面をひろくしたいとか。そういう時には以下操作でペインサイズを変更します。

### 縦分割ペインを対象
### 対象ペインをアクティブペインとした上でコマンド入力
tmux resize-pane -D
tmux resize-pane -D 10

tmux resize-pane -U
tmux resize-pane -U 10


### 横分割のペインを対象
### 対象ペインをアクティブペインとした上でコマンド入力
tmux resize-pane -L
tmux resize-pane -L 10

tmux resize-pane -R
tmux resize-pane -R 10

とりあえずこれで少しはかっこいいターミナル画面を手に入れるキッカケはできたと思います。