Tmux on Ubuntuでクリップボード共有

Tmux on Ubuntuクリップボード共有

今回はUbuntu上でTmuxを使うときのクリップボード共有について触れようと思います。

私がコマンドラインしか使いたくない病を患っていた頃はw3mで検索して

全部ターミナル上で完結させるんだ!と言った具合だったのですが、

近年ではマシンスペックや回線速度が大幅に向上して通常のインターネットブラウザを使用しても情報へのアクセス速度が気にならなくなりました。

コマンドラインだけで完結させなくても高速なアクセスが可能ですごい!

...そうするとブラウザでクリップボード上にコピーしたデータをターミナル上に持ってくる必要が出てくるのですが、これだけならCtrl + Shift + vで問題ありません。

しかし別の用途、例えば自分の成果物を公開したり誰かにチャットで送るときに

「標準出力から対象の箇所を探しマウスで範囲選択してコピーしてチャットにペースト」

みたいなことをしたくありません。

そうなってくると重要になってくるのがTmuxでのクリップボード共有です。

Tmuxでクリップボード共有を設定すれば

  • 見やすいブラウザで検索してコピーしたらそれをターミナルにペースト
  • 標準出力等から対象を検索して範囲コピー、それをターミナル外で共有

を簡単にやることができます。

やり方とか

まず、Ubuntuでのクリップボードと言えばxselかxclipかと言われていたり両方入れるべしと言われていたりしますが最終的にTmuxとの相性はxselのほうがいいとされているようです。

(そういう認識なのですが違ったらすみません)

xselは最近Ubuntuのデフォルトになったので最初から入っています。(たぶん)

なのでxselだけ入っていれば良いと思います(適当)

入っているかは以下のように確認してください。

$which xsel
/usr/bin/xsel

もし、入っていなければインストールしてください。

$sudo apt install xsel

肝心のクリップボード共有の部分は以下で、

bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "xsel -ip && xsel -op | xsel -ib"
bind -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "xsel -ip && xsel -op | xsel -ib"

これをすることでコピーモード中にyやEnterを押下するとクリップボードに保存できて

bind ] run 'tmux set-buffer -- "$(xsel -b)"; tmux paste-buffer'

さらにこうすることでターミナル外でコピーしたクリップボードのデータを Prefix + ] でターミナル上に持ってくることができます。

ちなみに「xsel -ib」はクリップボードにインプットするということで、「xsel -b」は"クリップボードの内容を標準出力する"という意味です。

(長くなるので説明は端折ります)

また、Macでやる場合はxselの関わる部分をpbcopyとpbpasteに置き換えて使います。

最終的なコピー周りのオススメ設定

.tmux.conf

# copy-mode
## viコピーモードにする
set-window-option -g mode-keys vi
## クリップボード共有 for Ubuntu
### yかEnterでコピー実行
bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "xsel -ip && xsel -op | xsel -ib"
bind -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "xsel -ip && xsel -op | xsel -ib"
### Prefix + ]で貼り付け
bind ] run 'tmux set-buffer -- "$(xsel -b)"; tmux paste-buffer'
## 矩形選択する
bind -T copy-mode-vi C-v send-keys -X rectangle-toggle
bind -T copy-mode-vi v send-keys -X begin-selection
## 行選択する
bind -T copy-mode-vi V send-keys -X select-line
## 選択をEscでやめる
bind -T copy-mode-vi escape send-keys -X clear-selection

クリップボード共有の部分はUbuntuのみ書いていますが、必要があればunameの結果を条件に設定項目が切り替わるようにすると良いと思います。