Поділіться буфером обміну між bash та X11


12

У цій темі у верхній відповіді показано, як скопіювати текст, який був раніше обраний мишею, на gnome-термінал, до буфера обміну X11.

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

EDIT : У первинному питанні я говорив про обмін буфером обміну з GNOME, але, як Гілль вказує нижче, GNOME спеціально не має буфера обміну (звичайно це для X), тому я оновив питання.


У gnome-terminal можна також ввести Ctrl + Shift + C і Ctrl + Shift + V, щоб скопіювати та вставити в системний буфер обміну.
Лі Лі Райан

2
Дивіться цю публікацію stackoverflow.com/questions/994563/… Але це не працює для мене.
чудово q

Відповіді:


10

Буфер обміну 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.
² Як Баш 4.1, є помилка в ключовому коді парсинга: ключові послідовності , пов'язані з bind -xне може бути більше двох символів. Я думаю, що bash 4.2 виправляє деякі випадки довших префіксів, але не всі; Я не досліджував деталей.


Дякую за ідею @Gilles! Я думаю, що мені пора вчитися і переходити до zsh.
Амеліо Васкес-Рейна

Нарешті! Дякую купу! Це copy_line_to_x_clipboardсаме те, чого мені бракувало дуже довго: еквівалент копії shift + вставка. Я змінив на ctrl-x ( bind -x '"\C-x"), тому що Escце занадто далеко на мій смак (і Cc був би найглумишим можливим вибором).
пбарілл

Зазвичай термінали мають мета-ключ, який за замовчуванням прив’язаний до клавіші alt. Введення символу, утримуючи його, перекладається escза цим символом, тому ви можете ввести його як alt-w.
DoMiNeLa10

7

@Gilles вже дав чудову відповідь. Я просто хотів би згадати про існування xclip, що також є дуже корисним способом копіювання вихідного терміналу в буфер обміну X, просто проклавши все в нього:

$ cat /etc/passwd | xclip

1
Просто примітка, яка xclipза замовчуванням копіюється в основний буфер. Для використання буфера обміну використовуйте xclip -selection clipboard.
Спархак
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.