Как скопировать из tmux, запущенного в putty, в буфер обмена Windows
ENV: я использую tmux в замазке на ноутбуке с windows 7. Я делаю SSH для Linux систем во время работы.
Я должен решить две проблемы с Tmux, прежде чем использовать его для всех моих нужд.
-
Я должен скопировать текст в блокнот Windows из Vim или терминала Tmux. Я включил поддержку мыши для vim и putty.
Я пробовал "*y
и "+y
но оба они не работают. Если я использую возможность замазки для копирования, то он также копирует содержимое смежных сеток.
-
Я должен скопировать некоторый контент из файла vim на одной панели в файл vim, открытый на другой панели. Есть ли у Vim трюк для этого. Я не хочу использовать <Cb>[
способ сделать это.
Проблема 1 преследует меня больше, потому что есть проблема для проблемы 2.
Ответы
Ответ 1
PuTTY - это просто эмулятор терминала; Vim регистрирует *
и +
обеспокоен выбором X и буфером обмена; там нет перекрытия.
PuTTY позволяет вам копировать содержимое выбранного терминала в буфер обмена Windows; при запуске tmux это неизбежно будет включать макет окна.
Вам нужно переключиться с PuTTY на то, что позволяет реальную интеграцию, такую как сервер Cygwin XWin, который является настоящим X-сервером, который интегрирует буфер обмена X с буфером обмена Windows. Вместо внутри сеанса PuTTY вы бы ssh -X
на свой сервер и запускали Vim на терминале Linux или GVIM напрямую. Затем yanking через "+y
будет работать так, как вы ожидали.
В качестве альтернативы, если вы хотите использовать PuTTY, вам нужно будет использовать некоторое обходное решение, например :write
выбор в локальном файле, и, например, передачу этого файла в Windows через scp
.
Ответ 2
Я использую putty v0.62 и tmux v1.8.
tmux config: setw -g mode-mouse on
Я хочу скопировать некоторый текст из tmux в системный буфер обмена, я нажимаю и удерживаю SHIFT и выбираю текст мышью, а затем левую кнопку мыши.
Я хочу вставить некоторый текст в tmux, нажмите SHIFT и щелкните правой кнопкой мыши.
Ответ 3
Это абсолютно возможно. Все строки конфигурации ниже были скопированы с машин в разных панелях tmux обратно на мою машину Windows. Да, я замазываю в одну машину и tmux и ssh оттуда другим, и могу перенести свои vim yanks на любую машину, включая мой браузер Windows.
Я запускаю X-сервер в Windows (не обязательно должен быть в Windows, но вам где-то нужен).
Основные ингредиенты:
- putty 0.62 (в Windows)
- tmux 1.8 (на одной машине Linux)
- xclip (на машинах Linux)
- MobaXterm (в Windows для своего x-сервера)
Настройка сети может немного отличаться, особенно в конфигурации дисплея X-сервера, но здесь она идет:
tmux
# allow mouse to select panes
setw -g mode-mouse on
set-option -g mouse-select-pane on
# allow yank into system clipboard
#bind C-y run "tmux save-buffer - | xclip -i"
bind C-y run-shell -b "tmux show-buffer | xclip -selection clipboard -i"
# move x clipboard into tmux paste buffer
bind C-p run-shell -b "xclip -o -selection clipboard | tmux load-buffer - ; tmux paste-buffer"
ВИМ
" get some autoselect interaction with the system clipboard
set guioptions=aA
MobaXterm
Я продолжаю работать, но мне не нужно запускать tmux в оболочке xterm. Убедитесь, что общий буфер обмена выбран в настройках X11. Я полагаю, что xming должен работать, но настройки для моих других потребностей никогда не казались бы трудными. У MobaXterm есть другие лакомства, которые мне нравятся в любом случае (файловые браузеры и т.д.).
Я предполагаю, что могу запустить сеанс ssh с tmux в MobaXterm, но я предпочитаю окно шпатлевки, где у меня есть соляризованная цветовая палитра.
шпатлевка
ssh на машину с tmux. На этом этапе я установил переменную среды DISPLAY
и поместил ее в файл env, полученный из bash. Таким образом, каждое последующее созданное окно будет установлено. Установка на других машинах, которые я прыгаю с машины tmux, - это отдельное упражнение целиком.
На любой машине, которая будет использовать буфер обмена, убедитесь, что у вас установлен правильный $DISPLAY
. Вы должны иметь возможность запускать xeyes
и видеть его на своем локальном компьютере.
Каждый будет использовать буфер обмена. vim будет копировать в буфер обмена, когда вы дергаетесь. Чтобы вставить еще одну область tmux, используйте ctrl-p bind-key (ctrl-a ctrl-p для меня).
Если он не работает, вы всегда можете попробовать xclip -o -selection clipboard
посмотреть, что нужно вставить. вы также сможете перенести любой текст "tmux selected" (мышь или bind-key [
) в буфер обмена (и, следовательно, в обычное оконное окно) с помощью bind-key ctrl-y
(т.е. tmux yank).
Ответ 4
С некоторыми обманами можно вернуть буфер tmux через PuTTY и на клиент. Я выполнил это с использованием кодов выхода ANSI для порта "AUX" (последовательный принтер).
Вот только одна реализация этого метода передачи:
1) На стороне сервера tmux.conf
добавьте:
# Send the tmux copy buffer to a file. The file is read for ANSI printing by "t" alias in .bashrc
bind -t vi-copy y copy-pipe 'cat > ~/.tmux-buffer'
2) На стороне сервера .bashrc
добавьте:
t() {
# Configure a PuTTY profile to send "t" as the "Remote command". This
# function will automatically reattach to an existing tmux session if one
# exists, or start a new one. This function also repeatedly sends our
# homemade tmux clipboard back to the PuTTY client in the form of an ANSI
# printer escape sequence. The contents of the homemade clipboard are
# populated by `bind -t vi-copy y copy-pipe 'cat > ~/.tmux-buffer'` in
# tmux.conf. It is expected that the PuTTY client will be configured to
# print to a "Microsoft XPS Document Writer" which saves the printer output
# to a file. The file is subsequently read by an AutoHotkey macro, and the
# contents are made available for paste.
[[ "$TERM" == "xterm" ]] || return 0 # This prevents recursive runs, in case t() is called after tmux is started.
{ while :; do tput mc5; cat ~/.tmux-buffer; tput mc4; sleep 5; done } &
tmux attach || tmux
}
3) На клиентской стороне (Microsoft Windows) создайте новый принтер:
- Добавить принтер
- Создать новый порт > Локальный порт
- Введите имя портa > "
PuTTY_Printer_File
"
- Драйвеp > Microsoft XPS Document Writer
- Имя принтерa > "
PuTTY Printer
"
- Дополнительно: Распечатайте тестовую страницу и убедитесь, что она отображается в содержимом файла @ "
%USERPROFILE%\Documents\PuTTY_Printer_File
"
4) В конфигурации PuTTY на стороне клиента:
- Установить терминал > "Принтер для отправки вывода принтера ANSI на:" на вновь созданный принтер с именем "
PuTTY Printer
"
- Установить соединение > SSH > "Удаленная команда:" на "
t
" (ссылка на функцию .bashrc выше)
На этом этапе вы можете отправить содержимое буфера tmux клиенту PuTTY, выделив некоторый текст в режиме копирования tmux и нажав y
. Выбранный текст закончится на %USERPROFILE%\Documents\PuTTY_Printer_File
на клиенте. Если вы хотите сделать еще один шаг и эмулировать "вставку" из этого файла, вы можете использовать последовательность горячих клавиш, чтобы прочитать содержимое файла и вставить его. Вот пример, который использует AutoHotKey, но, вероятно, возможно получить тот же результат в PowerShell, если вы предпочитаете.
5) Макрос AutoHotKey на стороне клиента:
;### Get contents of PuTTY ANSI printer device output and paste it
#v:: ;Winkey + v
FileRead, PuTTYPrinter, %USERPROFILE%\Documents\PuTTY_Printer_File
SendInput %PuTTYPrinter%
PuTTYPrinter = ; Free up memory
return
6) Полная процедура использования:
- Подключитесь к серверу с PuTTY и опустите его в tmux с помощью функции t().
- Когда вы готовы выбрать текст для копирования, используйте горячую клавишу tmux для режима копирования (
Ctrl + b
, [
)
- Переместить курсор со стрелками
- Начать выбор с помощью
spacebar
- Завершить выбор и скопировать его с помощью
y
- Вернувшись на клиентскую консоль PuTTY,
WindowsKey + v
вставляет выделение
Так как фотографии стоят 1000 слов, вот обзор того, что происходит:
https://media.licdn.com/mpr/mpr/AAEAAQAAAAAAAAfiAAAAJDYzM2RmMzYzLTk1NmQtNGQxMi1iN2YyLTQ4NGUxNjExMmVlOA.png
Ответ 5
Предполагая, что режим мыши уже включен, добавьте его в конфигурацию tmux и выберите "Копировать" в буфер обмена.
bind -Tcopy-mode MouseDragEnd1Pane send -X copy-selection-and-cancel\; run-shell -b "tmux show-buffer | clip"
Протестировано на v2.6