Mac の tmux でクリップボードを使う。

(2015-09-05 追記)
この記事は古くなっています。他の記事を参照してください。reattach-to-user-namespace は Homebrew でインストールできます。

(追記おわり)


Mac OSX の tmux では、pbcopy/pbpasteコマンドが正常に動作しません。

コンソールの出力をコピペしたいことは頻繁にあります。Evernoteで作業ログをとったり、メールで手順を送ったり、Tracに実行結果を貼り付けたり。クリップボードが使えないと不便です。

古い対策

これまではコピー用に別のプロセスを走らせていました。

ほぼ問題なかったのですが、日本語が文字化けしてしまうのが不満でした。

もっと良い対策はないかと探していて、以下の対策を見つけました。

(上の文字化けは、たぶん、showbをsave-bufferに変えて回避できます。)

新しい対策

の説明に従って設定します。

Downloadsから小さなラッパーアプリケーションをダウンロードしてmake。パスの通ったディレクトリに置きます。

$ make reattach-to-user-namespace 
$ cp reattach-to-user-namespace ~/bin

次に .tmux.conf に

set-option -g default-command "reattach-to-user-namespace -l zsh"

を足します。

これでzsh上でpbcopy/pbpasteコマンドが動作するようになります。

$ date | pbcopy

で日付がクリップボードにコピーされたらOK。

上のset-optionの末尾を書き換えればzsh以外でもたぶん使えると思います。

キーバインディング

tmuxのバッファをクリップボードにコピーするためのキーバインディングを設定します。

bind C-q run-shell 'reattach-to-user-namespace tmux-pbcopy'

を .tmux.conf に追加して、~/bin (などのパスの通ったディレクトリ)にtmux-pbcopy というファイル名で、

#! /bin/sh

tmux save-buffer /tmp/.tmux_to_pbcopy
cat /tmp/.tmux_to_pbcopy | pbcopy

# 以下はメッセージを表示するだけ。無くてもOK。
HEAD=`head -1 /tmp/.tmux_to_pbcopy`
TAIL=`tail -1 /tmp/.tmux_to_pbcopy`
tmux display-message "Copy:  $HEAD  -  $TAIL"

を追加します。

これで (プレフィックスキー) + C-q で最新のバッファがクリップボードに入ります。

デフォルトでは、

  • C-b C-[ でコピーモードに入る。
  • C-SPCで選択開始
  • C-wでバッファにコピー
  • C-b C-qでクリップボードにコピー

です。

ファイルに保存したくないからと言って、save-bufferの代わりにshow-bufferを使うと文字化けします。

C-wでクリップボードにコピーできないの?

C-b C-[ でコピーモードに入った状態のキーバインディングemacs-copy / vi-copy というテーブルに設定されています。

C-b C-: list-keys -t emacs-copy

で一覧が表示されます。emacs-copy / vi-copy モードは、通常のモードと分かれており、C-qをシェルスクリプトに割り当てるといった設定は、今のところできないようでした。手元のバージョンは、

$ tmux -V
tmux 1.4

です。

なんでscreenとかtmuxのプレフィックスキーは、デフォルトが変なの?

なんで?