Đây là câu trả lời khá dài của tôi nên khắc phục hai vấn đề lớn khi sử dụng xclip để sao chép bộ đệm từ phiên tmux (ssh) từ xa:
1. Xclip vô trách nhiệm
Đối với tôi @ Grauwolf của câu trả lời với xclip
đã không làm việc (renders tmux pane hoàn toàn irresponsive). Tôi đã tìm hiểu tại sao trong trang Tmux của Arch wiki :
xclip cũng có thể được sử dụng cho mục đích đó, không giống như xsel, nó hoạt động tốt hơn trong việc in dòng bit thô không phù hợp với ngôn ngữ hiện tại. Tuy nhiên, sẽ gọn gàng hơn khi sử dụng xsel thay vì xclip, vì xclip không đóng STDOUT sau khi nó đã đọc từ bộ đệm của tmux. Như vậy, tmux không biết rằng tác vụ sao chép đã hoàn thành và tiếp tục chờ kết thúc của xclip, do đó khiến tmux không phản hồi. Cách giải quyết là chuyển hướng STDOUT của xclip sang / dev / null
Vì vậy, các ràng buộc nên là:
bind-key C-y run "tmux save-buffer - | xclip -i -sel clip > /dev/null"
Bây giờ, điều này sẽ hoạt động nếu phiên tmux của bạn là cục bộ.
2. xclip không thể kết nối với X
Nếu bạn đang sử dụng tmux trên ssh -X , có nhiều khả năng điều này sẽ không hoạt động trực tiếp.
Đó là bởi vì biến shell $DISPLAY
cần được đặt đúng.
Giải pháp hoàn chỉnh
Vì vậy, đối với tôi, giải pháp làm việc hoàn chỉnh là đặt các dòng sau vào ~/.tmux.conf
:
set-option -g update-environment "DISPLAY"
bind-key C-y run "export DISPLAY=`tmux show-env | sed -n 's/^DISPLAY=//p'`; tmux save-buffer - | xclip -i -selection clipboard >/dev/null"
# Or more concise:
bind-key C-y run "tmux save-buffer - | xclip -i -selection clipboard -d `tmux show-env | sed -n 's/^DISPLAY=//p'` >/dev/null
Để dán từ chính:
bind-key C-p run "xclip -d `tmux show-env | sed -n s/^DISPLAY=//p` -o | tmux load-buffer - && tmux paste-buffer"
Tôi hoàn toàn không hiểu tại sao $DISPLAY
không được đặt chính xác trong khi tìm nguồn cung ứng .tmux.conf
, vì vậy đây là lý do tại sao tôi phải giải nén nó với tmux show-env
và sed
.
Nếu bạn có tmux> = 1.8, bạn có thể điều chỉnh lệnh này bằng copy-pipe
:
bind-key -t vi-copy y copy-pipe 'xclip -in -selection clipboard -d `tmux show-env | sed -n s/^DISPLAY=//p` >/dev/null'