it-swarm-ru.tech

Получение tmux для копирования буфера в буфер обмена

Я пытаюсь найти достойный способ скопировать то, что у меня есть в буфере tmux, в буфер обмена. Я пробовал пару разных вещей, как

bind-key p select-pane -t 2 \; split-window 'xsel -i -b' \; paste-buffer

что делает меня довольно близко, все, что мне нужно сделать, это нажать control-d после того, как я выполню префикс p.

Я пытался исправить это, делая

bind-key p select-pane -t 2 \; split-window 'xsel -i -b << HERE\; tmux paste-buffer\; echo HERE'

Но это просто не работает. На самом деле, если я соединю это до просто

bind-key p select-pane -t 2 \; split-window 'xsel -i -b << HERE'

он ничего не делает, поэтому я предполагаю, что split-window не нравится << в команде Shell.

Любые идеи?

Правка: Вы можете пропустить select-pane -t 2 если хотите, это не очень важно. Я просто использую конкретный макет, а панель 2 - это та, которую я предпочитаю разделять, когда я делаю что-то еще, чтобы по умолчанию в мои привязки включались разбиения.

121
Digital Powers

Здесь документы нуждаются в новых строках. Например, в сценарии оболочки вы можете написать

cat <<EOF >somefile; echo  done
file contents
EOF

Я не думаю, что tmux позволяет вам помещать туда новые строки, и даже если бы это было так, это не было бы хорошим подходом. Что если сами данные содержат HERE в одной строке (например, потому что вы копируете свой .tmux.conf)?

Я предлагаю записать содержимое буфера во временный файл. Непроверенные:

bind-key p save-buffer ~/.tmux-buffer \; run-Shell "xsel -i -b <~/.tmux-buffer && rm ~/.tmux-buffer"

Есть условие гонки, если вы используете эту команду в двух отдельных экземплярах tmux. Я не знаю, как это решить.

26
Gilles 'SO- stop being evil'

Это должно работать:

# move x clipboard into tmux paste buffer
bind C-p run "tmux set-buffer \"$(xclip -o)\"; tmux paste-buffer"
# move tmux copy buffer into x clipboard
bind C-y run "tmux save-buffer - | xclip -i"
94
Grauwolf

Более простое решение для Mac OS-X

Это основывается на ответе Алекса и использует вещи, которых не было в то время.

Если вы используете homebrew (а если нет, то почему не так?), Тогда вы можете просто сделать это:

brew install reattach-to-user-namespace

Тогда в вашем ~/.tmux.conf:

set-option -g default-command "reattach-to-user-namespace -l zsh" # or bash...
bind C-c run "tmux save-buffer - | reattach-to-user-namespace pbcopy"
bind C-v run "reattach-to-user-namespace pbpaste | tmux load-buffer - && tmux paste-buffer"

Чтобы скопировать буфер из tmux (вы уже должны были что-то скопировать с помощью tmux) в монтажный карт Mac, используйте <tmux-key> Control-c. Теперь он будет доступен для Command-v или pbpaste

Чтобы вставить что-нибудь из Macboard, используйте <tmux-key> Control-v.

41
docwhat

copy-pipe команда была добавлена ​​начиная с версии 1.8. Он копирует выделение в буфер tmux и передает его команде. Теперь нет необходимости в привязке префикса. Вот пример:

bind -t vi-copy y copy-pipe "xclip"

# For OS X users:
bind -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"

Теперь, когда у вас есть текст, выделенный в copy-modey скопирует этот текст в буфер tmux, а также в буфер обмена ОС. Однако, это не поможет, если вы хотите получить текст из буфера обмена в буфер tmux.

40
Tyler Holien

Вы можете попробовать плагин tmux-yank . Это позволяет копировать прямо в системный буфер обмена (OS X и Linux) и некоторые другие полезности, такие как восстановление текущей строки Shell.

16
user80379

Вот попытка дать исчерпывающий ответ.

Сначала немного истории

Когда этот вопрос был впервые задан (июнь 2011 г.), копирование текста из Tmux в буфер обмена должно было выполняться в два этапа: сначала скопируйте выделенный текст в буфер Tmux, а затем скопируйте текст из буфера Tmux в системный буфер обмена.

