tmux 支持鼠标,甚至支持选一段东西之后自动发给剪贴板。这个功能很好用,比如在想从终端贴一段文字到浏览器的时候之类……
然而这个功能有时候需要一些配置。折腾一波之后,发现主要是这么几个部分:
首先 tmux 需要打开鼠标支持,并且让它在复制完之后去设置剪贴板:
set -g mouse on
set -g set-clipboard on
然而这并没完。所谓“设置剪贴板”,其实就是发一段东西给外面的终端模拟器(tmux 归根结底只是发各种东西给终端模拟器而已……),说“设置剪贴板为XXX”。这段东西就是OSC 52。OSC就是“operating system command”,就是某种终端控制序列,用来和系统交互的…… OSC 52 就是里面的命令52,功能是设置剪贴板。
然而 tmux 其实依赖某些信息来告诉他“外面这个终端模拟器支持OSC 52”。这个就是 terminfo 里面的 Ms 能力(属性?)。这个告诉了 tmux,要设置剪贴板应该发什么格式的东西给终端模拟器。
然而我现在用的 term(st-256color)里面貌似并没有这个…… 结果就是就算开了上面这俩,tmux 也不干活。
正确的修正方法当然是把那个属性加进 terminfo,但是这个挺麻烦的,而且每个系统都要加…… 理想状况下我可以只用 tmux.conf 解决问题。
解决方法当然是有的:直接在 tmux.conf 里面修改 terminfo 给的结果…… 所以可以直接告诉 tmux,对某些 terminal(我这里是st*),设置剪贴板就发这个:
set -g terminal-overrides[2] 'st*:XT:Ms=\E]52;%p1%s;%p2%s\007'
我其实还添加了 Tc,所以怎么样都认为支持24位色…… 不过这就是另一个事情了。
搞了这俩之后,tmux 就会发送 OSC 52 了。
最后还有终端模拟器收到这个之后需要设置剪贴板。我现在用的 suckless terminal 是支持的(虽然默认 buffer 大小比较小,所以长一点的文字会被截断,不知道修了没……)。很多别的也是支持的……
这么搞剪贴板支持有如下好处:
1. 远程也能用
ssh 过去之后,选一段东西,也能够很好的复制进本地的剪贴板里面,因为一路传回来了。如果是在 tmux 里面用一个脚本处理鼠标事件之类可能就不行。
2. 分栏也能用
如果用终端模拟器自己的复制功能,那 tmux 分栏的时候就会复制一堆啥分栏符之类的进去。用 tmux 自己的鼠标支持就没这个问题。
3. 简单
只要随便搞几行 config 就完了,不像某些剪贴板支持搞法那么麻烦,又是 binding 又是脚本的……