連結 tmux 與 x window 剪貼簿

tmux 有自己的剪貼簿 buffer,x window 也有自己的。 很討厭是在瀏覽器、emacs 或其它 x window 複製東西, 要貼到 terminal 要右鍵貼上。 terminal 設快捷鍵比較不方便, 所以就設在 tmux 裡,後來就干脆把二者連動。

之前用 gui 下的 emacs,剪貼簿通用真得方便。 之前有試過把 tmux 也互通,裝過幾個插件,都超難用。 都是另設一個鍵,用該鍵才會拷到 x window。 像 tmux-yank 是把游標所在行或整面拷過去, 但在我的環境一直不正常。

太天真的寫法

我後來就自己寫,其實蠻簡單的, 我用 run-shell 和直接呼叫 tmux 做, 好像有點越界,不過在只有單人使用的情況沒差。

tmux 複製是一個命令,呼叫後會存到 buffer。 原本綁在 C-s [ ,我就改成 C-s [ 執行二個命令, 執行完 copy-mode 再 run-shell 把 buffer 內容餵給 xsel。 paste 則反過來,在 paste 前先從 buffer 中讀取, 再從讀來的內容 paste。

也把原本的 capture-pane 加一行, 存起來後寫到 x clipboard 裡。

結果上面的寫法有個問題, copy-mode 這個指令執行後會進入 copy-mode, 然後就接著執行 run-shell 了, 不會等 copy-mode 退出。 所以 run 一定是吃到上次的 copy 的,吃不到這次的。

tmux 不簡單

於是又苦讀了 tmux man-page, 超長的,但也很詳細很好懂。

後來找到 copy-mode 裡的命令, 不知道為什麼那些沒詳細列出來, 總之把 copy-mode 裡的 Enter 從 copy-selection 換成 copy-pipe, 也就是除了複製外,還能 pipe 到命令。

然後還發現一個很潮的 hook 功能, 就把送到 xsel 從依序執行,改成 after 或 before hook 了。 分別是 before paste bufferafter capture pane

tmux 內 code 的重用

tmux 沒有函數, 所以類似的東西要寫很多次, 像 pttbackup 那幾個快捷鍵,內容大半重覆。 可能可以寫成 shell,用 run-shell 呼叫, 但還是不太方便。 等 tmux 會不會有新功能吧。