FrontPage  Index  Search  Changes  RSS  Login

[system] tmuxチュートリアル

概要

The Pragmatic Bookshelfのtmuxを購入したので、チュートリアルよろしく読み進めた記録を残す。

※ 会社勉強会の発表候補。

STEP000: 準備編

GNU screenの代替となるモダンなterminal multiplexerの話。

インストール

パッケージ管理ツールを使うか、ソースコードをダウンロードしてコンパイルするだけなので割愛。

設定ファイル

グローバルな設定は/etc/tmux.confに記述し、ユーザ固有の設定は~/.tmux.confに記述する。

$ mkdir conf
$ touch conf/.tmux.conf
$ ln -s $(pwd)/conf/.tmux.conf ~/.tmux.conf
$ cd conf
$ git init
$ git add .tmux.conf
$ git commit -m'init'
$ tmux

STEP001: プレフィクスキーを変更する

$ git checkout -b step001

デフォルトのCtrl-bからCtrl-aに変更する。

set -g prefix C-a

ついでに、デフォルトのプレフィクスキーを解除しておく。

unbind C-b

source-fileコマンドで設定ファイルをリロードする。以下をタイプ。

C-b : source-file ~/.tmux.conf
$ git add .tmux.conf
$ git commit -m 'changed prefix key'
$ git checkout master
$ git merge step001

※ 個人的な話をするとC-aで行頭移動している都合上、今まではC-tを使ってきたのでC-aは使わないかもしれない。

STEP002: ESCキーの遅延

$ git checkout -b step002

デフォルト設定だとESCキーを押した後に500msほど遅延する様になっているので、遅延を1ms程度にしておく。

set -sg escape-time 1

設定ファイルを読み込み直す。

C-a : source-file ~/.tmux.conf
$ git add .tmux.conf
$ git commit -m 'escape-time'
$ git checkout master
$ git merge step002

STEP003: ウィンドウやペインの番号を1 originにする

$ git checkout -b step003
set -g base-index 1
set -g pane-base-index 1

設定ファイルを読み込み直す。

C-a : source-file ~/.tmux.conf

既に作成されているウィンドウやペインについてはそのまま。

$ git add .tmux.conf
$ git commit -m 'setting the window and pane index'
$ git checkout master
$ git merge step003

STEP004: 設定ファイル再読込のキーバインディング

$ git checkout -b step004
bind r source-file ~/.tmux.conf \; display "Reloaded!"

設定ファイルを読み込み直す。

C-a : source-file ~/.tmux.conf

今後は、C-a rで設定ファイルを再読込出来る。

$ git add .tmux.conf
$ git commit -m 'add a keybinding'
$ git checkout master
$ git merge step004

STEP005: プレフィクスキーをアプリケーションに送る

$ git checkout -b step005

通常、プレフィクスキーはtmuxに持って行かれるため、tmux内で起動したアプリケーションに渡らない。それを渡す様にする。

bind C-a send-prefix

C-a rで設定を反映。

$ git add .tmux.conf
$ git commit -m 'send prefix key'
$ git checkout master
$ git merge step005

STEP006: ペイン分割のキーバインディング

$ git checkout -b step006

水平分割、垂直分割のキーバインディングを追加する。

bind | split-window -h
bind - split-window -v

C-a rで設定を反映。

%や"のままが好みであれば設定は不要。

$ git add .tmux.conf
$ git commit -m 'add keybindings'
$ git checkout master
$ git merge step006

STEP007: ウィンドウとペインを移動するキーバインディング

$ git checkout -b step007

上下左右の移動のキーバインディングを追加する。viの方向指定でペインを渡り歩く設定。

bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

好みでウィンドウの移動のキーバインディングも追加。C-a C-p/nでもウィンドウ移動をしたい場合は以下を追加すると便利だと思う。

bind -r C-p select-window -t :-
bind -r C-n select-window -t :+

C-a rで設定を反映。

$ git add .tmux.conf
$ git commit -m 'add keybindings'
$ git checkout master
$ git merge step007

STEP008: ペインリサイズのキーバインディングを追加

$ git checkout -b step008

ペインの縦横サイズを変更する。

bind H resize-pane -L 5
bind J resize-pane -D 5
bind K resize-pane -U 5
bind L resize-pane -R 5

