Я пытаюсь найти достойный способ скопировать то, что у меня есть в буфере 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 не нравится << в команде оболочки.
Есть идеи?
Изменить: Вы можете пропустить, select-pane -t 2
если хотите, это не очень важно. Я просто использую конкретный макет, а панель 2 - это та, которую я предпочитаю разделять, когда я делаю что-то еще, чтобы по умолчанию в мои привязки включались разбиения.
keyboard-shortcuts
tmux
clipboard
xclip
Цифровые державы
источник
источник
Ответы:
Здесь документы нужны новые строки. Например, в сценарии оболочки вы можете написать
Я не думаю, что tmux позволяет вам размещать там новые строки, и даже если бы это было так, это не было бы хорошим подходом. Что, если сами данные содержатся в
HERE
одной строке (например, потому что вы копируете свою.tmux.conf
)?Я предлагаю записать содержимое буфера во временный файл. Непроверенные:
Если вы используете эту команду в двух отдельных экземплярах tmux, возникает условие гонки. Я не знаю, как это решить.
источник
mktemp
который широко доступен$PPID
в оболочке, запускаемой tmux). Но как вы получаете имя файла переменной (как бы оно ни создавалось) в аргументsave-buffer
? Я думаю,save-buffer - | …
как и в ответе Граувольфа , который вообще избавляется от временного файла?Это должно работать:
источник
TMUX
переменным окружения.C-p
будет:bind C-p run "xclip -o | tmux load-buffer - ; tmux paste-buffer"
- нет проблем с кавычками или командной строки.copy-mode
?xclip -o
опция не сработала для меня, поэтому я перешел наbind C-c run "tmux save-buffer - | xclip -selection c"\; display-message "Buffer copied to clipboard"
Более простое решение для Mac OS-X
Это основывается на ответе Алекса и использует вещи, которых не было в то время.
Если вы используете homebrew (а если нет, то почему не так?), То вы можете просто сделать это:
Тогда в вашем
~/.tmux.conf
:Чтобы скопировать буфер из tmux (вы уже должны были что-то скопировать с помощью tmux) в монтажную панель Mac, используйте
<tmux-key> Control-c
. Теперь он будет доступен дляCommand-v
илиpbpaste
Чтобы вставить что-нибудь из Macboard, используйте
<tmux-key> Control-v
.источник
tmux show-buffer
который вызвал проблемыtmux save-buffer -
переноса строк, решил это.-
в концеtmux save-buffer -
делать?save-buffer
вывод. Вы можете заменить-
имя файла, и оно сохранит его там. Это мешает вам писать (и очищать) файл.Команда
copy-pipe
была добавлена начиная с версии 1.8. Он копирует выделение в буфер tmux и передает его команде. Теперь нет необходимости в привязке префикса. Вот пример:Теперь, когда у вас есть выделенный текст
copy-mode
, yскопируйте этот текст в буфер tmux, а также в буфер обмена ОС. Однако, это не поможет, если вы хотите получить текст из буфера обмена в буфер tmux.источник
reattach-to-user-namespace
не является необходимым.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"
Возможно, вы захотите попробовать плагин tmux-yank . Это позволяет копировать прямо в системный буфер обмена (OS X и Linux) и некоторые другие полезности, такие как восстановление текущей строки оболочки.
источник
После попытки другого решения, вот моя окончательная настройка:
использование save-buffer вместо show-buffer дает реальные данные без данных, как показано с переносами строк, когда вы находитесь в разбиениях.
Я также использую это, чтобы начать выделение / копирование в режиме копирования tmux:
Я предполагаю, что можно было бы объединить выделенную копию с клавишей 'y' и переместить ее в буфер обмена x.
источник
Вот попытка дать исчерпывающий ответ.
Сначала немного истории
Когда этот вопрос впервые был задан (июнь 2011 г.), копирование текста из Tmux в буфер обмена должно было выполняться в два этапа: сначала скопируйте выделенный текст в буфер Tmux, а затем скопируйте текст из буфера Tmux в системный буфер обмена.
В версии 1.8 (март 2013 г.)
copy-pipe
была добавлена команда, которая позволяет копировать выделенный текст прямо в системный буфер обмена (или в другое место назначения).Затем в версии 2.4 (апрель 2017 г.) ключевые таблицы были значительно изменены, в результате чего многие ответы на этой странице устарели.
Отвечая на оригинальный вопрос
Linux :
Mac :
Если вы используете homebrew, вы должны установить
reattach-to-user-namespace
, выполнив следующую команду в терминале:Затем в вашем ~ / .tmux.conf:
Более короткий метод (скопируйте и вставьте выделение прямо из буфера обмена в tmux> 2.4 и обратно)
Примечание: есть две версии для Linux, потому что Linux имеет основной и дополнительный буфер обмена (также известный как выбор).
Linux :
Mac :
Настройка этих команд
Если вы не хотите, чтобы команда сообщала вам, что она сделала в строке состояния, просто удалите
display-message
(а также то,\;
что стоит перед ней).Если вы используете режим копирования в стиле Emacs вместо vi, замените любой экземпляр на
copy-mode-vi
простоcopy-mode
Если вы работаете в Linux , и вы хотите использовать
xsel
вместоxclip
заменыxclip -r
сxsel -i -p
иxclip -o
сxsel -o -p
Значение
-r
inxclip -r
является необязательным, оно удаляет последний символ новой строки. Это полезно для копирования команд, тогда, когда вы вставите их, они не будут немедленно выполнены.Если вы туннелируете по SSH, вам следует обратиться к https://unix.stackexchange.com/a/354581/14252.
Рекомендации:
> /dev/null
копирования буфера tmux в буфер обмена tmux не будет отвечать на ярлыкиисточник
bind-key C-p run-shell "xclip -o | tmux load-buffer - ; tmux paste-buffer"
все еще действует? дляtmux>2.4
Мне не нравятся дополнительные нажатия клавиш, поэтому я хотел что-то более амбициозное. Войдите в режим копирования с помощью [, выделите нужный текст, а затем нажмите], чтобы скопировать текст в буфер обмена.
Кроме того , tmux любит включать новые строки в выражениях , которые обруч (и как ни странно эти новые строки находятся в неправильном месте! Они не там , где выражение наматывается на экране). Поэтому я хотел, чтобы C-] скопировал выражение, удалив символы новой строки.
На tmux 1.6 я попробовал это:
но это не сработало, потому что tmux не рад связывать сложные вещи с таблицей vi-copy. Так что в итоге я сделал это вместо:
Это приводит к странным вещам (] или C-] будут забавными при следующем использовании, но только один раз), если вы выйдете из режима копирования другим способом, кроме] или C-]. Это можно исправить с помощью некоторых дополнительных привязок, которые я себе представляю, но это делает то, что я хочу большую часть времени.
источник
В Arch Wiki есть решение, использующее
xclip
:https://wiki.archlinux.org/index.php/Tmux
источник
save-buffer
файл в общем каталоге? В противном случае его вставка/tmp
- это дыра в безопасности. Это бесполезное использованиеcat
, и удаление временного файла отсутствует. Тогда это вопросxsel
противxclip
, которые здесь эквивалентны, и у вас есть мое (независимо написанное) решение.Решение для Mac OS X. Выполните следующие 2 шага:
Используйте обходной путь Криса Джонсена: https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard
Добавьте этот код в вашу конфигурацию tmux (~ / .tmux.conf)
источник
Слегка измененный вариант принятого ответа, который я приготовил.
Я также предпочитаю использовать системный буфер обмена (Ctrl-C, Ctrl-V) в дополнение к
primary
стандартному буферу обмена xclip (тот, который вы получаете при выборе мыши и средних щелчках мыши). Для выбора системного буфера обмена необходимо передать-selection clipboard
аргументxclip
.Также при копировании буфера в буфер обмена мне нравится возможность выбирать, какой буфер я хочу скопировать. Это делается с использованием
choose-buffer
и затем передачей буфера аргумента дляsave-buffer
использования-b %%
.ОБНОВЛЕНИЕ: почему-то с tmux 1.8 и двумя моими установками openSUSE 12.2, я вижу зависание, когда
tmux run-shell
вызываетсяxclip
чтение из stdin по каналу. Вместо этого я решилxsel
попробовать, и это, кажется, работает. Это эквивалентные привязки клавишxsel
. Я также использовал&&
для объединения команд в вставить для большей надежности.источник
Это мой довольно длинный ответ, который должен решить две основные проблемы с использованием xclip для копирования буфера из удаленного (ssh) сеанса tmux:
1. Не отвечающий xclip
Для меня ответ @ Grauwolf с
xclip
не работал (делает tmux панель совершенно безразличным). Я узнал, почему на странице Tmux вики Arch :Так что привязка должна быть:
Теперь это будет работать, если ваша сессия tmux локальная.
2. xclip не может подключиться к X
Если вы используете tmux поверх ssh -X , есть большие шансы, что это не сработает напрямую.
Это потому, что переменная оболочки
$DISPLAY
должна быть установлена правильно.Комплексное решение
Так что для меня, полный рабочий раствор должен поместить следующие строки по моему
~/.tmux.conf
:Для вставки из предмета:
Я не до конца понимаю, почему
$DISPLAY
не правильно установлен во время поиска.tmux.conf
, поэтому я должен извлечь его с помощьюtmux show-env
иsed
.Если у вас tmux> = 1.8, вы можете адаптировать эту команду с помощью
copy-pipe
:источник
/home/linux/.tmux.conf:11: invalid or unknown command: bind-key C-y run "tmux save-buffer - | xclip -i -selection clipboard -d `tmux show-env | sed -n 's[0/0] PLAY=//p'` >/dev/null
sed
вы показываете, не тот, который я написал ... Это то, что вы написали в своей.tmux.conf
?sed
? Команда должна быть:sed -n s/^DISPLAY=//p
. В качестве альтернативы можно использоватьcut
:tmux show-env DISPLAY | cut -d'=' -f2
. Также стоит проверить вашу версию tmux.Для привязок в стиле Emacs есть несколько разных опций. (Должен ли стиль Vi быть похожим?) Типичная привязка для выполнения «копирования-выбора» в emacs - это Mw, поэтому было бы очень удобно иметь такую же привязку в tmux.
1 - было бы идеально, но не работает (из-за ограничения tmux?)
2 - Компромисс, который хорошо работает для меня : согласитесь использовать другую привязку клавиш для emacs-copy в tmux. Используйте, например, CMw. (Это связывание, которое будет определено «глобально» - не только в режиме копирования - но и только в режиме копирования)
источник
Многие из этих ответов не сработали для моей Ubuntu 14.04 на zsh как есть. Не уверен, что моя оболочка как-то связана с этим, но вот моя рабочая версия использования этой стратегии для копирования и этой стратегии для вставки.
Некоторые заметки:
-sel clip -i
. Эта строка объединяет буфер yank to tmux и отправляет его в xclip.-sel clip -o
Теперь это прекрасно работает для моей установки vim / zsh / tmux.
источник
-sel clip -i
решает проблему. Хотя я не понимаю, зачем вам снова указывать буфер обмена, чтобы вставить его (]
у меня стандартно работает)И улучшенная версия ответа @Leif может быть:
Таким образом, не будет никаких последствий, если вы выйдете из режима копирования другим способом, кроме], приведенный выше код обернут в tundle / tmux-yank плагин tmux для копирования текста tmux в системный буфер обмена, он нацелен на tmux> = 1.6 в OS X и Linux.
источник
На OS-X с версией 2.2 tmux или позже будет работать следующее:
источник
Я использую
copyq
многострочный менеджер буфера обмена. (Работает с Windows, OSX, Linux.)Добавьте следующие строки в
~/.tmux.conf
:cygwin
требуетcopyq.exe
размещения в~/.bashrc
:источник