Скопіюйте вибір у буфер обміну в форматі tmux


24

Якщо я вибираю текст мишкою в tmux в iTerm2 на macOS, я отримую вибраний текст, скопійований у мій буфер обміну. Мені не потрібно натискати зайвих кнопок - просто виберіть потрібний текст і ви закінчите.

Я тестував tmux в terminal.app на macOS, але він там не працює - мені потрібно натиснути, yщоб скопіювати виділення в буфер обміну.

Я думав, що існує прив'язка миші (щось MouseOnSelectionподібне до MouseDown1Pane), але я не зміг знайти нічого корисного в Інтернеті та man tmux.

Цікаво, чи є спосіб подібної поведінки на Ubuntu 16.10 - бажано в терміналі Gnome.

Мої tmux dotfiles доступні тут (посилання) .

Відповіді:


46

Tmux 2.4+ з прив’язками режиму копіювання та 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-термінал не підтримує налаштування буфера обміну за допомогою послідовностей виходу 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 я вважаю, що єдиним методом встановлення системного буфера обміну мишкою було використання вбудованого використання послідовностей xterm escape ( set-clipboardопція). Це означає, що необхідно оновити принаймні tmux 2.2, щоб отримати поведінку перетягування та копіювання для терміналів, які не підтримують set-clipboard, наприклад, термінал GNOME.


3
Ця високоякісна відповідь - це те, що нарешті змусило мене все натиснути .. дякую!
cjauvin

2
Для тих, хто намагається зробити це на mac, оскільки вони змінили свою функціональність терміналу, а метод за замовчуванням, як заявлено в ОП, більше не працює (я використовую Byobu, який має власний буфер копіювання): заміна xclip...оператора на простий pbcopyробить хитрість.
Даррель Холт

Жодне з рішень у цій темі не працює для мене.
Янкі

1
Привіт Джош, коли я вихід-файл ~ / .tmux.conf, виявилося:Unknown key: MouseDragEnd1Pane
Xifeng Li

@XifengLi Яку версію tmux та ОС ви використовуєте? Я вважаю, що вам потрібно принаймні tmux 2.2 для DragEndключів.
Джош Бробст

8

Як розширення до прийнятої відповіді, люди часто виявляють, що тривожне при відпусканні кнопки миші виходить з режиму копіювання (саме це відбувається і з copy-pipe-and-cancel). Дивіться: https://github.com/tmux/tmux/isissue/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 .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.