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

<p>я пытаюсь найти достойный способ скопировать то, что у меня есть в буфере tmux, в буфер обмена. я пробовал пару разных вещей, как</p><pre><code>bind-key p select-pane -t 2 \; split-window 'xsel -i -b' \; paste-buffer </code></pre><p>что делает меня довольно близко, все, что мне нужно сделать, это нажать control-d после того, как я выполню префикс p.</p><p>я пытался исправить это, делая</p><pre><code>bind-key p select-pane -t 2 \; split-window 'xsel -i -b << here\; tmux paste-buffer\; echo here' </code></pre><p>но это просто не работает. на самом деле, если я соединю это до просто</p><pre><code>bind-key p select-pane -t 2 \; split-window 'xsel -i -b << here' </code></pre><p>он ничего не делает, поэтому я предполагаю, что split-window не нравится << в команде shell.</p><p>любые идеи?</p><p>правка: вы можете пропустить <code>select-pane -t 2</code> если хотите, это не очень важно. я просто использую конкретный макет, а панель 2 - это та, которую я предпочитаю разделять, когда я делаю что-то еще, чтобы по умолчанию в мои привязки включались разбиения.</p>

<p>здесь документы нуждаются в новых строках. например, в сценарии оболочки вы можете написать</p><pre><code>cat <<eof >somefile; echo done file contents eof </code></pre><p>я не думаю, что tmux позволяет вам помещать туда новые строки, и даже если бы это было так, это не было бы хорошим подходом. что если сами данные содержат <code>here</code> в одной строке (например, потому что вы копируете свой <code>.tmux.conf</code>)?</p><p>я предлагаю записать содержимое буфера во временный файл. непроверенные:</p><pre><code>bind-key p save-buffer ~/.tmux-buffer \; run-shell "xsel -i -b <~/.tmux-buffer && rm ~/.tmux-buffer" </code></pre><p>есть условие гонки, если вы используете эту команду в двух отдельных экземплярах tmux. я не знаю, как это решить.</p>

<p>это должно работать:</p><pre><code># 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" 

более простое решение для mac os-xэто основывается на ответе алекса и использует вещи, которых не было в то время.если вы используете <a href="http://mxcl.github.com/homebrew/">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.

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-mode, y скопирует этот текст в буфер tmux, а также в буфер обмена ос. однако, это не поможет, если вы хотите получить текст из буфера обмена в буфер tmux.

вы можете попробовать <a href="https://github.com/tmux-plugins/tmux-yank">плагин tmux-yank . это позволяет копировать прямо в системный буфер обмена (os x и linux) и некоторые другие полезности, такие как восстановление текущей строки shell.

вот попытка дать исчерпывающий ответ.сначала немного историикогда этот вопрос был впервые задан (июнь 2011 г.), копирование текста из tmux в буфер обмена должно было выполняться в два этапа: сначала скопируйте выделенный текст в буфер tmux, а затем скопируйте текст из буфера tmux в системный буфер обмена.в версии 1.8 (март 2013 г.) была добавлена команда copy-pipe, которая позволяет копировать выделенный текст прямо в системный буфер обмена (или в другое место назначения).затем в версии 2.4 (апрель 2017 г.) ключевые таблицы были значительно изменены, в результате чего многие ответы на этой странице устарели.отвечая на оригинальный вопрос<strong> linux </strong>: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" <strong> mac </strong>:если вы используете <a href="https://brew.sh/">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 есть основной и дополнительный буфер обмена (также известный как выбор).<strong> linux </strong>: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" <strong> mac </strong>: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, вам следует обратиться <a href="https://unix.stackexchange.com/a/354581/14252">https://unix.stackexchange.com/a/354581/14252   <strong> ссылки: </strong>  <a href="https://stackoverflow.com/a/21190234/175830">https://stackoverflow.com/a/21190234/1758  без > /dev/null копирование буфера tmux в буфер обмена заставит tmux не отвечать на ярлыки    <a href="https://unix.stackexchange.com/a/70798/14252">https://unix.stackexchange.com/a/70798/14252  настройки mac   

