Интегрируйте список убийств readline и буфер обмена X11 - PullRequest
12 голосов
/ 15 июня 2009

В моем .zshrc я использую следующий фрагмент кода для интеграции буфера обмена оболочки и моего основного буфера обмена X11. Благодаря этой интеграции я могу вырезать и вставлять текст в emacs, firefox и терминал и обратно без необходимости использовать мышь.

kill-line() { zle .kill-line ; echo -n $CUTBUFFER | xclip -i }
zle -N kill-line # bound on C-k

yank() { LBUFFER=$LBUFFER$(xclip -o) }
zle -N yank # bound on C-y

Примечание: я использую этот трюк и на Mac OS X (с pbcopy / pbpaste вместо xclip), и благодаря Synergy мои два компьютера используют один буфер обмена. Ухоженная. Но это не работает с readline. И я часто использую readline, например, в (i) python, в gdb, в ncftp ...

Итак, вот мой вопрос: есть ли способ интегрировать буфер обмена readline с остальным миром?

Конечно, я думаю о некотором волшебстве .inputrc здесь, но любые идеи / идеи приветствуются.

Ответы [ 4 ]

13 голосов
/ 06 июля 2009

Bash 4.0 вводит некоторые новые функции:

НОВОСТИ

Команда, назначенная последовательности клавиш с `bind -x ', теперь устанавливает два новых переменные в среде исполняемой команды: READLINE_LINE_BUFFER и READLINE_POINT. Команда может изменить текущую строку readline и положение курсора путем изменения READLINE_LINE_BUFFER и READLINE_POINT, соответственно.

Файл NEWS кажется неточным; READLINE_LINE (нет _BUFFER) - это то, что задокументировано и действительно работает.

Следующее будет имитировать поведение существующего Bash Ctrl + ( U | K | Y ), но влияет на выбор X хотя я использую Meta / Esc , потому что не люблю перезаписывать существующие функции.

_xdiscard() {
    echo -n "${READLINE_LINE:0:$READLINE_POINT}" | xclip
    READLINE_LINE="${READLINE_LINE:$READLINE_POINT}"
    READLINE_POINT=0
}
_xkill() {
    echo -n "${READLINE_LINE:$READLINE_POINT}" | xclip
    READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}"
}
_xyank() {
    READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}$(xclip -o)${READLINE_LINE:$READLINE_POINT}"
}
bind -m emacs -x '"\eu": _xdiscard'
bind -m emacs -x '"\ek": _xkill'
bind -m emacs -x '"\ey": _xyank'

Мне все еще нравится screen, но это лучше отвечает на ваш вопрос & mdash; пока единственное приложение readline, о котором вы заботитесь, это Bash.

5 голосов
/ 03 февраля 2010

Я хотел бы предложить следующую _xyank() функцию, основанную на ответе ephemient:

_xyank() {
    CLIP=$(xclip -o)
    COUNT=$(echo -n "$CLIP" | wc -c)
    READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}${CLIP}${READLINE_LINE:$READLINE_POINT}"
    READLINE_POINT=$(($READLINE_POINT + $COUNT))
}

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

5 голосов
/ 17 июня 2009

Лично я запускаю все внутри экрана GNU . Это дает мне массу функциональных возможностей для всех программ, основанных на терминалах, а не только для основанных на readline. Он имеет свой собственный буфер (буферы) вставки, которые используются всеми экранами в текущем сеансе и могут читать / записывать файл обмена (настраивается с помощью bufferfile).

  • Выбор экрана производится с помощью Ctrl + A , [, <<em> движение >, Пробел, <<em> движение >;
  • скопировано в буфер вставки с помощью Введите ;
  • вставлено с помощью Ctrl + A , ] ;
  • заменено содержимым файла обмена с Ctrl + A , <</kbd>;
  • и записывается в файл обмена с помощью Ctrl + A , > .

Тогда все, что вам нужно, это маленькие помощники для синхронизации /tmp/screen-exchange и выбора X. Что-то простое, как это будет работать.

# ~/.screenrc (or entered at C-a : command prompt)
bind '{' exec sh -c 'xclip -o>~/.screen_exchange'
bind '}' exec sh -c 'xclip -i ~/.screen_exchange'

Конечно, некоторые более приятные привязки и макросы облегчили бы жизнь (для этого нужно C-a { C-a < C-a ] вставить X-выбор в терминал), но это полностью ваше дело.

0 голосов
/ 03 мая 2016

Когда я писал здесь , я обнаружил, что может быть приятнее иметь отдельные сочетания клавиш для заполнения буфера обмена X, это потому, что я часто использую «kill» для манипулирования текстом в Readline, и я не хочу, чтобы это каждый раз стирало буфер обмена.

Когда Readline когда-либо получит возможность сочетания клавиш, которые инициируют взаимодействие с X, я бы рекомендовал связать ^ Xw и ^ Xy для копирования и вставки.

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

Что касается расширения Readline с возможностью привязки клавиш к командам, я поднял его в списке рассылки Readline, посмотрим, что скажет Чет:

https://lists.gnu.org/archive/html/bug-readline/2016-05/msg00002.html

...