В версии 1.8 (март 2013 г.) была добавлена ​​команда copy-pipe, которая позволяет копировать выделенный текст прямо в системный буфер обмена (или в другое место назначения).

Затем в версии 2.4 (апрель 2017 г.) ключевые таблицы были значительно изменены, в результате чего многие ответы на этой странице устарели.

Отвечая на оригинальный вопрос

Linux :

bind-key C-y run-Shell "tmux save-buffer - | xclip -i -r > /dev/null" \; display-message "Copied tmux buffer to selection"
bind-key C-Y run-Shell "tmux save-buffer - | xclip -i -r -selection clipboard > /dev/null" \; display-message "Copied tmux buffer to clipboard"
bind-key C-p run-Shell "xclip -o | tmux load-buffer - ; tmux paste-buffer"

Mac :

Если вы используете homebrew , то вам следует установить reattach-to-user-namespace, выполнив в терминале следующую команду:

brew install reattach-to-user-namespace

Затем в вашем ~/.tmux.conf:

bind-key C-y run-Shell "tmux save-buffer - | reattach-to-user-namespace pbcopy" \; display-message "Copied tmux buffer to clipboard"
bind-key C-p run-Shell "reattach-to-user-namespace pbpaste | tmux load-buffer - ; tmux paste-buffer"

Более короткий метод (скопируйте и вставьте выделение прямо из буфера обмена в tmux> 2.4 и обратно)

Примечание: есть две версии для Linux, потому что у Linux есть основной и дополнительный буфер обмена (также известный как выбор).

Linux :

bind-key -T copy-mode-vi y send-keys -X copy-pipe "xclip -r" \; display-message "Copied to selection"
bind-key -T copy-mode-vi Y send-keys -X copy-pipe "xclip -r -selection clipboard" \; display-message "Copied to clipboard"
bind-key C-p run-Shell "xclip -o | tmux load-buffer - && tmux paste-buffer"

Mac :

bind-key -T copy-mode-vi y send-keys -X copy-pipe "reattach-to-user-namespace pbcopy" \; display-message "Copied to clipboard"

Настройка этих команд

  • Если вы не хотите, чтобы команда сообщала вам, что она сделала в строке состояния, просто удалите display-message (а также \;, который стоит перед ней).

  • Если вы используете режим копирования в стиле Emacs вместо vi, замените любой экземпляр copy-mode-vi просто copy-mode

  • Если вы работаете в Linux и хотите использовать xsel вместо xclip, замените xclip -r на xsel -i -p и ​​xclip -o на xsel -o -p

  • -r в xclip -r является необязательным, оно удаляет последний символ новой строки. Это полезно для копирования команд, тогда, когда вы вставите их, они не будут немедленно выполнены.

  • Если вы туннелируете по SSH, вам следует обратиться https://unix.stackexchange.com/a/354581/14252

Ссылки:

10
Jason Axelson

После попытки другого решения, вот моя окончательная настройка:

# move x clipboard into tmux paste buffer
bind C-p run "xclip -o | tmux load-buffer -
# move tmux copy buffer into x clipboard
bind C-y run "tmux save-buffer - | xclip -i -selection clipboard"

использование save-buffer вместо show-buffer дает реальные данные без данных, как показано с переносами строк, когда вы находитесь в разбиениях.

Я также использую это, чтобы начать выделение/копирование в режиме копирования tmux:

bind-key -t vi-copy 'v' begin-selection
bind-key -t vi-copy 'y' copy-selection

Я предполагаю, что можно было бы объединить выделенную копию с клавишей 'y' и переместить ее в буфер обмена x.

9
Ownatik

Мне не нравятся дополнительные нажатия клавиш, поэтому я хотел что-то более амбициозное. Войдите в режим копирования с помощью [ выделите нужный текст, а затем нажмите], чтобы скопировать текст в буфер обмена.