после попытки другого решения, вот моя окончательная настройка:# 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.

мне не нравятся дополнительные нажатия клавиш, поэтому я хотел что-то более амбициозное. войдите в режим копирования с помощью [ выделите нужный текст, а затем нажмите], чтобы скопировать текст в буфер обмена.кроме того, 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-]. это можно исправить с помощью некоторых дополнительных привязок, которые я себе представляю, но это делает то, что я хочу большую часть времени.

решение для mac os x. выполните следующие 2 шага:  используйте обходной путь криса джонсена: <a href="https://github.com/chrisjohnsen/tmux-macosx-pasteboard">https://github.com/chrisjohnsen/tmux-macosx-pasteboard    добавьте этот код в вашу конфигурацию 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'" </code></pre>

<p>это мой довольно длинный ответ, который должен решить две основные проблемы с использованием xclip для копирования буфера из удаленного (ssh) сеанса tmux:</p><h1>1. не отвечающий xclip</h1><p>для меня @ grauwolf's <a href="https://unix.stackexchange.com/a/16405/152329">ответ</a> с <code>xclip</code> не работает (делает панель tmux полностью безразличной). я узнал, почему в <a href="https://wiki.archlinux.org/index.php/tmux#x\_clipboard\_integration">страница tmux вики arch</a> :</p><blockquote> <p>xclip также может быть использован для этой цели, в отличие от xsel, он лучше работает при печати необработанных битовых потоков, которые не соответствуют текущей локали. тем не менее, лучше использовать xsel вместо xclip, поскольку xclip не закрывает stdout после чтения из буфера tmux. таким образом, tmux не знает, что задача копирования выполнена, и продолжает ждать завершения xclip, что делает tmux безразличным. обходной путь - <strong> перенаправить stdout xclip в/dev/null </strong></p> </blockquote><p>так что привязка должна быть:</p><pre><code>bind-key c-y run "tmux save-buffer - | xclip -i -sel clip > /dev/null" </code></pre><p>теперь это будет работать, если ваша сессия tmux локальная.</p><h1>2. xclip не может подключиться к x</h1><p><strong> если вы используете tmux вместо ssh -x </strong>, есть большие шансы, что <strong> не сработает </strong> напрямую.</p><p>это потому, что переменная shell <code>$display должен быть установлен правильно.комплексное решениепоэтому для меня <strong> полное рабочее решение </strong> состоит в том, чтобы поместить следующие строки в мой ~/.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</code> неправильно настроен во время поиска <code>.tmux.conf</code>, поэтому я должен извлечь его с помощью <code>tmux show-env</code> и <code>sed</code>.</p><p>если у вас tmux> = 1.8, вы можете адаптировать эту команду с помощью <code>copy-pipe</code>:</p><pre><code>bind-key -t vi-copy y copy-pipe 'xclip -in -selection clipboard -d `tmux show-env | sed -n s/^display=//p` >/dev/null' </code></pre>

<p>слегка измененный вариант принятого ответа, который я приготовил.</p><p>я также предпочитаю использовать системный буфер обмена (ctrl-c, ctrl-v) в дополнение к стандартному буферу обмена xclip <code>primary</code> (тот, который вы получаете при выборе мыши и средних нажатиях мыши). для выбора системного буфера обмена необходимо пройти <code>-selection clipboard</code> аргумент <code>xclip</code>.</p><p>также при копировании буфера в буфер обмена мне нравится возможность выбирать, какой буфер я хочу скопировать. это делается с помощью <code>choose-buffer</code> и затем передает буфер в аргумент <code>save-buffer</code> с помощью <code>-b %%</code>.</p><pre><code># 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" </code></pre><p><strong>pdate:</strong> почему-то с tmux 1.8 и двумя моими установками opensuse 12.2 я вижу зависание при <code>tmux run-shell</code> вызывается с <code>xclip</code> чтением из stdin по каналу. вместо этого я решил попробовать <code>xsel</code>, и это, похоже, работает. это эквивалентные привязки клавиш, использующие <code>xsel</code>. я также использовал <code>&&</code> для объединения команд в вставке для большей надежности.</p><pre><code># 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" </code></pre>