リピートしたい場合は以下も追加。リピートの調整はrepeat-timeで設定可能。

bind -r H resize-pane -L 5
bind -r J resize-pane -D 5
bind -r K resize-pane -U 5
bind -r L resize-pane -R 5

C-a rで設定を反映。

$ git add .tmux.conf
$ git commit -m 'add keybindings'
$ git checkout master
$ git merge step008

STEP009: マウス

$ git checkout -b step009

個人的に使わないので無効にする設定。

setw -g mode-mouse off

C-a rで設定を反映。

$ git add .tmux.conf
$ git commit -m 'disable mouse'
$ git checkout master
$ git merge step009

STEP010: 256色

$ git checkout -b step010

シェルやターミナルアプリケーション側でxterm-256colorを使える様にしておく。

$ wget 'http://www.vim.org/scripts/download_script.php?src_id=4568' -O colortest
$ perl colortest -w

TERMを変更する設定。

set -g default-terminal "screen-256color"

C-a rで設定を反映。

$ git add .tmux.conf
$ git commit -m 'change TERM'
$ git checkout master
$ git merge step010

STEP011: 色設定

$ git checkout -b step011

色は以下のシェルスクリプトを実行して確認できる。

for i in {0..255}
do
  printf "\x1b[38;5;${i}mcolour${i}\n"
done

ステータスバーの色を変更してみる。

set -g status-fg white
set -g status-bg black

ウィンドウリスト(ステータスバーのウィンドウ名が表示されるところ)の色を変更してみる。

set -g window-status-fg cyan
set -g window-status-bg default
set -g window-status-attr dim

ペイン分割線の色を変更してみる。

set -g pane-border-fg green
set -g pane-border-bg black
set -g pane-active-border-fg white
set -g pane-active-border-bg yellow

コマンドラインの色を変更してみる。

set -g message-fg white
set -g message-bg black
set -g message-attr bright

C-a rで設定を反映。

$ git add .tmux.conf
$ git commit -m 'change color'
$ git checkout master
$ git merge step011

STEP012: ステータスバーを変更する

$ git checkout -b step012

以下の変数を利用できる。

#H
ローカルマシンのホスト名
#h
ローカルマシンのホスト名(ドメインなし)
#F
現在のウィンドウを示すフラグ
#I
現在のウィンドウのインデックス番号
#P
現在のペインのインデックス番号
#S
現在のセッションの名前
#T
現在のウィンドウのタイトル
#W
現在のウィンドウの名前
##
文字#
#(comman)
コマンド出力の先頭行
#[attributes]
色や属性を変更する
set -g status-left-length 40
set -g status-left "#[fg=green]Session: #S #[fg=yellow]#I #[fg=cyan]#P"
set -g status-right "#[fg=cyan]%d %b %R"

UTF-8サポート。

set -g status-utf8 on

ステータスバーを更新する。

set -g status-interval 60

ウィンドウリストを中央寄せする。

set -g status-justify centre

他のウィンドウのアクティビティを表示。

set -g monitor-activity on
set -g visual-activity on

C-a rで設定を反映。

$ git add .tmux.conf
$ git commit -m 'change status bar'
$ git checkout master
$ git merge step012

STEP013: コマンド

developmentという名前で新規にセッションを作る。

$ tmux new-session -s development

C-a dでデタッチする。デタッチしたセッションに対してウィンドウ分割も出来る。

$ tmux split-window -h -t development

セッションを指定してアタッチ。

$ tmux attach -t development

セッションを作成してデタッチ。

$ tmux new-session -s development -n editor -d

セッションを指定してコマンドを送信。

$ tmux send-keys -t development  'cd ~/tmp' C-m

ターゲットセッション(-t)は、[session]:[window].[pane]という形式でウィンドウやペインも指定できる。

スクリプト例。

script.sh
tmux has-session -t development
if [ $? != 0 ]
then
  tmux new-session -s development -n editor -d
  tmux send-keys -t development 'cd ~/tmp' C-m
  tmux send-keys -t development 'vim' C-m
  tmux split-window -v -t development
  tmux select-layout -t development main-horizontal
  tmux send-keys -t development:1.2 'cd ~/tmp' C-m
  tmux new-window -n console -t development
  tmux send-keys -t development:2 'cd ~/tmp' C-m
  tmux select-window -t development:1
