Terminal

在 tmux 和剪貼板之間複製/粘貼文本選擇

  • April 5, 2019

我正在執行最新版本的 tmux(來自 git 儲存庫)和 xclip(0.12),我希望能夠使用類似 Emacs 的鍵盤綁定來移動文本copy-mode,複製(M-w)選擇到剪貼板,並且將( C-y) 從/到複製緩衝區粘貼到剪貼板。

到目前為止,我已經能夠使用 粘貼文本C-y,並copy-mode使用類似 Emacs 的鍵盤綁定移動,但我仍然無法從 tmux 緩衝區復製文本(例如在 中copy-mode

我發現這個執行緒用於將整個緩衝區復製到剪貼板(反之亦然),但它似乎對我不起作用。

此外,在tmux-users郵件列表中,我被告知最近版本的 tmux(僅在 git repo 中)提供了一個名為copy-pipe. 手冊頁對此命令進行了以下說明:

一個命令接受一個參數,copy-pipe,它複製選擇並將其通過管道傳遞給命令。例如,以下將綁定“C-q”以將選擇複製到 /tmp 以及粘貼緩衝區:

       bind-key -temacs-copy C-q copy-pipe "cat >/tmp/out"

它看起來像是copy-pipe部分用於將選擇傳遞給另一個命令。此描述和命令中似乎也有一些錯別字(什麼是temacs-copy?)

無論哪種方式,我想做的是:

複製:

  1. 進入複製模式
  2. C-f使用 Emacs 導航命令(即, C-b, M-f, M-b,C-aC-e移動游標)移動到我要複製的文本。這些都沒有前綴
  3. 將所選文本複製到剪貼板中:(M-w沒有前綴

粘貼:

  1. 我希望能夠鍵入C-y無需輸入copy-mode)以在終端中粘貼文本(也沒有前綴

我嘗試了以下方法進行複制但沒有運氣:

bind-key -n M-w run "tmux save-buffer - | xclip -i -selection clipboard" 

但是,粘貼效果很好:

bind-key -n C-y run "xclip -o | tmux load-buffer - ; tmux paste-buffer"

奇怪的是,我知道xclip -i -selection clipboard上面複製命令的“”部分執行良好,因為我可以在命令行中將內容複製到剪貼板,例如:

echo "Hello world. How are you?" | xclip -i -selection clipboard

有了這一切,我如何將選擇從複製模式複製到剪貼板?

在新版本的 tmux (1.8+) 中tmux.conf使用以下內容 :copy-pipe

set -g mouse on
# To copy:
bind-key -n -t emacs-copy M-w copy-pipe "xclip -i -sel p -f | xclip -i -sel c "

# To paste:
bind-key -n C-y run "xclip -o | tmux load-buffer - ; tmux paste-buffer"
  1. prefix+[進入複製模式
  2. 用滑鼠選擇內容(按住)
  3. M-w將該部分複製到系統剪貼板中
  4. C-y將其粘貼到 tmux 中,C-v以將其粘貼到其他正常應用程序(如 Web 瀏覽器)中。

請注意,使用 Tmux 2.4(自本次送出以來),綁定語法已更改。我轉述這個 Github 評論來簡要總結變化:

  1. 替換-t-T
  2. 替換vi-<name><name>-mode-vi
  3. 在命令前加上send-keys -X

我有:

bind-key -n -t vi-copy Enter copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'
bind-key -n -t vi-copy MouseDragEnd1Pane copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'

我需要更改為:

bind-key -n -T copy-mode-vi Enter send-keys -X copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'
bind-key -n -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'

變更日誌

鍵表發生了重大變化。模式鍵表不再與主鍵表分開。所有模式鍵表都已刪除,以及綁定鍵和取消綁定鍵的 -t 標誌。

emacs-edit、vi-edit、emacs-choose 和 vi-choose 表已被命令提示符和選擇模式中的固定鍵綁定替換。模式鍵和狀態鍵選項保留。

emacs-copy 和 vi-copy 表已被 copy-mode 和 copy-mode-vi 表替換。命令使用 -X 和 -N 標誌發送到發送鍵。所以以下內容:

bind -temacs-copy C-Up scroll-up
bind -temacs-copy -R5 WheelUpPane scroll-up

變成:

bind -Tcopy-mode C-Up send -X scroll-up
bind -Tcopy-mode WheelUpPane send -N5 -X scroll-up

這些更改允許使用完整的命令解析器(包括命令序列)和命令集 - 例如,具有編輯和歷史記錄的普通命令提示符現在用於搜尋、跳轉等,而不是自定義命令提示符。現在預設的 Cr 綁定是:

bind -Tcopy-mode C-r command-prompt -p'search up' "send -X search-backward-incremental '%%'"

send -X 還提供了一些新的命令,例如 copy-pipe-and-cancel。

引用自:https://unix.stackexchange.com/questions/67673