tmuxx

Finish/Start
今回は、Macで使用する tmuxの紹介です。

photo credit: I like via photopin cc


tmux on Mac


Macにインストールした tmuxは、クリップボード共有ができないことに気づかれた方がいるかもしれません。しかし、これらは、以前の tmux では、以下のような方法で対応することができました。


# clipboard for mac
# http://d.hatena.ne.jp/tmatsuu/20111220/1324399472
set-option -g default-command "~/bin/reattach-to-user-namespace -l $SHELL"
bind-key C-c run "tmux save-buffer - | ~/bin/reattach-to-user-namespace pbcopy"
bind-key C-v run "~/bin/reattach-to-user-namespace pbpaste | tmux load-buffer - && tmux paste-buffer"



ちなみに、自動起動の手順は以下のような感じです。

# tmux start
# 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



tmuxx


しかし、新しくインストールした tmuxでは、このような方法が使えなくなっていたので、 tmuxxというものを使ってみました。

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

# http://yonchu.hatenablog.com/entry/20120514/1337026014
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


これについては、 こちらの記事がとても参考になります。


そして、自動起動の方法は、以下のような感じになります。

# tmuxx start
# http://qiita.com/items/1e1d3053c33f528363d9
if [ -z $TMUX ]; then
if $(tmuxx has-session); then
tmuxx attach
else
tmuxx
fi
fi



よく見かける tmuxxでは、 iTerm2使用者は、上のような起動方法が使えませんので注意が必要です。新しく開いたタブやウィンドウがクローンされてしまいます。