tmux xclip copy больше не работает


8

На mu Ubuntu 12.04 мои команды копирования и вставки в буфер обмена tmux настроены следующим образом:

set -g prefix M-a
unbind C-b
bind C-c run "tmux save-buffer - | xclip -i -sel clipboard"
bind C-v run "tmux set-buffer \"$(xclip -o -sel clipboard)\"; tmux paste-buffer"

Это прекрасно работало в течение самого долгого времени, примерно месяц назад, когда я подозреваю, что было сделано какое-то изменение конфигурации или изменение пакета, что нарушило вышесказанное. В терминале GNOME вставка по-прежнему работает нормально с prefix+ ctrl-vи ctrl-shift-v.

Однако команда xclipcopy больше не работает, независимо от того, что я делаю, и я попытался удалить приведенную выше привязку пользовательского префикса, используя -selectвместо -sel, не используя clipboardи т. Д. Это в значительной степени ограничитель показа для пользователя GVim, такого как я, так как я не t даже есть обходной путь для терминала GNOME, ctrl-shift-cкогда tmux берет на себя оболочку. Я вхожу в режим копирования, выбираю текст с space+ movement, и когда я выполняю prefix+ ctrl-cабсолютно ничего не происходит. До того, как это сломалось, tmux отображал подтверждающее сообщение в разделе уведомлений внизу.

У кого-нибудь есть предложения относительно того, как можно это отладить? Это довольно большой удар по производительности. Я, возможно, пока могу использовать временную уловку с временным файлом , но было бы здорово узнать, что случилось xclip.


Xclip действительно доступен? Какой выход type xclip?
Крис Даун

Вывод: «xclip - это / usr / bin / xclip». Как я уже упоминал, вставка через xclip работает просто отлично по любой причине.
Александр Курилин

1
У вас есть такая же проблема xsel -b?
Жиль "ТАК - перестань быть злым"

@ Жиль, xsel -i -bпохоже , делает свое дело!
Александр Курилин

Хех. Я понятия не имею, почему это работает, подумал я xsel -bи xclip -selection clipboardсделал бы то же самое!
Жиль "ТАК - перестань быть злым"

Ответы:


9

xselУтилита аналогична xclip, но реализовано немного по- другому. Обычно я ожидал бы, что они будут вести себя одинаково, но они не будут делать точно один и тот же вызов библиотеки X, поэтому возможно, что в некоторых угловых случаях xselбудет работать, но не будет xclip, или наоборот. Пытаться:

bind C-c run "tmux save-buffer - | xsel -ib"
bind C-v run "tmux set-buffer \"$(xsel -ob)\"; tmux paste-buffer"

Тот же результат - не работает для меня - работает как отдельная команда, но возвращает пустую строку из такой привязки; Ubuntu 14.04, xsel 1.2.0, tmux 1.8-5
Виталий Зданевич

6

Добавление -bв run-shell(или run) команду решило проблему. С помощью -bкоманды shell запускается в фоновом режиме.

bind C-c run-shell -b "tmux save-buffer - | xclip -i -sel clipboard"


2

Хотя я больше не могу воспроизвести это, но вот технический ответ, что могло произойти в вашем случае.

Во-первых, вам нужно понять, как работает буфер обмена X11. Вы можете прочитать эссе jwz по этому адресу : http://www.jwz.org/doc/x-cut-and-paste.html

Короче говоря, приложение, которое содержит содержимое буфера обмена, должно запускаться, пока другое приложение не подтвердит право собственности. Поэтому, когда вы запускаете, xclip -i <<< testвы можете видеть, как xclip работает в фоновом режиме, пока вы не сделаете другой выбор:

$ xclip -i <<< test
$ ps
  PID TTY          TIME CMD
10166 pts/8    00:00:00 xclip
10171 pts/8    00:00:00 ps
19345 pts/8    00:00:00 bash

Теперь все в порядке, но когда вы выходите из этой оболочки, все процессы, принадлежащие этому сеансу, по умолчанию останавливаются, посылая им сигнал HUP. Это будет означать, что xclip будет убит, и вы больше не сможете получить доступ к содержимому буфера обмена.

Таким образом, предлагаемый обходной путь (если у вас нет xsel) - игнорировать сигнал HUP, используя следующую привязку:

bind C-c run "tmux save-buffer - | nohup >/dev/null 2>/dev/null xclip -i -sel clipboard"

xselЭта проблема не затрагивается, потому что первое, что он делает после fork (), - отсоединяется от управляющего терминала, чтобы он не получал сигнал HUP при выходе из своей оболочки (вы даже не увидите его в приведенном выше ps). вывод, но только когда вы делаете ps -e | grep xsel).


1

У меня похожая проблема, и я боюсь, что временный файл не поможет в этом конкретном случае. Это связано с тем xclip, что при вызове tmux он ведет себя иначе, чем при интерактивном запуске, и ожидает, пока другое приложение не станет владельцем области буфера обмена. Попробуйте использовать, xclip -l 1чтобы немедленно завершить работу (подробности см. На странице руководства).


Не могу заставить эту работу работать. Вот как должна выглядеть эта привязка: bind Cc run "tmux save-buffer - | xclip -l 1 -i -sel clipboard"?
Александр Курилин

Не могли бы вы опубликовать, какой обходной путь работал для вас? Это было бы очень полезно!
Александр Курилин

Я использую bind C-y run-shell "tmux save-buffer - | xclip -l 1 -i".
Петер

Да, все еще ничего, к сожалению. Tmux ничего не сообщает и xclip.
Александр Курилин

Для меня это тоже ничего не сообщает, но это работает. Проверьте, что xclipпроисходит, когда вы пытаетесь скопировать буфер. Если он там висит и ждет чего-то, поможет ли его убийство? Кроме того, вы должны выйти из режима выбора, нажав Enter (и, следовательно, сохранив его в буфере), прежде чем пытаться скопировать буфер в буфер обмена X.
Петер

1

Это старый вопрос, но я подозреваю, что у меня есть решение, взятое со страницы Tmux вики Arch :

xclip также может быть использован для этой цели, в отличие от xsel, он лучше работает при печати необработанных битовых потоков, которые не соответствуют текущей локали. Тем не менее, лучше использовать xsel вместо xclip, поскольку xclip не закрывает STDOUT после чтения из буфера tmux. Таким образом, tmux не знает, что задача копирования выполнена, и продолжает ждать завершения xclip, что делает tmux безразличным. Обходной путь - перенаправить STDOUT xclip в / dev / null.

Итак, ваша команда должна стать:

bind C-c run "tmux save-buffer - | xclip -i -sel clipboard >/dev/null"

0

Это рабочая конфигурация, которую я использую:

# Yank to copy text with y.
bind-key -t vi-copy y copy-pipe "tmux save-buffer - | xclip -sel clipboard -i"

# Update default binding of `Enter` to also copy with this method.
unbind -t vi-copy Enter
bind-key -t vi-copy Enter copy-pipe "tmux save-buffer - | xclip -sel clipboard -i"

# Toggle rectangular copy mode.
bind-key -t vi-copy 'C-v' rectangle-toggle

# Bind ']' to paste.
bind ] run "tmux set-buffer \"$(xclip -o -sel clipboard)\" && tmux paste-buffer"

# Toggle rectangular copy mode.
bind-key -t vi-copy 'C-v' rectangle-toggle

# http://askubuntu.com/a/507215/413683
set -g set-clipboard off
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.