zsh, tmux, vimで構築する快適なCUI環境 2/3 「tmux」編

tmux(ティーマックス)は、一つのターミナルウィンドウ内で仮想的に複数のウィンドウを切り替えて使用することができる仮想端末管理ツールです。

同様の機能を持つツールとしてscreenが広く使われてきましたが、現在はより高機能・省メモリなtmuxが人気を集めています。

tmuxはscreenと比較し、主に以下のような特徴があります。

  • ウィンドウタイトルの自動変更に対応
    (最終実行コマンド名をウィンドウタイトルとして表示できる)
  • コピーモードのコピー履歴を複数保持し、一覧から選んでペースト可能
  • ウィンドウを上下・左右に分割可能

環境構築の準備

tmuxの最新版(1.6)パッケージはRPMForgeリポジトリからインストールします。yumのサードパーティ製リポジトリ追加手順については以下のページが参考になります。

私の方で実行した内容は以下のとおりです。(EPELリポジトリはmoshをインストールする場合などに使用します。moshについては別の機会に紹介します。)

$ sudo cp -p /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
$ sudo vim /etc/yum.repos.d/CentOS-Base.repo
  priority=1を追加
$ sudo rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
$ sudo rpm -ivh http://apt.sw.be/redhat/el6/en/i386/rpmforge/RPMS/rpmforge-release-0.5.2-2.el6.rf.i686.rpm
$ sudo rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6
$ sudo rpm -ivh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-7.noarch.rpm
$ vim /etc/yum.repos.d/rpmforge.repo
$ vim /etc/yum.repos.d/epel.repo
  enabled=1を確認

tmuxのセットアップ

tmux インストール

前述のとおり、yumにRPMForgeリポジトリを追加することでパッケージがインストールできます。

$ sudo yum install tmux

tmux 使い方

tmuxコマンドでtmuxが起動します。

tmux 標準設定画面 tmux 標準設定画面

よく使いそうな起動オプションとしては以下が挙げられます。

list-sessions                      | 全セッションを列挙
attach                             | 最後にデタッチしたセッションに接続
attach-session [-t target-session] | 指定したセッションに接続

tmux上の操作は基本的に、プレフィックスキー(標準ではC-b)を押した後にキーを入力する2ストローク操作になります。

標準のキー設定はlist-keysで確認することができます。よく使いそうなキー操作としては以下が挙げられます。(ウィンドウの分割は個人的にあまり使わないので、ここでは省いています。)

■ウィンドウとペイン
c | new-window      | 新しいウィンドウを作成
n | next-window     | 次のウィンドウへ移動
p | previous-window | 前のウィンドウへ移動
[ | copy-mode       | コピーモードに入る

■クライアントとセッション
d | detach-client   | カレントクライアントをデタッチ

■バッファ
= | choose-buffer   | バッファをリストから対話的に選択
] | paste-buffer    | ペーストバッファの内容をカレントウィンドウに挿入

■その他
: |command-prompt   | コマンドプロンプトを開く
? |list-keys        | キーバインドを列挙

■コピーモード(vi)
space |始点選択
enter |終点選択

標準の全キー操作を以下にまとめました。

tmux 設定

tmuxの設定を行います。

$ vim ~/.tmux.conf

#+----------------------------------------------------------------------------------------+
#  セッションオプション
#+----------------------------------------------------------------------------------------+
#新しいウィンドウのベース番号
set-option -g base-index 1
#全てのベルを無視
set-option -g bell-action none
#各セッションで保持するバッファ数
#set-option -g buffer-limit 20
#256色端末を使用
set-option -g default-terminal "screen-256color"
#ウィンドウ履歴で保持される最大行数
set-option -g history-limit 5000
#Escapeキー入力時の待ち時間(0.5秒)をキャンセル
set-option -s escape-time 0

#+----------------------------------------------------------------------------------------+
#  ステータスライン
#+----------------------------------------------------------------------------------------+
#status-left 及び status-right の非ASCII文字をUTF-8として扱う
set-option -g status-utf8 on 

