Копировать / вставлять выделенные фрагменты текста между tmux и буфером обмена

15

Я использую последнюю версию tmux (из репозитория git) и xclip (0.12), и я хотел бы иметь возможность использовать привязки клавиатуры, подобные Emacs, для перемещения по тексту copy-mode, M-wвыборки copy ( ) в буфер обмена и paste ( C-y) из / в буфер копирования в буфер обмена.

До сих пор я мог вставлять текст C-yи перемещаться copy-modeс помощью Emacs-подобных привязок клавиатуры, но я все еще не могу скопировать текст из буфера tmux (например, в copy-mode)

Я нашел этот поток для копирования всего буфера в буфер обмена (и наоборот), но, похоже, он не работает для меня.

Также в tmux-usersсписке рассылки мне сказали, что в последних версиях tmux (только в git repo) предусмотрена команда под названием copy-pipe. Страница man говорит следующее об этой команде:

Одна команда принимает аргумент copy-pipe, который копирует выделение и передает его в команду. Например, следующее свяжет 'C-q', чтобы скопировать выделение в / tmp, а также буфер вставки:

       bind-key -temacs-copy C-q copy-pipe "cat >/tmp/out"

Похоже, copy-pipeон предназначен для частичного использования для передачи выбора другой команде. Также есть некоторые опечатки в этом описании и в команде (что это temacs-copy?)

В любом случае, я хотел бы сделать следующее:

Копирование:

  1. Войдите в режим копирования
  2. Перейти к тексту , который я хочу , чтобы скопировать с помощью команд навигации Emacs (т.е. C-f, C-b, M-f, M-b, C-a, и C-eт.д. , чтобы переместить курсор). Нет префикса для любого из них.
  3. Скопируйте выделенный текст в буфер обмена с помощью: M-w( без префикса )

Приклеивание:

  1. Я хотел бы иметь возможность набирать C-y( без необходимости вводить copy-mode), чтобы вставить текст в терминале ( без префикса )

Я попробовал следующее для копирования без удачи:

bind-key -n M-w run "tmux save-buffer - | xclip -i -selection clipboard" 

Тем не менее, вставка прекрасно работает:

bind-key -n C-y run "xclip -o | tmux load-buffer - ; tmux paste-buffer"

Странно то, что я знаю, что xclip -i -selection clipboardчасть " " команды копирования выше работает хорошо, так как я могу копировать вещи в буфер обмена в командной строке, например:

echo "Hello world. How are you?" | xclip -i -selection clipboard

При всем этом, как я могу скопировать выделение из режима копирования в буфер обмена?

Амелио Васкес-Рейна
источник

Ответы:

19

Используйте следующие tmux.confс copy-pipeв новых версиях tmux (1.8+):

set -g mouse on
# To copy:
bind-key -n -t emacs-copy M-w copy-pipe "xclip -i -sel p -f | xclip -i -sel c "