fi
tmux attach -t development

-fオプションで設定ファイルを指定してtmuxを実行。

app.conf
source-file ~/.tmux.conf
new-session -s development -n editor -d
send-keys -t development 'cd ~/tmp' C-m
send-keys -t development 'vim' C-m
split-window -v -t development
select-layout -t development main-horizontal
send-keys -t development:1.2 'cd ~/tmp' C-m
new-window -n console -t development
send-keys -t development:2 'cd ~/tmp' C-m
select-window -t development:1
$ tmux -f app.conf attach
$ git checkout -b step013
$ git add script.sh app.conf
$ git commit -m 'add scripts'
$ git checkout master
$ git merge step013

STEP014: tmuxinator

$ git checkout -b step014
$ rbenv local 1.9.3-p0
$ gem install tmuxinator --no-ri --no-rdoc
$ rbenv rehash
$ tmuxinator doctor

tmuxinatorを利用することで、スクリプトの代わりにYAMLフォーマットで設定を記述することが出来る。

deveopment.yml
project_name: development
project_root: ~/tmp
tabs:
  - editor:
      layout: main-horizontal
      panes:
        - vim
        - #empty
  - console: #empty
$ tmuxinator open development

rvmが実行されたので、rbenvじゃなくてrvmを使う必要がある様子。

$ git add development.yml
$ git commit -m 'tmuxinator'
$ git checkout master
$ git merge step014

STEP015: コピーモード

$ git checkout -b step015

コピーモードのキーバインドをviライクにする。

setw -g mode-keys vi

C-a rで設定を反映。

  • "C-a ["でコピーモード開始
  • スペースキーで開始位置をマーク
  • 終端位置でエンターキーを押してコピー(バッファに入れる)
  • "C-a ]"でペースト

コマンドラインでcapture-paneを実行すると、ペインのバッファをキャプチャする事ができる。 キャプチャしたものはバッファに入る。

バッファの内容は以下のコマンドで表示する事も出来る。

$ tmux show-buffer

また、ファイルに書き出す事もできる。

$ tmux save-buffer buffer.txt

バッファは複数持つことが出来る。

$ tmux list-buffers
C-a : choose-buffer
$ git add .tmux.conf
$ git commit -m 'copy mode'
$ git checkout master
$ git merge step015

STEP016: ネイティブのクリップボードと連携する

$ git checkout -b step016

OS X Lionのpbcopy/pbpasteをtmuxの中で使えないため、ラッパーを利用する必要がある。

$ git clone https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard.git
$ cd tmux-MacOSX-pasteboard
$ make reattach-to-user-namespace
$ cp reattach-to-user-namespace ~/bin
set -g default-command "~/bin/reattach-to-user-namespace -l $SHELL"

ラッパー経由でシェルを立ち上げる必要があるので、設定を再読込した後に作成したウィンドウ以降で動く。

C-a C-cでバッファの内容をクリップボードにコピーし、C-a C-vでクリップボードの内容をバッファにコピーしつつペーストする。

bind C-c run "tmux save-buffer - | ~/bin/reattach-to-user-namespace pbcopy"
bind C-v run "tmux set-buffer $(~/bin/reattach-to-user-namespace pbpaste); tmux paste-buffer"

C-a rで設定を反映。

$ git add .tmux.conf
$ git commit -m 'copy mode and clipboard'
$ git checkout master
$ git merge step016

STEP017: 共有アカウントでペア作業

SSHで鍵認証できる共有アカウントを一つ用意する。

一人がセッションを作り、

A: $ tmux new-session -s Pairing

別の人がそのセッションにアタッチする。

B: $ tmux attach -t Pairing

AとBとで画面(ターミナル)が共有され、入出力がミラーリングされる感じになる。

同一セッションにアタッチする場合、ウィンドウ移動などの操作もミラーされるの。 グループセッションにセッションを追加すると、セッションをミラーしつつウィンドウ切り替えなどは個別に行えるようになる。

groupsessionという名前でセッションを作成する。

A: $ tmux new-session -s groupsession

groupsessionをターゲット(グループ)として、localsessionという名前のセッションを追加する。

B: $ tmux new-session -t groupsession -s localsession

この状態で片方のセッションからウィンドウを増やしてウィンドウを変更すると、他方のセッションではウィンドウは増えるが変更はされなくなる。