Кроме того, tmux любит включать переносы в выражениях, которые переносятся (и, как ни странно, эти переносы находятся в неправильном месте! Они не там, где выражение переносится на экран). Поэтому я хотел, чтобы C-] скопировал выражение, удалив символы новой строки.

На tmux 1.6 я попробовал это:

bind [ copy-mode
bind -t vi-copy ] run "tmux send-keys Enter; tmux show-buffer | xclip -i -selection clipboard;"
bind -t vi-copy C-] run "tmux send-keys Enter; tmux show-buffer | Perl -pe 's/\n//' | xclip -i -selection clipboard;"

но это не сработало, потому что tmux не рад связывать сложные вещи с таблицей vi-copy. Так что в итоге я сделал это вместо:

bind [ copy-mode \;                                                        \
    bind -n ] run                                                          \
    "tmux send-keys Enter;                                                 \
     tmux show-buffer | xclip -i -selection clipboard;                     \
     tmux unbind -n C-];                                                   \
     tmux unbind -n ]" \;                                                  \
    bind -n C-] run                                                        \
    "tmux send-keys Enter;                                                 \
     tmux show-buffer | Perl -pe 's/\n//' | xclip -i -selection clipboard; \
     tmux unbind -n C-];                                                   \
     tmux unbind -n ]"

Это приводит к странным вещам (] или C-] будет выглядеть забавно при следующем использовании, но только один раз), если вы выйдете из режима копирования другим способом, кроме] или C-]. Это можно исправить с помощью некоторых дополнительных привязок, которые я себе представляю, но это делает то, что я хочу большую часть времени.

7
Leif

Решение для Mac OS X. Выполните следующие 2 шага:

  1. Используйте обходной путь Криса Джонсена: https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard

  2. Добавьте этот код в вашу конфигурацию tmux (~/.tmux.conf)

# paste clipboard into tmux buffer
bind v run-Shell "reattach-to-user-namespace -l zsh -c 'tmux set-buffer \\"$(pbpaste)\\"; tmux paste-buffer'"
# put tmux buffer into x clipboard
bind y run-Shell "reattach-to-user-namespace -l zsh -c 'tmux show-buffer | pbcopy'"
4
Alex Gaudio

Это мой довольно длинный ответ, который должен решить две основные проблемы с использованием xclip для копирования буфера из удаленного (ssh) сеанса tmux:

1. Не отвечающий xclip

Для меня @ Grauwolf's ответ с 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 , есть большие шансы, что не сработает напрямую.

Это потому, что переменная Shell $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'
4
PlasmaBinturong

Слегка измененный вариант принятого ответа, который я приготовил.

Я также предпочитаю использовать системный буфер обмена (Ctrl-C, Ctrl-V) в дополнение к стандартному буферу обмена xclip primary (тот, который вы получаете при выборе мыши и средних нажатиях мыши). Для выбора системного буфера обмена необходимо пройти -selection clipboard аргумент xclip.

Также при копировании буфера в буфер обмена мне нравится возможность выбирать, какой буфер я хочу скопировать. Это делается с помощью choose-buffer и ​​затем передает буфер в аргумент save-buffer с помощью -b %%.

# Copy into clipboard
bind C-c choose-buffer "run \"tmux save-buffer -b %% - | xclip -i -selection clipboard\""
# Paste from clipboard
bind C-v run "xclip -o -selection clipboard | tmux load-buffer - ; tmux paste-buffer"
# Copy into primary
bind C-y choose-buffer "run \"tmux save-buffer -b %% - | xclip -i \""
# Paste from primary
bind C-p run "xclip -o | tmux load-buffer - ; tmux paste-buffer"

PDATE: Почему-то с tmux 1.8 и двумя моими установками openSUSE 12.2 я вижу зависание при tmux run-Shell вызывается с xclip чтением из stdin по каналу. Вместо этого я решил попробовать xsel, и это, похоже, работает. Это эквивалентные привязки клавиш, использующие xsel. Я также использовал && для объединения команд в вставке для большей надежности.

