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のプレフィックスキーは、デフォルトが変なの?
なんで?