tmuxのカスタマイズ Tips

quad-head MacBook Air (sorta...)ここでは、tmuxの個人的な設定を紹介します。主に、キーバインドの変更になっています。また、Macで使用するので、クリップボードの共有ができるように設定しています。
photo credit: blakespot



tmuxでMacのクリップボードを使用する方法

デフォルトでは、tmuxでコピーしたものは、Macのクリップボードに保存されません。よって、以下の 設定 が必要になります。

brew install reattach-to-user-namespace

echo $PATH

vim /usr/local/bin/tmuxx

chmod +x /usr/local/bin/tmuxx

echo "alias tm='/usr/local/bin/tmuxx'" >> ~/.zshrc

source ~/.zshrc


まず、必要な物をダウンロード、インストールします。そして、パスの通った場所に、 tmuxx というシェルスクリプトを作成します。内容は、以下の様なものになります。なお、作成したシェルスクリプトには、実行権限を与えておきます。これで、 tm というコマンドで、クリップボードが正しく共有できる`tmux`を起動できます。

#!/bin/bash

# attach to an existing tmux session, or create one if none exist
# also set up access to the system clipboard from within tmux when possible
#
# e.g.
# https://gist.github.com/1462391
# https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard

if ! type tmux >/dev/null 2>&1; then
    echo 'Error: tmux command not found' 2>&1
    exit 1
fi

if [ -n "$TMUX" ]; then
    echo "Error: tmux session has been already attached" 2>&1
    exit 1
fi

if tmux has-session >/dev/null 2>&1 && tmux list-sessions | grep -qE '.*]$'; then
    # detached session exists
    tmux attach && echo "tmux attached session "
else
    if [[ ( $OSTYPE == darwin* ) && ( -x $(which reattach-to-user-namespace 2>/dev/null) ) ]]; then
        # on OS X force tmux's default command to spawn a shell in the user's namespace
        tmux_config=$(cat $HOME/.tmux.conf <(echo 'set-option -g default-command "reattach-to-user-namespace -l $SHELL"'))
        tmux -f <(echo "$tmux_config") new-session && echo "tmux created new session supported OS X"
    else
        tmux new-session && echo "tmux created new session"
    fi
fi


また、tmux外にペーストしたい場合は、そこからクリップボードに送ってあげる必要があります。以下の設定をすることで、それを実現できます。

#!/bin/sh
if ! type pbcopy >/dev/null 2>&1 || ! type reattach-to-user-namespace >/dev/null 2>&1; then
    tmux display-message "Error: cannot copy to clipboard."
    exit 0
fi

COPY=`tmux save-buffer -`
echo "$COPY" | reattach-to-user-namespace pbcopy

# メッセージ表示
LINES=`echo "$COPY" | wc -l | tr -d ' '`
tmux display-message "Copy: $LINES lines"


bind ^y run-shell 'tmux-pbcopy'


tmuxのキーバインドを変更する

私のtmuxのキーバインドは主に、 viを参考に構築しています。

# Prefix
set-option -g prefix C-q
# デフォルトのPrefix(C-b)を解除
unbind C-b

# Option
# utf8有効
set-window-option -g utf8 on
# コピー、選択モードのキーバインドvi/emacs
set-window-option -g mode-keys vi
# マウス有効。MacのTerminal.appでは効かず…
set-option -g mouse-select-pane on
# ウィンドウ等の番号基準値
set-option -g base-index 1

# KeyBindings
# 直前のウィンドウ
bind C-q last-window
# 設定リロード
bind r source-file ~/.tmux.conf
# ウィンドウ選択画面
bind Space choose-window
# 新ウィンドウ作成
bind c new-window
# 分割していたペインそれぞれをWindowに
bind b break-pane
# ペインの縦分割
bind H split-window -v
# ペインの横分割
bind v split-window -h

# ペインリサイズ関連vi風
bind -r C-h resize-pane -L 6
bind -r C-l resize-pane -R 6
bind -r C-j resize-pane -D 6
bind -r C-k resize-pane -U 6
bind -r s swap-pane -U

# ペイン終了
bind k kill-pane
# ウィンドウ終了
bind K kill-window
# ペイン番号表示
bind i display-panes
# コピーモード突入
bind y copy-mode
# ペースト
bind p paste-buffer

# vでマーク開始
bind -t vi-copy v begin-selection
# yでヤンク
bind -t vi-copy y copy-selection

# ペインの移動1(Vim風にする)
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R


