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

Как насчет того, чтобы включить строку /etc/hosts переопределение соответствующих адресов? например,

130.89.149.226  ftp.debian.org      
195.20.242.89   security.debian.org 
119
06.09.2016, 14:11
16 ответов

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

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
27.01.2020, 19:29
  • 1
    Спасибо работает отлично, состояние состязания не является беспокойством обо мне, я только использую 1 сессию. –  Digital Powers 27.06.2011, 23:53
  • 2
    Для предотвращения состояния состязания я предложил бы использовать mktemp который является широко доступным –  Grief 08.07.2016, 22:40
  • 3
    @Grief Хорошая идея. В этом случае использование PID процесса tmux работало бы также и вероятно будет легче расположить ($PPID в оболочке, запущенной tmux). Но как Вы получаете переменное имя файла (однако, оно создается) в аргумент save-buffer? Я предполагаю save-buffer - | … как в ответе Grauwolf, который покончил с временным файлом в целом? –  Gilles 'SO- stop being evil' 08.07.2016, 22:44
  • 4
    Вы корректны, мой отказ, это не было бы возможно. –  Grief 08.07.2016, 22:50

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

  1. Используйте обходное решение Chris Johnsen: 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
27.01.2020, 19:29

Существует решение на Дуге использование 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
27.01.2020, 19:29
  • 1
    Делает tmux, создают save-buffer зарегистрировать надежно в общем каталоге? Иначе вставление его /tmp дыра в системе безопасности. Существует бесполезное использование cat, и удаление временного файла отсутствует. Затем это - вопрос xsel по сравнению с xclip, которые эквивалентны здесь, и у Вас есть мой (indenpendently записанный) решение. –  Gilles 'SO- stop being evil' 28.06.2011, 00:09
  • 2
    Спасибо Gilles. Я обновлю Wiki для отражения точек. –  jasonwryan 28.06.2011, 00:12

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

# 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"
93
27.01.2020, 19:29
  • 1
    Таким образом, это делает. Это намного более хорошо, чем использование временного файла, спасибо. Это даже автоматически справляется с несколькими параллельными сессиями, благодаря TMUX переменные среды. –  Gilles 'SO- stop being evil' 10.07.2011, 19:05
  • 2
    лучшая инструкция для C-p был бы: bind C-p run "xclip -o | tmux load-buffer - ; tmux paste-buffer" - никакие проблемы заключения в кавычки или командная строка не ограничивают проблемы. –  docwhat 23.02.2012, 05:37
  • 3
    Делает tmux, имеют рычаг для копирования выбора в буфер обмена когда в copy-mode? –  Ehtesh Choudhury 05.02.2013, 20:56
  • 4
    xclip -o опция не сделала работавший для меня так, я изменился на bind C-c run "tmux save-buffer - | xclip -selection c"\; display-message "Buffer copied to clipboard" –  Pawka 23.08.2013, 15:46
  • 5
    Каждый раз делаю копию, этот путь, tmux прекращает отвечать на любые сочетания клавиш. Какое-либо решение этого? –  skrat 02.06.2015, 14:59

Простое решение для Mac OS X

Это создает прочь из ответа Alex и использует материал, который не существовал в то время.

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

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.

41
27.01.2020, 19:29
  • 1
    Этот ответ превосходен. Я использовал tmux show-buffer какая вызванная строка переносят проблемы tmux save-buffer - решенный это. –  event_jr 18.03.2012, 07:00
  • 2
    Что делает - в конце tmux save-buffer - ? –  hekevintran 13.04.2012, 20:58
  • 3
    Испускает save-buffer к stdout. Можно заменить - с именем файла и это сохранит его там. Это препятствует тому, чтобы Вы писали (и имели для чистки) файл. –  docwhat 15.04.2012, 07:54
  • 4
    С OS X 10,10 reattach-to-user-namespace больше не необходимо. Почти каждое учебное руководство и документация относительно tmux и OS X упоминают это, потому что копия и вставка не были легко возможны несколько лет назад. В эти дни это (главным образом) работает из поля. –  Rafael Bugajewski 03.08.2015, 11:01

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

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

использование сохранять-буфера вместо выставочного буфера дает реальные данные без данных как показано с разрывами строки, когда Вы находитесь в разделениях.

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

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

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

9
27.01.2020, 19:29
  • 1
    , я пытался объединить обе команды, поскольку Вы упомянули без успеха. Какие-либо идеи о том, как сделать это? –  Rafael Vega 07.06.2013, 01:25

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

Кроме того, 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-копии. Таким образом, я закончил тем, что делал это вместо этого:

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
27.01.2020, 19:29

Я пытаюсь выяснить достойный способ скопировать то, что я имею в буфере 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-копии в tmux. Используйте, например, C-M-w. (Эта привязка, которая будет определена "глобально" - не только в режиме копии - но и только полезная в режиме копии),

bind-key -n C-M-w send-keys M-w\; \
 run-shell "tmux save-buffer - | xsel --input --clipboard" 
3
27.01.2020, 19:29

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

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

ОБНОВЛЕНИЕ: Так или иначе с 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
27.01.2020, 19:29

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.

40
27.01.2020, 19:29
  • 1
    Работы отлично и являются простым решением набора. –  Naseer 03.06.2014, 21:05
  • 2
    не работает на меня в соответствии с Linux, этот делает хотя: unix.stackexchange.com/a/131074/13601 –  Sebastian Blask 02.07.2014, 18:45
  • 3
    С OS X 10.10, это появляется reattach-to-user-namespace не необходимо. –  Chris 23.07.2015, 09:45
  • 4
    работает над el capitan –  olleh 26.10.2015, 08:07
  • 5
    Это больше не работает на Tmux 2.4, который был выпущен 20 апреля 2017. Вместо этого необходимо использовать bind-key -T copy-mode-vi y send-keys -X copy-pipe "xclip" и для OS X: bind-key -T copy-mode-vi y send-keys -X copy-pipe "reattach-to-user-namespace pbcopy" –  Jason Axelson 09.12.2017, 21:01

Многие из этих ответов не сработали для моего Убунту 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 клипа -i. Эта строка объединяет буфер yank в tmux и отправляет его в xclip.
  • Чтобы вставить его, мне нужно было снова указать, какой буфер обмена с -sel клипом -o

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

3
27.01.2020, 19:29

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

16
27.01.2020, 19:29

И улучшенная версия ответа @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 в операционных системах X и Linux.

1
27.01.2020, 19:29

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

bind-key -t emacs-copy MouseDragEnd1Pane copy-pipe "pbcopy"
bind-key -t vi-copy MouseDragEnd1Pane copy-pipe "pbcopy"
1
27.01.2020, 19:29

Это мой довольно длинный ответ, который должен исправить две основные проблемы, связанные с использованием 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'
4
27.01.2020, 19:29

Я использую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"
    
2
27.01.2020, 19:29

Теги

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