Получение 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'

он ничего не делает, поэтому я предполагаю, что разделенное окно не нравится <<в команде оболочки.

Любые идеи?

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

110 голосов | спросил Digital Powers 28 J0000006Europe/Moscow 2011, 00:14:31

16 ответов


24

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

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. Я не знаю, как это решить.

ответил Gilles 28 J0000006Europe/Moscow 2011, 00:47:26
91

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

# 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"
ответил Grauwolf 10 J000000Sunday11 2011, 19:11:57
40

Более простое решение для 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

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

ответил docwhat 23 FebruaryEurope/MoscowbThu, 23 Feb 2012 07:37:07 +0400000000amThu, 23 Feb 2012 07:37:07 +040012 2012, 07:37:07
38

Команда 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.

ответил Tyler Holien 1 PMpMon, 01 Apr 2013 23:11:04 +040011Monday 2013, 23:11:04
14

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

ответил Bruno Sutic 28 PM00000040000001931 2014, 16:03:19
8

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

# 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.

ответил Ownatik 19 PMpThu, 19 Apr 2012 23:18:04 +040018Thursday 2012, 23:18:04
6

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

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

ответил Leif 2 PM000000110000004231 2012, 23:36:42
4

В 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

ответил jasonwryan 28 J0000006Europe/Moscow 2011, 00:51:23
4

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

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

Когда этот вопрос был впервые задан (июнь 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

Литература:

ответил Jason Axelson 9 SatEurope/Moscow2017-12-09T23:45:17+03:00Europe/Moscow12bEurope/MoscowSat, 09 Dec 2017 23:45:17 +0300 2017, 23:45:17
3

Решение для Mac OS X. Следуйте этим двум шагам:

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

  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'"

ответил Alex Gaudio 7 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 07 Sep 2011 07:45:18 +0400 2011, 07:45:18
3

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

Я также предпочитаю использовать системный буфер обмена (Ctrl-C, Ctrl-V) в дополнение к обычному клипболу primary для xclip (тот, который вы получаете с выбором мыши и средними щелчками мыши). Для выбора системного буфера обмена вам нужно передать аргумент -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"

UPDATE: Как-то с 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"
ответил Tuxdude 9 AMpTue, 09 Apr 2013 07:15:38 +040015Tuesday 2013, 07:15:38
3

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

1. Безответственный xclip

Для меня @ Grauwolf ответ с помощью xclip не работает (отображает tmux панель полностью безответственна). Я узнал, почему в странице Tmux вики-файла Arch:

  

xclip также может быть использован для этой цели, в отличие от xsel, он лучше работает при печати необработанного потока битов, который не соответствует текущему языку. Тем не менее, вместо xclip вместо xclip использовать xsel, потому что 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'
ответил PlasmaBinturong 29 MarpmWed, 29 Mar 2017 16:36:40 +03002017-03-29T16:36:40+03:0004 2017, 16:36:40
2
  

Я пытаюсь найти достойный способ скопировать то, что у меня есть в 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" 
ответил Hugo Heden 9 FebruaryEurope/MoscowbSat, 09 Feb 2013 03:36:37 +0400000000amSat, 09 Feb 2013 03:36:37 +040013 2013, 03:36:37
2

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

    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 в буфер tmux и отправляет его в xclip.
  • , чтобы на самом деле вставить его, мне нужно было снова указать, какой буфер обмена с -sel clip -o

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

ответил brianclements 11 J0000006Europe/Moscow 2014, 01:06:12
0

И улучшенная версия ответа @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.

ответил Javier López 5 J000000Sunday15 2015, 22:00:33
0

В OS-X с tmux версии 2.2 или новее будет работать следующее:

bind-key -t emacs-copy MouseDragEnd1Pane copy-pipe "pbcopy"
bind-key -t vi-copy MouseDragEnd1Pane copy-pipe "pbcopy"
ответил Kyle Kloepper 2 Maypm16 2016, 22:49:44

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132