tmuxとMacのクリップボードを共有する(copy-mode, vim)

  • 88
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

環境

OS X: 10.9.1
tmux: 1.9
vim: 7.4.161

tmuxのコピーコマンドでのクリップボード共有

下記の方法でvimライクの設定にすることができる。

tmux Copy & Paste on OS X: A Better Future

使うのはreattach-to-user-namespace。Homebrewでインストールできる。

ChrisJohnsen/tmux-MacOSX-pasteboard

$ brew install reattach-to-user-namespace
.tmux.conf
# Use vim keybindings in copy mode
setw -g mode-keys vi

# Setup 'v' to begin selection as in Vim
bind-key -t vi-copy v begin-selection
bind-key -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"

# Update default binding of `Enter` to also use copy-pipe
unbind -t vi-copy Enter
bind-key -t vi-copy Enter copy-pipe "reattach-to-user-namespace pbcopy"

これで<prefix> [でコピーモードに入った時に、vで選択を開始しyもしくはEnterで選択範囲をコピーできるようになる。

tmux上で起動したvimのクリップボード共有

上記方法ではtmux上で起動したvimで依然クリップボードが使えず、Nothing in register *というエラーが表示される。
これを回避するには、reattach-to-user-namespaceをtmuxのdefault-commandに設定する。

.tmux.conf
set-option -g default-command "reattach-to-user-namespace -l bash"

それでもダメな場合

しかし、僕の環境ではこの設定をするとtmuxが[exited]というログとともにすぐに終了してしまうようになってしまった。

default-commandの設定を消し、tmux内ですぐに

$ exec reattach-to-user-namespace -l "$SHELL"

を実行すると有効になるが、面倒くさい。

そこで、aliasを作る。

alias vim="reattach-to-user-namespace vim"

結局vimだけ共有されていれば良いので、これで十分な感じだ。tmux起動していない時もalias貼られるのがちょっともやっとするけど。

参考: Sharipov Ruslan : tmux 1.8 + vim/MacVim: easy OSX clipboard integration

シェルスクリプトを使う方法

いろいろ試した結果、どうも次のようなシェルスクリプトでラッピングすると使えるようになるみたいだ。

https://github.com/jimeh/dotfiles/commit/3470b1632fff4e97426e41a4c20fbb385688b782

login-shell
#! /usr/bin/env bash

# Ensure that tmux windows are by default named after the shell, rather than
# full path to the shell binary.
shell=$(basename "$SHELL")

# If reattach-to-user-namespace is not available, just run the command.
if [ -n "$(command -v reattach-to-user-namespace)" ]; then
  reattach-to-user-namespace -l "$shell"
else
  exec "$shell"
fi
.tmux.conf
set-option -g default-command "login-shell"

権限設定を忘れずに。

$ chmod +x ~/bin/login-shell