Поделитесь буфером обмена между Bash и X11

11

В этой теме верхний ответ показывает, как скопировать текст, который был ранее выделен мышью на терминале gnome, в буфер обмена в X11.

Мой вопрос: скажем, я копирую часть текста с терминала, используя bash set-mark и копирую сочетания клавиш (то есть set-mark+ M-w). Можно ли поделиться этим буфером обмена с X11?

РЕДАКТИРОВАТЬ : В первоначальном вопросе я говорил о совместном использовании буфера обмена с GNOME, но, как указывает Жиль ниже, GNOME специально не имеет буфера обмена (это общее для X), поэтому я обновил вопрос.

Амелио Васкес-Рейна
источник
В gnome-Terminal вы также можете нажать Ctrl + Shift + C и Ctrl + Shift + V, чтобы скопировать и вставить в системный буфер обмена.
Ли Райан
2
Смотрите этот пост stackoverflow.com/questions/994563/… Но это не работает для меня.
отлично,

Ответы:

9

Буфер обмена Bash является внутренним для bash, bash не подключается к X-серверу.

Что вы могли бы сделать, это изменить значение, M-wчтобы скопировать выделение в буфер обмена X в дополнение к внутреннему буферу обмена bash. Однако интеграция с bash довольно слабая, и я не думаю, что есть способ получить доступ к информации о регионе или к буферу обмена из кода bash. Вы можете сделать привязку клавиш, чтобы скопировать всю строку в буфер обмена X.²

if [[ -n $DISPLAY ]]; then
  copy_line_to_x_clipboard () {
    printf %s "$READLINE_LINE" | xsel -ib
  }
  bind -x '"\eW": copy_line_to_x_clipboard'
fi

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

if [[ -n $DISPLAY ]]; then
  x-copy-region-as-kill () {
    zle copy-region-as-kill
    print -rn -- "$CUTBUFFER" | xsel -ib
  }
  x-kill-region () {
    zle kill-region
    print -rn -- "$CUTBUFFER" | xsel -ib
  }
  zle -N x-copy-region-as-kill
  zle -N x-kill-region
  bindkey '\C-w' x-kill-region
  bindkey '\ew' x-copy-region-as-kill
fi

¹ Gnome специально не имеет буфера обмена, это общее для X.
² Начиная с bash 4.1, в коде синтаксического анализа ключа есть ошибка: связанные последовательности ключей bind -xмогут содержать не более двух символов. Я думаю, что bash 4.2 исправляет некоторые случаи более длинных префиксов, но не все из них; Я не исследовал детали.

Жиль "ТАК - перестань быть злым"
источник
Спасибо за идею @ Жиль! Думаю, мне пора учиться и переключаться на zsh.
Амелио Васкес-Рейна
В заключение! Огромное спасибо! Это copy_line_to_x_clipboardименно то, чего мне не хватало очень долгое время: копия, эквивалентная shift + insert. Я изменил на ctrl-x ( bind -x '"\C-x"), потому что Escэто слишком далеко от моего вкуса (и Cc будет самым тупым возможным выбором).
pbarill
Терминалы обычно имеют мета-ключ, который по умолчанию связан с ключом alt. При вводе символа, удерживая его нажатым, переводится следующий за escним символ, поэтому вы можете ввести его как alt-w.
DoMiNeLa10
7

@ Жиль уже дал отличный ответ. Я просто хотел бы упомянуть о существовании xclip, которое также является очень полезным способом скопировать вывод терминала в буфер обмена X, просто добавив в него что-нибудь:

$ cat /etc/passwd | xclip
ℝaphink
источник
1
Просто примечание, которое xclipпо умолчанию копируется в основной буфер. Чтобы использовать буфер обмена, используйте xclip -selection clipboard.
Sparhawk