Вопрос или проблема
Я подключаюсь со своего локального компьютера с Windows к удаленному компьютеру с Linux, на котором я запускаю Byobu, использующий tmux. У меня есть команда, привязанная к клавише следующим образом:
unbind-key p
bind-key p run '/home/ramrachum/bin/_polina_trek_echo.sh'
Я хочу, чтобы скрипт _polina_trek_echo.sh
скопировал фрагмент текста в буфер обмена локального компьютера с Windows. Хороший способ сделать это – использовать OSC 52, например, перенаправив вывод в этот скрипт, который я назвал sclip
:
#!/usr/bin/env python
import base64
import sys
message = sys.stdin.read()
encoded_message = base64.b64encode(message.encode()).decode()
print(f'\033]52;;{encoded_message}\007', end='', file=sys.stderr)
Очень скромно, очень заботливо. Однако, когда вы перенаправляете текст в этот скрипт внутри скрипта, который привязан с помощью bind-key
, этот текст не попадает в буфер обмена. Я предполагаю, что это происходит потому, что Byobu/tmux отображает вывод скрипта в окне less
, что препятствует срабатыванию магии OSC 52.
Есть ли решение этой проблемы или альтернативный способ для скрипта, привязанного с помощью bind-key
, чтобы скопировать текст в буфер обмена локального компьютера с Windows?
Ответ или решение
Для решения вашей задачи, связанной с копированием текста из скрипта, связанного с командой в Byobu (использующем tmux), в буфер обмена локальной Windows машины, можно использовать способ, позволяющий избежать проблем с отображением в less
. OSC 52 работает на основе передачи управляющих последовательностей, и если вывод вашего скрипта попадает в less
, эти управляющие последовательности могут быть проигнорированы.
Шаги для реализации решения:
-
Измените ваш скрипт
_polina_trek_echo.sh
:
Вместо того чтобы просто выводить текст, вы можете включить в него вызов вашего скриптаsclip
, который будет выполнять кодировку текста и отправлять его в буфер обмена:#!/bin/bash # Сохраните текст, который вы хотите скопировать TEXT_TO_COPY="Ваш текст для копирования" # Передайте текст в скрипт sclip echo "$TEXT_TO_COPY" | /path/to/sclip
Обратите внимание, что вы должны заменить
Ваш текст для копирования
на текст, который вы хотите скопировать. Если текст вычисляется динамически, вы можете использовать соответствующие команды для его получения. -
Убедитесь, что вывод скрипта не попадает в
less
:
Для того чтобы избежать появленияless
, при выполнении команды в tmux можно использовать;
для выполнения нескольких команд или использоватьsend-keys
. Попробуйте изменить привязку клавиши следующим образом:unbind-key p bind-key p send-keys "bash /home/ramrachum/bin/_polina_trek_echo.sh" Enter
В этом варианте используется
send-keys
, чтобы выполнить команду напрямую, что на уровне терминала будет предотвращать использованиеless
. -
Проверка работоспособности:
После выполнения вышеуказанных шагов проверьте, работает ли копирование текста в буфер обмена. Если все сделано правильно, то текст должен быть доступен в буфере обмена вашей локальной машины. -
Дополнительные рекомендации:
Если вам нужно передать динамически изменяемый текст, возможно, вам стоит передать его в качестве аргумента в_polina_trek_echo.sh
и адаптировать скрипт для работы с параметром. Пример скрипта:#!/bin/bash # Получаем текст из первого аргумента TEXT_TO_COPY="$1" # Передаем текст в sclip echo "$TEXT_TO_COPY" | /path/to/sclip
Затем вызов команды может выглядеть так:
bind-key p send-keys "bash /home/ramrachum/bin/_polina_trek_echo.sh 'Ваш текст'" Enter
Теперь это решение должно корректно копировать текст из вашего скрипта в буфер обмена локальной Windows машины без появления окна less
. Обязательно протестируйте все изменения и при необходимости отладьте путь к вашему скрипту sclip
.