欲しいものリスト

tmux

Brogramming with Tom
tmuxのカスタマイズ方法と使い方をまとめます。新情報や間違いの指摘などは気軽にコメント下さい。

photo credit: ryanoshea via photopin cc

目次



# タイトル 内容
01 オプション コマンドのオプションでよく使うものを紹介します。
02 キーバインド よく使うキーバインドを紹介します。
03 カスタマイズ 以下、tmuxのカスタマイズについてです。


カスタマイズ



以下、カスタマイズ内容を個別に表示します。


# タイトル 内容
01 Vi風に操作したい キーバインドをVi風に設定します
02 設定ファイルをリロードしたい 設定ファイルを変更したときにキーで反映できるようにします
03 tmux-powerline ステータスラインをカッコよくします
04 起動時にペインを分割する 起動時に指定の分割を行う方法を紹介します
05 tmuxを自動起動する ターミナル(シェル)起動時に、tmuxを自動起動する方法を紹介します
06 クリップボードを共有したい Macでは、クリップボード共有が困難なので、その問題を解決します
07 ペインの移動を簡単にする Shiftと矢印でペイン移動を実現する方法です
08 素早く前のペインの戻る C-t, C-tで素早く前のペインの戻る方法です。ただし、prefixをC-tに設定します
09 その他の基本設定 その他の基本設定をまとめます
10 tmuxのコピーモードを便利にする コピーやペーストを1キーで行う設定を紹介します



オプション



オプション 効果
tmux a [tmux attach-session]の効果があります。セッションをアタッチします
tmux lsc [tmux list-clients]の効果があります。アタッチしているセッションを調べます
tmux kill-session セッションを削除します









キーバインド



C-b(prefix) + ?でキーバインドを表示します。以下、よく使うものだけ紹介します。


キー 効果
C-b d セッションのデタッチ
C-b : コマンドモードの開始
C-b % ペイン分割(縦)
C-b " ペイン分割(横)
C-b o 次のペインに移動
C-b x ペイン破棄
C-b { ペインの入れ替え
C-b } ペインの入れ替え
C-b w ウィンドウ一覧
C-b c ウィンドウ作成
C-b n 次のウィンドウへ
C-b [ コピーモード開始
C-b C-Space コピーの始点
C-b Esc-w コピーの終点
C-b ] コピーしたデータの貼り付け


http://www.omakase.org/misc/tmux_screen.html


カスタマイズ




Vi風に操作したい



# キーバインドをVi風に一括変更
set-window-option -g mode-keys vi


# Vi風のキーバインド改良版
# http://tegetegekibaru.blogspot.jp/2012/08/tmux-vi.html

# コピーモード突入
bind y copy-mode
# ペースト
bind p paste-buffer
# vでマーク開始
bind -t vi-copy v begin-selection
# yでヤンク
bind -t vi-copy y copy-selection
# ペインの移動Vi風
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
# ペインリサイズ関連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




設定ファイルをリロードしたい




# prefix + r で設定ファイルを再読み込み
unbind r
bind r source-file ~/.tmux.conf




tmux-powerline






cd ~/dotfiles/

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

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 "#(~/dotfiles/tmux-powerline/powerline.sh left)"
set-option -g status-right "#(~/dotfiles/tmux-powerline/powerline.sh right)"



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


tmux-powerlineについては、新しい解説記事を書きました。よろしくお願いします。

tmux-powerline


起動時にペインを分割する



tmux new-session \; splitw


http://qiita.com/items/1304c2eecc2657ac6265


tmuxを自動起動する



Shellの設定ファイルに設定を記述します。ここでは、 zshの場合です。


## tmux自動起動
# http://d.hatena.ne.jp/tyru/20100828/run_tmux_or_screen_at_shell_startup
is_screen_running() {
# tscreen also uses this varariable.
[ ! -z "$WINDOW" ]
}
is_tmux_runnning() {
[ ! -z "$TMUX" ]
}
is_screen_or_tmux_running() {
is_screen_running || is_tmux_runnning
}
shell_has_started_interactively() {
[ ! -z "$PS1" ]
}
resolve_alias() {
cmd="$1"
while \
whence "$cmd" >/dev/null 2>/dev/null \
&& [ "$(whence "$cmd")" != "$cmd" ]
do
cmd=$(whence "$cmd")
done
echo "$cmd"
}


if ! is_screen_or_tmux_running && shell_has_started_interactively; then
for cmd in tmux tscreen screen; do
if whence $cmd >/dev/null 2>/dev/null; then
$(resolve_alias "$cmd")
break
fi
done
fi



クリップボードを共有したい



brew install reattach-to-user-namespace



#!/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


http://yonchu.hatenablog.com/entry/20120514/1337026014


ペイン間の移動を簡単にする




# Shift + 上下左右でペインを移動できるようにする。(<Prefix>不要)
# 行頭に"bind -n"をつけるとPrefixが不要になる。
bind -n S-left select-pane -L
bind -n S-down select-pane -D
bind -n S-up select-pane -U
bind -n S-right select-pane -R



素早く前のペインの戻る



# Set the prefix to ^T.
unbind C-b
set -g prefix ^T
bind t send-prefix

# C-t, C-tで前のペインへ移動する
# http://d.hatena.ne.jp/naoya/20130108/1357630895
bind C-t run "tmux last-pane || tmux last-window || tmux new-window"



その他の基本設定



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

#ウィンドウを実行コマンド名で自動リネーム
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 -gw mode-mouse on
#set-option -g mouse-utf8 on
## mouse-resize-pane on にするとteratermでのコピー&ペーストがCtrlボタンを押しながらやる必要があるのでOFF
#set-option -g mouse-resize-pane on
set-option -g mouse-select-pane on
#set-option -g mouse-select-window on

# ペイン終了
bind K kill-pane
# ペイン番号表示
bind i display-panes


tmuxのコピーモードを便利にする


ポイントは、send-keysです。最後の行だけを見ていきましょう。

# 設定リロード
bind r source-file ~/.tmux.conf \; display-message "Reload Config!!"

# "C-b, [" コピーモードの設定 vi
#set-window-option -g mode-keys vi
setw -g mode-keys vi

# [?]キーバインドの確認

# [p]貼り付け
bind p paste-buffer

# c[Enter]コピー
#bind-key -t vi-copy Enter copy-pipe "reattach-to-user-namespace pbcopy"
bind -t vi-copy Enter copy-pipe "xclip -i -selection clipboard"

# c[Space]選択

# [y]1行コピー(クリップボードとの連携がない場合)
bind -t vi-copy Enter copy-pipe "xclip -i -selection clipboard"
bind -t vi-copy Y select-line
bind y run 'tmux copy-mode\; send-keys Y Enter'

## [y]1行コピー(クリップボードとの連携がある場合)
#bind -t vi-copy Y select-line
#bind y run 'tmux copy-mode\; send-keys Y'

# [v]全行コピー
bind -t vi-copy V begin-selection
bind v run 'tmux copy-mode\; send-keys ggVG Enter'


これは、続けて ggVG Enter の順でキーを押すという命令になっています。


copy-modeで使えるコマンドは以下の記事が参考になります。


tmux での1行コピー または man tmux に載っていないコマンド - @m4i's blog