# Copy into clipboard
bind C-c choose-buffer "run \"tmux save-buffer -b '%%' - | xsel -i -b\""
# Paste from clipboard
bind C-v run "xsel -o -b | tmux load-buffer - && tmux paste-buffer"
# Copy into primary
bind C-y choose-buffer "run \"tmux save-buffer -b '%%' - | xsel -i\""
# Paste from primary
bind C-p run "xsel -o | tmux load-buffer - && tmux paste-buffer"
4
Tuxdude

В Arch Wiki есть решение, использующее xclip:

# move tmux copy buffer into x clipboard
bind-key C-y save-buffer /tmp/tmux-buffer \; run-Shell "cat /tmp/tmux-buffer | xclip"

https://wiki.archlinux.org/index.php/Tmux

4
jasonwryan

Многие из этих ответов не работали для моей Ubuntu 14.04 на zsh как есть. Не уверен, что моя Shell как-то связана с этим, но вот моя рабочая версия использования эта стратегия для копирования и эта стратегия для вставки.

    bind-key -t vi-copy 'v' begin-selection
    bind-key -t vi-copy 'y' copy-pipe "xclip -sel clip -i"
    bind-key ] run-Shell "xclip -sel clip -o | tmux load-buffer - ; tmux paste-buffer" 

Некоторые заметки:

  • для copy-pipe мне нужно было указать свой буфер обмена с помощью -sel clip -i. Эта строка объединяет буфер yank to tmux и отправляет его в xclip.
  • чтобы на самом деле вставить его, мне нужно было снова указать, какой буфер обмена с -sel clip -o

Теперь это прекрасно работает для моей установки vim/zsh/tmux.

3
brianclements

Я пытаюсь найти достойный способ скопировать то, что у меня есть в буфере tmux, в буфер обмена. Я пробовал пару разных вещей, как

Для привязок в стиле Emacs есть несколько разных опций. (Должен ли стиль Vi быть похожим?) Типичная привязка для выполнения "выбора копии" в emacs - это M-w, поэтому было бы очень удобно иметь такую ​​же привязку в tmux.

1 - было бы идеально, но не работает (из-за ограничения tmux?)

unbind-key -t emacs-copy M-w
bind-key -t emacs-copy M-w copy-selection\; \
  run-Shell "tmux save-buffer - | xsel --input --clipboard"

2 - Компромисс, который хорошо работает для меня: Принять использование другой привязки клавиш для emacs-copy в tmux. Используйте, например, C-M-W. (Это связывание, которое будет определено "глобально" - не только в режиме копирования - но и только в режиме копирования)

bind-key -n C-M-w send-keys M-w\; \
 run-Shell "tmux save-buffer - | xsel --input --clipboard" 
3
Hugo Heden

И улучшенная версия ответа @Leif может быть:

tmux bind-key '[' run "tmux copy-mode;
tmux bind-key -n ']' run \"tmux send-keys Enter; tmux save-buffer - | xclip -i -selection clipboard;
tmux unbind-key -n ']'\";
tmux bind-key -n q run \"tmux unbind -n ']'; tmux send-keys q\";
tmux bind-key -n C-c run \"tmux unbind -n ']'; tmux send-keys C-c\""

Таким образом, нет никаких последствий, если вы выйдете из режима копирования другим способом, кроме], приведенный выше код обернут в tundle/tmux-yank плагин tmux для копирования текста tmux в системный буфер обмена, он предназначен tmux> = 1.6 на OS X и Linux.

1
Javier López

На OS-X с версией 2.2 tmux или позже будет работать следующее:

bind-key -t emacs-copy MouseDragEnd1Pane copy-pipe "pbcopy"
bind-key -t vi-copy MouseDragEnd1Pane copy-pipe "pbcopy"
1
Kyle Kloepper

Я использую copyq многострочный менеджер буфера обмена. (Работает с Windows, OSX, Linux.)

  • Добавьте следующие строки в ~/.tmux.conf:

    set-window-option -g mode-keys vi
    bind C-y run 'out=`tmux save-buffer - ` && copyq add "$out"'
    
  • cygwin требует copyq.exe расположение в ~/.bashrc:

    export PATH="$PATH:/cygdrive/c/Program Files (x86)/CopyQ"
    
1
Oleg Svechkarenko