mlterm<->Xでの快適コピペ環境


PCの中では、当然Emacsが鎮座しているのですが、その他にもいろいろと立ちあげていまして、その中の一つがzsh on tmux on mlterm(ややこしい)です。 一時期、シェルもEmacsだろとか考えていた時期もありましたが、やはりzsh便利すぎなので、結局zshに落ちついています。

ただ、ここで困っていたのが、mltermとX上のアプリ間でのコピペでした。 うまくできなかったり、できたとしてもマウスを使わないとできなかったりとか悲しいことばかりです。

コピペを使わない人がいるはずもなく、先人達もいろいろと提案されています。

X環境のクリップボードやOS Xのペーストボードとtmuxのバッファを連携する方法 – Dマイナー志向
tmux のコピーモードを使ってみる – ようへいの日々精進 XP

ただ、どれも少し手間がかかります。コピペなどしょっちゅうする作業なので、あまり手間はかけたくないものです。

というわけで、マウスレスで手間のかからないコピペ環境をmlterm(上のtmux)<->Xで作ってみたので紹介します。

X->mlterm (mltermの設定)

~/.mlterm/key に次のように書いておけばCtl+y でPRIMARYの内容をmltermにペーストすることができます。

# Ctl+y で PRIMARY の内容をペーストする
Control+y=INSERT_SELECTION

mlterm->X (tmux, mltermの設定)

tmuxにはもともとcopy-modeが備わっています。このcopy-modeを使えば、マウスレスなコピペが可能になるはずです。

ただ、コピーした内容をX環境にも伝播させる必要があります。これにはmltermが対応している制御シーケンスのOSC52を使うこととします。

リモートの tmux でコピーした内容のローカルのクリップボードへの反映 | doda’s blog

.tmux.confには次のように書いておきます。

#コピーモードのキーバインドを設定
bind y copy-mode
# OSC52に対応させる
set-option -ag terminal-overrides ",mlterm:Ms=\\E]52;%p1%s;%p2%s\\7"

~/.mlterm/mainにも次のように書いておきます

##OSC52に対応させる
allow_osc52=true

これで、tmuxのコピーモードでコピーした内容がクリップボードにも渡されます。

PRIMARYをCLIPBOARDと同期させる

X環境はコピペのためにPRIMARY、SECONDARY、CLIPBOARDと3つもバッファを持っています。mltermはPRIMARYしか使っていないのですが、PRIMARYはペーストに中クリックしか使えなかったり不便極まりないので、CLIPBOARDにもその内容を同期させます。

同期には autocutsel というツールを使います。

sigmike/autocutsel

debianやArchLinuxではパッケージになっているようですので、比較的簡単に導入できるかと思います。

インストールが完了したら、.xinitrcあたりに以下のように書いといて autocutsel による同期が自動的に始まるようにしておきます。

if [ -x /usr/bin/autocutsel ]; then
    autocutsel -selection CLIPBOARD -fork
    autocutsel -selection PRIMARY -fork
fi

これでまたひとつマウスが文鎮に近づきました。

Appendix:Emacsとクリップボードバッファ

EmacsでPRIMARY、CLIPBOARDにコピーするには次のようにしておくと良いみたいですよ。

(setq x-select-enable-clipboard t)
(setq x-select-enable-primary t))