# To paste:
bind-key -n C-y run "xclip -o | tmux load-buffer - ; tmux paste-buffer"
  1. prefix+[ в режиме копирования
  2. выберите контент с помощью мыши (удерживайте)
  3. M-w скопировать эту часть в системный буфер обмена
  4. C-yвставить его в tmux, C-vчтобы вставить его в другое обычное приложение, такое как веб-браузер.
мистифицировать
источник
Этот ответ заслуживает большего количества голосов, он лучший для установок на основе Linux.
Луи Коттманн
В tmux 2.0 это run-shellвместоrun
roign
@LouisKottmann: почему только на основе Linux?
Чайба
Я не могу комментировать другие системы, но я считаю, что Mac обычно использует bpaste вместо xclip
Луи Коттманн,
В tmux 2.8 мне пришлось поменять их на bind -Tcopy-mode M-w send-keys -X copy-pipe "xclip -i -sel p -f | xclip -i -sel c ". bind-key -n C-y run-shell "xclip -o | tmux load-buffer - ; tmux paste-buffer" в соответствии с этим коммитом, предложенным Starfry
Аззамса
5

Обратите внимание, что в Tmux 2.4 (после этой фиксации ) синтаксис привязки изменился. Я перефразирую этот комментарий Github, чтобы кратко описать изменения:

  1. заменить -tна-T
  2. заменить vi-<name>на<name>-mode-vi
  3. добавьте к команде префикс send-keys -X

Я имел:

bind-key -n -t vi-copy Enter copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'
bind-key -n -t vi-copy MouseDragEnd1Pane copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'

который мне нужно было изменить на:

bind-key -n -T copy-mode-vi Enter send-keys -X copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'
bind-key -n -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'

Из журнала изменений :

Ключевые таблицы претерпели серьезные изменения. Таблицы клавиш режима больше не отделены от таблиц основных клавиш. Все таблицы ключей режима были удалены вместе с флагом -t для bind-key и unbind-key.

Таблицы emacs-edit, vi-edit, emacs-choose и vi-Choose были заменены фиксированными привязками клавиш в командной строке и режимах выбора. Клавиши режимов и статусных клавиш остаются.

Таблицы emacs-copy и vi-copy были заменены таблицами copy-mode и copy-mode-vi. Команды отправляются с использованием флагов -X и -N для отправки ключей. Итак, следующее:

bind -temacs-copy C-Up scroll-up
bind -temacs-copy -R5 WheelUpPane scroll-up

становится:

bind -Tcopy-mode C-Up send -X scroll-up
bind -Tcopy-mode WheelUpPane send -N5 -X scroll-up

Эти изменения позволяют использовать полный синтаксический анализатор команд (включая последовательности команд) и набор команд - например, обычная командная строка с редактированием и историей теперь используется для поиска, перехода и т. Д. Вместо пользовательского. Привязка Cr по умолчанию теперь:

bind -Tcopy-mode C-r command-prompt -p'search up' "send -X search-backward-incremental '%%'"

Есть также несколько новых команд, доступных с send -X, таких как copy-pipe-and-cancel.

starfry
источник
2

Это -temacs-copyне опечатка. Начальная черта означает, что это опция bind-keysкоманды (вместе с аргументом для опции). Это эквивалентно -t emacs-copy, если вам это нравится больше.

В режиме копирования используется другой набор привязок и команд 1, чем в «обычном режиме». copy-pipeКоманда доступна только в альтернативных «режиме» привязки таблиц. Когда mode-keysесть emacs, режим копирования будет использовать emacs-copyтаблицу, поэтому вам нужно привязать Mw к copy-pipeэтой таблице.

bind-key -temacs-copy M-w copy-pipe "xclip -i -selection clipboard"

Будьте осторожны, делая слишком много привязок «без префиксов». Они затруднят ввод этих связанных ключей в программу, выполняющуюся внутри tmux (например, когда вы хотите ввести Cy для экземпляра tma-режима Emacs, работающего внутри tmux ). Вы всегда можете (префикс) связать какой-то ключ, который делает send-keys C-y, но это может сделать его более громоздким для ввода, если вам это нужно достаточно часто.


1 Доступны только команды перемещения и редактирования. За исключением того copy-pipe, что эти команды не принимают никаких аргументов (это означает, что на странице руководства написано «Одна команда принимает аргумент»; «in», вероятно, является опечаткой или ошибкой редактирования).

Крис Джонсен
источник
2

Хотя другие ответы могут помочь, вот как я делаю то же самое:

  • Shift + выделение текста курсором.
  • Ctrl + Shift + C, чтобы скопировать текст в буфер обмена.
Ришабх Аграри
источник
Это справедливый ответ, но проблемы начинаются, когда две или более панели расположены горизонтально.
cjauvin
Понятно, дайте мне знать, если найдете что-то полезное для этого.
Ришабх Аграри