Posted at

ターミナルマルチプレクサ手習い

More than 5 years have passed since last update.

「GNU Screenとか古い」とdisられるのに耐えられなくなったわけではなく新幹線の中でネットがなくてヒマなのでtmux覚えるね、ごめんね。隣に座っているお姉ちゃんが美人。


なにはともあれ

$ brew install tmux

$ man tmux


.oh-my-zshだ

zshのconfiguration自分でゼロからやると日が暮れるので満を持してoh-my-zsh導入したけど、これまでの挙動と違うのがイラつくので結局自分で書き足すし、テーマも適当なやつを自分でちょっと書きかえたりして日が暮れた。github/inuntano/oh-my-zshに置いてある。

oh-my-zshでtmux pluginを有効にするには.zshrcのpluginsに渡すArrayにtmuxって入れてあげればいいんだけど、boxenで入れたbrewに先にpathが通ってないとplugin読み込んだ時にエラーを吐くので、順番を変えて先にPATHを通してやるとよい。

# template from .oh-my-zsh/templates/zshrc.zsh-template

# Configure PATH before loading plugins
export PATH=$HOME/local/bin:/opt/local/bin:/usr/local/bin:/usr/bin:/bin:/opt

# configuration for boxen
[ -f /opt/boxen/env.sh ] && source /opt/boxen/env.sh
[ -f /opt/boxen/nvm/nvm.sh ] && source /opt/boxen/nvm/nvm.sh

# Which plugins would you like to load? (plugins can be found in ~/.oh-my-zsh/plugins/*)
# Custom plugins may be added to ~/.oh-my-zsh/custom/plugins/
# Example format: plugins=(rails git textmate ruby lighthouse)
# Add wisely, as too many plugins slow down shell startup.
plugins=(git ruby osx bundler brew emoji-clock vagrant tmux docker)

source $ZSH/oh-my-zsh.sh

我が家の.zshrcはこんな感じになっている。


キーバインドだ

「「師匠の教えでGNU Screenもprefixを変更していたのでtmuxでも同じようにしておきたい。GNU ScreenのデフォルトはCtl+a、tmuxのデフォルトはCtl+bだが、ウチの流派はCtl+zなので、そのように変更する。ついでに、tmuxのステータスバーの緑色が気に入らないので南イタリアの空と海の色に変更する。


tmux.config

# locate in ~/.tmux.config

# Change prefix key
set-option -g prefix C-z
unbind-key C-b
bind-key C-z send-prefix

# Change status bar color
set-option -g status-style bg=blue


こんな感じ。


起動と終了

起動すると新規のWindowが立ち上がる。Windowは分割できるので、分割された1つ1つはpaneと呼ばれる。paneを全部潰すとWindowが死んで、Windowが全部死ぬとtmuxが終了する。GNU Screenとだいたい一緒。作業途中のものをdetachしたり、sshが切れて強制的にdetachされたりしたものは再度attachすればそのまま使える。GNU Screenと一緒。もうこれGNU Screenでいいんじゃないか。

# Start a tmux session with specifying name, -s means "specify"

$ tmux new-session -s "atarashiiasagakitakibounoasada"

# Detach
# Ctl-z + d

# List detached window
$ tmux list-session
# => atarashiiasagakitakibounoasada: 1 windows (created Wed Aug 13 14:51:30 2014) [149x39]

# Attach: Specify name of window to attach, -t means "target"
$ tmux attach -t "atarashiiasagakitakibounoasada"

# Kill pane
# Ctl+z + x

ただでさえセッションの名前が長いのにコマンドをいちいち打っていられるか、ということでoh-my-zshのtmuxプラグインがaliasを用意してくれています。親切ですね。

# Start a new tmux session with specifying name

$ ts "atarashiiasagakitakibounoasada"

# Detach
# Ctl-z + d

# List detached window
$ tl

# Attach
$ ta "atarashiiasagakitakibounoasada"

# Kill pane
# Ctl-z + x

随分と楽になった。ちなみにattachではzshで補完も効くのでわざわざ長いセッション名をタイプする必要もない。とても便利ですね。


tmux起動中のコマンド一覧

必要そうなものしか並べない。そんなに沢山覚えられないし。コマンドの前に打つprefixは省略します。

Command
Description

%
左右にウィンドウを分割する

"
上下にウインドウを分割する

o
paneを移動する

c
新しいウィンドウ

n
次のウインドウに移動する

p
前のウインドウに移動する

[
コピーモードに移行

Ctl+space
copymode: 選択開始

Ctl+w
copymode:コピーしてコピー終了

]
コピーした文字列をペースト

t
時計が出る

美人のお姉さんは岡山で降りていきました。