set-option -g status-left '#[fg=white,bg=blue][S:#S]#[default]'
set-option -g status-right '#[fg=black,bg=cyan][CPU=#(getCpuUsage.sh) MEM=#(getMemUsage.sh)]#[fg=white,bg=blue][%Y/%m/%d(%a)%H:%M]#[default]'
set-option -g status-right-length 50
set-option -g status-fg white
set-option -g status-bg black
set-window-option -g window-status-fg blue
set-window-option -g window-status-bg black
set-window-option -g window-status-current-fg white
set-window-option -g window-status-current-bg blue

#+----------------------------------------------------------------------------------------+
#  ウィンドウオプション
#+----------------------------------------------------------------------------------------+
#ウィンドウを実行コマンド名で自動リネーム
set-window-option -g automatic-rename on
#スクロールモード、コピーモード、選択モードで vi のキーバインドを使う
set-window-option -g mode-keys vi
#ウィンドウで動作があるとステータスラインでハイライト
set-window-option -g monitor-activity on
#UTF-8 シーケンスが現れることに備える
set-window-option -g utf8 on

#+----------------------------------------------------------------------------------------+
#  キーバインド
#+----------------------------------------------------------------------------------------+
#プレフィックスキーを設定
set-option -g prefix C-z
unbind-key C-b
bind-key C-z send-prefix

#C-Right,C-Leftでウィンドウ切り替え
#* Ctrl and arrow keys doesn't work in putty! What do I do?
#http://tmux.svn.sourceforge.net/viewvc/tmux/trunk/FAQ
set -g terminal-overrides "xterm*:kLFT5=\eOD:kRIT5=\eOC:kUP5=\eOA:kDN5=\eOB:smkx@:rmkx@:colors=256"
bind-key -n C-Right next-window
bind-key -n C-Left previous-window

#コピーモードに入る
bind-key y copy-mode
#ペーストバッファの内容をカレントウィンドウに挿入
bind-key p paste-buffer

#Yで一行コピー
#http://blog.m4i.jp/entry/2012/02/13/155233
bind-key -t vi-copy Y copy-line

#~/.tmux.conf をリロード
bind-key r source-file ~/.tmux.conf; display "Reloaded!"

#ペインを水平・垂直分割
bind-key s split-window -h
bind-key v split-window -v
#h,j,k,lでペインを切り替え
bind-key h select-pane -L
bind-key j select-pane -D
bind-key k select-pane -U
bind-key l select-pane -R

ステータスラインにCPUとメモリの使用率を表示するために下記スクリプトを使用しています。

$ vim ~/bin/getCpuUsage.sh
    #!/bin/bash
    top -bn1 | grep "^Cpu(s)" | sed "s/.*, *\([0-9.]*\)%id.*/\1/" | awk '{printf ("%3d%\n", 100 - $1 + 0.5)}'
$ vim ~/bin/getMemUsage.sh
    #!/bin/bash
    free | grep "^Mem:" | awk '{printf ("%3d%\n", (($3 / $2) * 100) + 0.5)}'
$ chmod u+x ~/bin/getCpuUsage.sh ~/bin/getMemUsage.sh

設定後の画面表示は以下のようになります。

tmux 設定変更後画面 tmux 設定変更後画面

256色表示を使用したい場合、The 256 color mode of xterm256colors2.plで表示を確認しておきましょう。256色表示できればステータスラインでもcolour0~colour255が使用できます。

自動再アタッチの設定

以下の設定を~/.zshrcに追加することで、ログイン時にセッションが存在した場合、自動的にアタッチすることができます。

#Start tmux on every shell login
#https://wiki.archlinux.org/index.php/Tmux#Start_tmux_on_every_shell_login
if which tmux 2>&1 >/dev/null; then
    #if not inside a tmux session, and if no session is started, start a new session
    test -z "$TMUX" && (tmux attach || tmux new-session)
fi

なお、この設定はscreenを起動することを考慮していないため、この設定状態でscreenを起動しないよう注意して下さい。(screenの内側でtmuxを起動してしまいます)

参考ページ

整理できていませんが、参考にさせてもらったページは以下のとおり。

おわりに

現在まだscreenをお使いの方には、tmuxへの移行をおすすめしておきます。

次回はVimの設定について紹介します。

VPSセットアップ関連記事

blog comments powered by Disqus