STEP018: 異なるアカウントでペア作業

ソケット越しにセッションを共有する事もできる。

$ vagrant up
$ vagrant ssh
% sudo yum install tmux

適当なアカウントを2つ用意する。

% sudo /usr/sbin/useradd ted
% sudo /usr/sbin/useradd barney

tmuxグループを作成する(yumでインストールした場合は作られているはず)。

% sudo /usr/sbin/groupadd tmux

ソケットを置くディレクトリ/var/tmuxを作成してパーミッションを調整する。

% sudo install -d -g tmux /var/tmux
% sudo chmod g+ws /var/tmux

利用するアカウントをtmuxグループに所属させる。

% sudo /usr/sbin/usermod -aG tmux ted
% sudo /usr/sbin/usermod -aG tmux barney

tedが/var/tmux/Paringにソケットを作る。

ted% tmux -S /var/tmux/Pairing new-session

barneyが/var/tmux/Paringを通じてアタッチする。

barney% tmux -S /var/tmux/Pairing attach

tmuxの設定は、セッションを作成した側の.tmux.confなどが反映されている事に注意が必要。

STEP019: ペインをウィンドウにする

現在のペインを消してウィンドウにする。

C-a !

STEP020: ウィンドウをペインにする

$ tmux new-session -s panes -n first -d
$ tmux new-window -t panes -n second
$ tmux attach -t panes
C-a : join-pane -s 1.1

ウィンドウ1を現在のウィンドウのペイン1にする。

STEP021: ペインのスワップ

$ git checkout -b steop021

一時的にペインを解除して全体表示したい様な場合はswap-paneを使ってスワップさせる事が出来る。 もちろん、スワップして一時的に解除したペインは元に戻せる。

unbind Up
bind Up new-window -d -n tmp \; swap-pane -s tmp.1 \; select-window -t tmp
unbind Down
bind Down last-window \; swap-pane -s tmp.1 \; kill-window -t tmp

C-a rで設定を反映。

$ git add .tmux.conf
$ git commit -m 'swap pane'
$ git checkout master
$ git merge step021

STEP022: ペインでコマンドを実行

$ tmux new-session -s servers -d "ssh user@host1"
$ tmux split-window -v "ssh user@host2"
$ tmux attach -t servers

STEP023: カレントディレクトリで新しいペインを開く

※ 最新版(一部OSは未対応)ではデフォルトで、元のペインのカレントディレクトリが新しいペインのカレントディレクトリになっているとのこと。

STEP024: セッションを切り替える

$ git checkout -b step024
$ tmux new -s editor -d vim
$ tmux new -s processes -d top
$ tmux attach -t editor
bind -r ( switch-client -p
bind -r ) switch-client -n

C-a rで設定を反映。

$ git add .tmux.conf
$ git commit -m 'add keybindings'
$ git checkout master
$ git merge step024

STEP025: セッションがあればアタッチして無ければセッションを作る

$ git checkout -b step025
if ! tmux has-session -t development ; then
  exec tmux new-session -s development
else
  exec tmux attach -t development
fi
$ git add example.zsh
$ git commit -m 'example fo .zshrc'
$ git checkout master
$ git merge step025

STEP026: ウィンドウを移動させる

$ tmux new -s editor -d vim
$ tmux new -s processes -d top
$ tmux attach -t processes

以下を実行すると現在のウィンドウをeditorセッションに移動出来る。

C-a . editor

もしくは以下を実行しても同じ事ができる。

$ tmux move-window -s processes:1 -t editor

STEP027: tmuxをデフォルトで起動

$ git checkout -b step027
if [ "$TERM" != 'screen-256color' ]; then
  tmux attach-session -t "$USER" || tmux new-session -s "$USER"
  exitf
fi
$ git add example.zshrc
$ git commit -m 'example fo .zshrc'
$ git checkout master
$ git merge step027

STEP028: ログ記録

$ git checkout -b step028
bind P pipe-pane -o "cat >> $HOME/#W.log" \; display "Toggled logging to ~/#W.log"

C-a rで設定を反映。

$ git add .tmux.conf
$ git commit -m 'logging'
$ git checkout master
$ git merge step028
Last modified:2012/03/03 03:06:00
Keyword(s):[system]
References: