Отправка в глобальный буфер обмена из командной строки в режиме редактирования Vi

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

Я использую Arch, bash и терминал gnome.
Все обновлены до самых последних версий программного обеспечения.

Я хочу связать ctrl+c, чтобы копировать текущую строку в командной строке в глобальный буфер обмена, который может еще не быть в файле истории. Пока что мне это не удалось.

Анализировать файл истории проблематично, потому что строка в командной строке может быть скопирована до выполнения команды, в этом случае она не попадет в файл истории, поэтому такой подход не является приемлемым.

.bashrc имеет включенные привязки vi следующим образом

# set editing-mode vi
set -o vi

Я тщательно перезагружаю каждый раз, когда это необходимо, с помощью source ~/.bashrc.

Я попробовал добавить следующие варианты в .inputrc, заново инициализируя каждый раз с bind -f ~/.inputrc, но ни один не сработал.

Тесты .inputrc:

$if mode=vi
    "\C-y": " \C-e\C-u\C-k\C-y\C-l\C-y\C-e\C-y\n"
$endif
    

и это

$if mode=vi
    "\C-c": "\e0\C-k\C-u\C-y\n"
$endif

и эти

"\"+y": yank-to-clipboard

"\Cc": copy-line          # ctrl+c
"\^C": copy-line          # ctrl+c
"\006": copy-line         # ctrl+c 

Тесты .bashrc:

Я также попробовал добавить следующее в .bashrc

bind -m vi-command '"\C-y": "fc -ln -0 | tr -d \"\\n\" | xclip -selection clipboard\n"'

затем

copy_current_command() {
    local cmd
    cmd=$(fc -ln -0)
    echo -n "$cmd" | xclip -selection clipboard
}

bind -m vi-command '"\C-c": "copy_current_command\n"'  

Ниже также не работает

Это .inputrc

"\e[1;6C": yank-to-clipboard # ctrl+shift+c
"\^C": yank-to-clipboard     # ctrl+c

и это в .bashrc

yank-to-clipboard() {
    local line=$(readline)   # get the current line
    echo "$line" | xclip -in -selection clipboard
}

Ниже работает, но, на мой взгляд, это совсем не элегантное решение.

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

Я использую терминал gnome, и решение основано на настройке ctrl + - (ctrl + минус) в качестве ярлыка в настройках терминала Gnome для выделения всего текста перед копированием.

Это работает, но, конечно, должен быть лучший способ.

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

И я забыл об этом, как о неразрешимой проблеме, пока это не начало раздражать меня снова недавно.

В каком терминале люди работают, когда копируют много bash, прототипируя команды из командной строки в текстовую записную книжку? Конечно, в этом терминале должна быть клавиша-сочетание для выделения текущего содержимого командной строки и его вставки в глобальный буфер обмена.

#!/bin/bash

# Ярлык в терминале Gnome для выделения всего в окне терминала — "ctrl + -"
xdotool key ctrl+minus

sleep 0.2

# Копировать все в окне терминала в глобальный буфер обмена 
xdotool key ctrl+shift+c

sleep 0.2

# Создать переменную из содержимого текущего окна терминала
terminal_window_contents=$(xclip -o -selection clipboard);

# Взять только последнюю строку и отбросить подсказку перед и включая знак "$"
terminal_window_contents="$(echo -e "$terminal_window_contents" | tail -n 1 | sed 's/.*$ //g')"
    
# Вставить это в глобальный буфер обмена
echo -e "$terminal_window_contents" | xclip -selection clipboard  -rmlastnl

# Отменить выделение текста, кликнув в середину активного окна 
xdotool getactivewindow getwindowgeometry --shell | awk -F= '/WIDTH|HEIGHT/{printf "%d ", $2/2} END{print "click 1"}' | xargs xdotool mousemove --window $(xdotool getactivewindow)

# Проверить, сработало ли копирование
#yad --text="$terminal_window_contents"

Ответ или решение

Использование Vi-режима в Bash для управления буфером обмена — задача, требующая понимания настройки терминала и интеграции инструментов командной строки. Проблема в том, что вы хотите копировать текущую строку из командной строки в буфер обмена, даже если строка еще не была обработана и, следовательно, не отображается в файле истории. Рассмотрим теоретические аспекты, предложенные решения, а также их применение в вашем случае.

Теория

Vi-режим в командной строке bash предлагает мощные возможности текстового редактирования, однако его функциональность ограничена в областях управления буфером обмена без использования дополнительных инструментов. Основной вызов — перенести строку из текущей команды в системный буфер обмена, что требует взаимодействия с различными утилитами, такими как xclip, и знание подходящего способа их интеграции с командной оболочкой.

Пример

Ваш текущий подход включает использование xclip и xdotool. Это разумный путь, поскольку позволяет взаимодействовать с системным буфером обмена, однако проблема изящности этого решения остается. Ваш подход через xdotool включает автоматизацию, которая несколько громоздка и может быть не самой продуктивной.

Применение

Для более элегантного решения можно применить альтернативные инструменты или скрипты. Поскольку bash и vi предлагают основы для манипуляций с текстом, необходимо сосредоточиться на интеграции с X-сервером для работы с буфером обмена.

Предложения:

  1. Используйте xclip без xdotool: Это может упростить процесс. Например, воспользуйтесь функцией в .bashrc, которая захватывает текущую команду и немедленно отправляет ее в буфер обмена:

    yank_to_clipboard() {
        local cmd
        cmd=$(fc -ln -0)     # Забираем текущую строку из истории команд fc (прямая манипуляция через fc)
        echo -n "$cmd" | xclip -selection clipboard # Копируем в буфер обмена
    }
    
    bind -m vi-command '"\C-c": "yank_to_clipboard\n"'

    Этот скрипт автоматически передает последнюю команду в буфер обмена. Не потребуется дополнительных утилит вроде xdotool.

  2. Используйте pbcopy и pbpaste: Если вам подходит работа в MacOS или эта утилита установлена в вашей системе, попробуйте заменить xclip на pbcopy/pbpaste.

  3. Логические горячие клавиши: Убедитесь, что используемые клавиши не конфликтуют с другими привязками в вашей системе. Подумайте о назначении более специфической или редко используемой комбинации клавиш.

  4. Тестирование эффективности: Каждый раз, когда вы изменяете .bashrc или .inputrc, завершая внесение изменений, убедитесь, что результаты кэшируются, используя source ~/.bashrc или bind -f ~/.inputrc, чтобы изменения вступили в силу.

Заключение

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

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

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