Скопировать выделение в буфер обмена в tmux

24

Если я выделю текст с помощью мыши в tmux в iTerm2 на macOS, я получу скопированный текст в буфер обмена. Мне не нужно нажимать какие-либо дополнительные кнопки - просто выберите нужный текст, и все готово.

Я протестировал tmux в Terminal.app на MacOS, но там он не работает - мне нужно нажать, yчтобы скопировать выделение в буфер обмена.

Я думал, что есть привязка мыши (что-то MouseOnSelectionпохожее на MouseDown1Pane), но я не смог найти ничего полезного в Интернете и man tmux.

Интересно, есть ли способ иметь подобное поведение в Ubuntu 16.10 - предпочтительно в терминале Gnome.

Мои точечные файлы tmux доступны здесь (ссылка) .

Матеуш Пиотровский
источник

Ответы:

46

Tmux 2.4+ с привязками режима копирования vi и xclip :

set-option -g mouse on
set-option -s set-clipboard off
bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "xclip -se c -i"

Для более старых версий tmux, привязок режима копирования emacs (по умолчанию) или не-X платформ (т.е. без xclip), смотрите объяснение ниже.


Объяснение: Сначала нам нужно включить параметр мыши, чтобы tmux захватил мышь и связал события мыши:

set-option -g mouse on

Gnome-терминал не поддерживает установку буфера обмена с помощью escape-последовательностей xterm, поэтому мы должны убедиться, что set-clipboardопция отключена:

set-option -s set-clipboard off

Эта опция может поддерживаться и включаться по умолчанию на iTerm2 (см. set-clipboardРуководство tmux), что объясняет поведение там.

Затем мы можем связать MouseDragEnd1Pane«ключ» режима копирования , т. Е. Когда первая кнопка мыши отпущена после нажатия и перетаскивания на панели, к команде tmux, которая принимает текущий выбор режима копирования (сделанный привязкой по умолчанию для MouseDrag1Pane) и передает его по конвейеру. к команде оболочки. Эта команда tmux была copy-pipeдо tmux 2.4 и с тех пор изменилась на send-keys -X copy-pipe[-and-cancel]. Что касается команды оболочки, нам просто нужно что-то, что установит содержимое системного буфера обмена на то, что ему передано; xclip используется для этого в следующих командах. Ниже приведены некоторые эквивалентные замены для "xclip -selection clipboard -i"не-X платформ: "wl-copy"(Wayland), "pbcopy"(macOS), "clip.exe"(Windows, WSL) и "cat /dev/clipboard"(Cygwin, MinGW).

Tmux 2.4+:

# For vi copy mode bindings
bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "xclip -selection clipboard -i"
# For emacs copy mode bindings
bind-key -T copy-mode MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "xclip -selection clipboard -i"

Tmux 2.2 до 2.4:

# For vi copy mode bindings
bind-key -t vi-copy MouseDragEnd1Pane copy-pipe "xclip -selection clipboard -i"
# For emacs copy mode bindings
bind-key -t emacs-copy MouseDragEnd1Pane copy-pipe "xclip -selection clipboard -i"

До tmux 2.2:

Поддержка копирования после перетаскивания мышью была изначально добавлена ​​в Tmux 1.3 путем установки новой mode-mouseопции в on. Tmux 2.1 изменил поддержку мыши на знакомые привязки клавиш мыши, но не имел DragEndпривязок, которые были введены в 2.2. Таким образом, до 2.2 я полагаю, что единственный способ установки системного буфера обмена при перетаскивании мышью был через встроенное использование escape-последовательностей xterm ( set-clipboardопция). Это означает, что необходимо обновить как минимум tmux 2.2, чтобы получить поведение перетаскивания и копирования для терминалов, которые не поддерживают set-clipboard, таких как GNOME Terminal.

Джош Бробст
источник
3
Этот высококачественный ответ - то, что наконец заставило меня все это щелкнуть .. спасибо!
cjauvin
2
Для тех , кто пытается сделать это на макинтош , потому что они изменили свою терминальную функциональность и метод по умолчанию , как указано в ОПАХ больше не работает (я использую бёб , который имеет свой собственный буфер копирования): заменить xclip...заявление с простым pbcopyделает трюк.
Даррел Холт
Ни одно из решений в этой теме не работает для меня.
Янки
1
Привет Джош, когда я исходный файл ~ / .tmux.conf, оказалось:Unknown key: MouseDragEnd1Pane
Xifeng Li
@XifengLi Какую версию и ОС tmux вы используете? Я считаю, что для DragEndключей вам нужен как минимум tmux 2.2 .
Джош Бробст
8

В качестве дополнения к принятому ответу люди часто обнаруживают, что при отпускании кнопки мыши беспокоит выход из режима копирования (это то, что происходит с copy-pipe-and-cancel). Смотрите: https://github.com/tmux/tmux/issues/140 . Следовательно, в более новом tmux (я использую 2.6) мы можем использовать copy-pipeвместе с clear selectionкопировать в выделение, но не выходить из режима копирования:

bind-key -T copy-mode-vi MouseDragEnd1Pane send -X copy-pipe "xclip -selection clipboard -i" \; send -X clear-selection
Габор Мартон
источник
2

Расширяя оба ответа для копирования из msys2 в буфер обмена Windows (и снимите выделение):

# For vi copy mode bindings
bind -Tcopy-mode-vi MouseDragEnd1Pane send -X copy-pipe "cat > /dev/clipboard" \; send -X clear-selection
# For emacs copy mode bindings
bind -Tcopy-mode MouseDragEnd1Pane send -X copy-pipe "cat > /dev/clipboard" \; send -X clear-selection
Шон Гувер
источник
Хорошая точка зрения. Я сам пользуюсь режимом копирования (в стиле emacs) и после тестирования вставил свой собственный конфигурационный файл. Я обновил ответ, чтобы включить оба, как в принятом ответе.
Шон Гувер
0

Еще одно расширение об использовании Shiftключа.

Удерживайте Shiftпри выделении текста с помощью мыши. Теперь у вас есть стандартное меню, вызываемое правой кнопкой мыши (продолжайте удерживать или нажмите Shiftснова), и вы можете использовать Ctrl+Shift+Cи Ctrl+Shift+Vдля копирования и вставки. Скопированный текст также будет доступен в системном буфере обмена .

Проверено на Ubuntu 18.04.1с tmux 2.6.

Источник: https://forum.upcase.com/t/tmux-ctrl-shift-c-and-ctrl-shift-v-bindings/1208 .

Душан Магар
источник