デフォルトでは、tmuxのコピーモードは、 C-b, [のようなキーで、Emacsのキーバードだったと思いますが、それをviのキーバーインドに変更しています。そして、それでも納得行かない部分を個別に変更しています。たしか、viのキーバードでもデフォルトでは、 範囲指定がspaceだったと思います。

tmuxのステータスラインをカスタマイズする

tmuxのステータスラインを カスタマイズ するには、以下の設定を行います。具体的には、ステータスラインにメモリの使用率などを表示し、カラーを変更しています。

#!/bin/sh
uptime | sed -e 's/.* up *\(.*\)/\1/' -e 's/\(.*\),.* user.*/\1/' | awk -F, '{print $1 $2}' | tr -s ' '


#!/bin/sh
uptime | awk -F\  '{print $(NF - 2),$(NF - 1),$NF}'


#!/bin/sh

## debug mode
#DEBUG="yes"
if [ "$DEBUG" = "yes" ]; then
    set -x
fi

## vm_stat コマンドのチェック
if ! type vm_stat > /dev/null 2>&1; then
    exit 1
fi

#
# メモリ使用率(%)を求める
#   精度は小数点第1位までとする
#
calculate_used_mem() {
    # vm_stat
    #  page size of 4096 bytes
    VM_STAT=$(vm_stat)
    PAGES_FREE=$(echo "$VM_STAT" | awk '/Pages free/ {print $3}' | tr -d '.')
    PAGES_ACTIVE=$(echo "$VM_STAT" | awk '/Pages active/ {print $3}' | tr -d '.')
    PAGES_INACTIVE=$(echo "$VM_STAT" | awk '/Pages inactive/ {print $3}' | tr -d '.')
    PAGES_SPECULATIVE=$(echo "$VM_STAT" | awk '/Pages speculative/ {print $3}' | tr -d '.')
    PAGES_WIRED=$(echo "$VM_STAT" | awk '/Pages wired down/ {print $4}' | tr -d '.')

    # 空きメモリ
    FREE_MEM=$(($PAGES_FREE + $PAGES_SPECULATIVE))

    # 使用中メモリ
    USED_MEM=$(($PAGES_ACTIVE + $PAGES_INACTIVE + $PAGES_WIRED))

    # 合計
    TOTAL_MEM=$(($FREE_MEM + $USED_MEM))


    # 使用中メモリ(%)
    #  小数点第1位まで求めて後から小数点文字(ドット)を挿入
    USED_MEM_PERCENT=$(echo "$(($USED_MEM * 1000 / $TOTAL_MEM))" | sed -e 's/(.*)([0-9])/1.2/' -e 's/^./0./')
    echo "${USED_MEM_PERCENT}"

    # RET
    return 0
}

# Debug
debug() {
    if [ "$DEBUG" = "yes" ]; then
        echo "PAGES_FREE: $PAGES_FREE pages"
        echo "PAGES_FREE: $(($PAGES_FREE * 4096 / 1024 / 1024 )) MB"
        echo "PAGES_ACTIVE: $PAGES_ACTIVE pages"
        echo "PAGES_ACTIVE: $(($PAGES_ACTIVE * 4096 / 1024 / 1024)) MB"
        echo "PAGES_INACTIVE: $PAGES_INACTIVE pages"
        echo "PAGES_INACTIVE: $(($PAGES_INACTIVE * 4096 / 1024 / 1024)) MB"
        echo "PAGES_SPECULATIVE: $PAGES_SPECULATIVE pages"
        echo "PAGES_SPECULATIVE: $(($PAGES_SPECULATIVE * 4096 / 1024 / 1024 )) MB"
        echo "PAGES_WIRED: $PAGES_WIRED pages"
        echo "PAGES_WIRED: $(($PAGES_WIRED * 4096 / 1024 / 1024)) MB"
        echo "FREE_MEM: $FREE_MEM pages"
        echo "FREE_MEM: $(($FREE_MEM * 4096 / 1024 / 1024)) MB"
        echo "USED_MEM: $USED_MEM pages"
        echo "USED_MEM: $(($USED_MEM * 4096 / 1024 / 1024)) MB"
        echo "TOTAL_MEM: $TOTAL_MEM pages"
        echo "TOTAL_MEM: $(($TOTAL_MEM * 4096 / 1024 / 1024)) MB"
        echo "---------------"
        # 搭載メモリ(理論値): 8GBの場合
        echo "TOTAL_MEM: $((8 * 1024)) MB (Theoretical value)"
        echo "---------------"
        echo "USED_MEM: $(($USED_MEM * 1000 / $TOTAL_MEM)) %"
    fi
}

RET=0
## メイン処理 -----
calculate_used_mem
RET=$?

## デバッグ -----
#DEBUG=yes debug

## exit
exit $RET


以上のようなシェルスクリプトを作成し、パスの通った場所に保存します。そして、実行権限を与えて、tmuxの設定ファイルに以下を追記します。

# ステータスライン - Right
set -g status-right '#[bg=yellow, bold]  #(echo $LANG)  #[bg=blue]  up  #(pc-running-time)  #[bg=green]  (#(loadaverage))  Mem  #(used-mem)%%  #[bg=red, bold]  %y/%m/%d(%a)%H:%M:%S  '

# Rightの表示領域最大長
set -g status-right-length 90

# 文字色と背景色
set -g status-fg white
set -g status-bg black


tmux_syui_and_yonchu

tmuxのステータスラインのカスタマイズ vol.2



tmux-powerline というものが公開されています。

cd

git clone https://github.com/erikw/tmux-powerline.git

sudo apt-get -y install curl

vim ~/.tmux.conf


なお、ここでは、競合する設定はコメント化することが前提です。以下を設定ファイルの末尾に追記してください。

set-option -g status on
set-option -g status-interval 2
set-option -g status-utf8 on
set-option -g status-justify "centre"
set-option -g status-left-length 60
set-option -g status-right-length 90
set-option -g status-left "#(~/tmux-powerline/status-left.sh)"
set-option -g status-right "#(~/tmux-powerline/status-right.sh)"


その他必要なものもありますが、適時設定、インストールしてください。以下、ステータスライン各種の参考画像です。

iTerm2



tmux よんちゅBlog



tmux powerline



vim powerline