Вопрос или проблема
Я использую 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-сервером для работы с буфером обмена.
Предложения:
-
Используйте
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
. -
Используйте
pbcopy
иpbpaste
: Если вам подходит работа в MacOS или эта утилита установлена в вашей системе, попробуйте заменитьxclip
наpbcopy/pbpaste
. -
Логические горячие клавиши: Убедитесь, что используемые клавиши не конфликтуют с другими привязками в вашей системе. Подумайте о назначении более специфической или редко используемой комбинации клавиш.
-
Тестирование эффективности: Каждый раз, когда вы изменяете
.bashrc
или.inputrc
, завершая внесение изменений, убедитесь, что результаты кэшируются, используяsource ~/.bashrc
илиbind -f ~/.inputrc
, чтобы изменения вступили в силу.
Заключение
Вероятно, лучшее решение вашей проблемы заключается в оптимизированном использовании xclip
, однако настройка командной строки требует тщательного подхода к деталям и может отличаться в зависимости от конкретных сценариев использования или конфигураций системы. Пробуйте различные комбинации и инструменты, возможно, адаптация и поиск новых методов предложат более оптимальные пути достижения цели. Весьма полезно оставаться активным в технических сообществах, где можно черпать свежие идеи.