Це моя досить тривала відповідь, яка повинна виправити дві основні проблеми із використанням xclip для копіювання буфера з віддаленого (ssh) tmux сеансу:
1. Безвідповідальний xclip
Для мене @ Grauwolf в відповідь з xclip
не працює (робить tmux панель повністю несприйнятливі). Я дізнався, чому на сторінці Tmux у Вікі Arch :
xclip також може бути використаний для цієї мети, на відміну від xsel, він працює краще для друку сирої бітової лінії, яка не відповідає поточній локалі. Тим не менш, красивіше використовувати xsel замість xclip, оскільки xclip не закриває STDOUT після того, як він прочитав з буфера tmux. Таким чином, tmux не знає, що завдання з копіювання виконано, і продовжує чекати завершення xclip, тим самим виправляючи tmux невідповідальним. Вирішення проблеми полягає в переадресації STDOUT xclip на / dev / null
Отже, обов'язковість повинна бути:
bind-key C-y run "tmux save-buffer - | xclip -i -sel clip > /dev/null"
Тепер це спрацює, якщо ваш tmux сеанс локальний.
2. xclip не вдається підключитися до X
Якщо ви використовуєте tmux через ssh -X , є великі шанси, що це не буде працювати безпосередньо.
Це тому, що змінну оболонки $DISPLAY
потрібно правильно встановити.
Повне рішення
Тож для мене повним робочим рішенням є розміщення наступних рядків у моєму ~/.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
Для вставки з основного:
bind-key C-p run "xclip -d `tmux show-env | sed -n s/^DISPLAY=//p` -o | tmux load-buffer - && tmux paste-buffer"
Я не повністю розумію, чому $DISPLAY
неправильно встановлено під час пошуку .tmux.conf
, тому я маю витягнути це з tmux show-env
і sed
.
Якщо у вас tmux> = 1.8, ви можете адаптувати цю команду за допомогою 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'