<p>в arch wiki есть решение, использующее <code>xclip</code>:</p><pre><code># move tmux copy buffer into x clipboard bind-key c-y save-buffer /tmp/tmux-buffer \; run-shell "cat /tmp/tmux-buffer | xclip"</code></pre><p> <a href="https://wiki.archlinux.org/index.php/tmux">https://wiki.archlinux.org/index.php/tmux</a> </p>

<p>многие из этих ответов не работали для моей ubuntu 14.04 на zsh как есть. не уверен, что моя shell как-то связана с этим, но вот моя рабочая версия использования <a href="https://unix.stackexchange.com/a/70798/43691">эта стратегия</a> для копирования и <a href="https://unix.stackexchange.com/a/36896/43691">эта стратегия</a> для вставки.</p><pre><code> 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" </code></pre><p>некоторые заметки:</p><ul> <li>для copy-pipe мне нужно было указать свой буфер обмена с помощью <code>-sel clip -i</code>. эта строка объединяет буфер yank to tmux и отправляет его в xclip.</li> <li>чтобы на самом деле вставить его, мне нужно было снова указать, какой буфер обмена с <code>-sel clip -o</code></li> </ul><p>теперь это прекрасно работает для моей установки vim/zsh/tmux.</p>

<blockquote> <p>я пытаюсь найти достойный способ скопировать то, что у меня есть в буфере tmux, в буфер обмена. я пробовал пару разных вещей, как</p> </blockquote><p>для привязок в стиле emacs есть несколько разных опций. (должен ли стиль vi быть похожим?) типичная привязка для выполнения "выбора копии" в emacs - это m-w, поэтому было бы очень удобно иметь такую же привязку в tmux.</p><p>1 - было бы идеально, но не работает (из-за ограничения tmux?)</p><pre><code>unbind-key -t emacs-copy m-w bind-key -t emacs-copy m-w copy-selection\; \ run-shell "tmux save-buffer - | xsel --input --clipboard" </code></pre><p>2 - <strong>компромисс, который хорошо работает для меня</strong>: принять использование другой привязки клавиш для emacs-copy в tmux. используйте, например, c-m-w. (это связывание, которое будет определено "глобально" - не только в режиме копирования - но и только в режиме копирования)</p><pre><code>bind-key -n c-m-w send-keys m-w\; \ run-shell "tmux save-buffer - | xsel --input --clipboard" </code></pre>

<p>и улучшенная версия ответа @leif может быть:</p><pre><code>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\"" </code></pre><p>таким образом, нет никаких последствий, если вы выйдете из режима копирования другим способом, кроме], приведенный выше код обернут в <a href="https://github.com/chilicuil/tundle-plugins/tree/master/tmux-yank">tundle/tmux-yank</a> плагин tmux для копирования текста tmux в системный буфер обмена, он предназначен tmux> = 1.6 на os x и linux.</p>

<p>на os-x с версией 2.2 tmux или позже будет работать следующее:</p><pre><code>bind-key -t emacs-copy mousedragend1pane copy-pipe "pbcopy" bind-key -t vi-copy mousedragend1pane copy-pipe "pbcopy" </code></pre>

<p>я использую <a href="https://hluk.github.io/copyq/"><code>copyq</code></a> многострочный менеджер буфера обмена. (работает с windows, osx, linux.)</p><ul> <li> <p>добавьте следующие строки в <code>~/.tmux.conf</code>:</p> <pre><code>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" </code></pre></li> </ul>