Выполнение OSC 52 копирования с команд, привязанных к клавишам tmux

Вопрос или проблема

Я подключаюсь со своего локального компьютера с 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, эти управляющие последовательности могут быть проигнорированы.

Шаги для реализации решения:

  1. Измените ваш скрипт _polina_trek_echo.sh:
    Вместо того чтобы просто выводить текст, вы можете включить в него вызов вашего скрипта sclip, который будет выполнять кодировку текста и отправлять его в буфер обмена:

    #!/bin/bash
    
    # Сохраните текст, который вы хотите скопировать
    TEXT_TO_COPY="Ваш текст для копирования"
    
    # Передайте текст в скрипт sclip
    echo "$TEXT_TO_COPY" | /path/to/sclip

    Обратите внимание, что вы должны заменить Ваш текст для копирования на текст, который вы хотите скопировать. Если текст вычисляется динамически, вы можете использовать соответствующие команды для его получения.

  2. Убедитесь, что вывод скрипта не попадает в 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.

  3. Проверка работоспособности:
    После выполнения вышеуказанных шагов проверьте, работает ли копирование текста в буфер обмена. Если все сделано правильно, то текст должен быть доступен в буфере обмена вашей локальной машины.

  4. Дополнительные рекомендации:
    Если вам нужно передать динамически изменяемый текст, возможно, вам стоит передать его в качестве аргумента в _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.

Оцените материал
Добавить комментарий

Капча загружается...