Подтвердить что ты не робот

Интегрируйте killline ringline и буфер обмена X11

В моем .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 my два компьютера используют один буфер обмена. Ухоженная. Но это не работает с readline. И я часто использую readline, например, в (i) python, в gdb, в ncftp...

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

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

4b9b3361

Ответ 1

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

  • Выбор экрана выполняется с помощью Ctrl + A, [, <movement> , Space, <movement> ;
  • скопирован в буфер пасты с помощью Enter;
  • с Ctrl + A, ];
  • заменяется содержимым файла обмена с Ctrl + A, <;
  • и записывается в файл обмена с 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-выбор в терминал), но это полностью зависит от вас.

Ответ 2

Bash 4.0 вводится несколько новых функций:

NEWS

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

Файл NEWS кажется неточным; READLINE_LINE (no _BUFFER) - это то, что описано в других местах и ​​фактически работает.

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

_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 больше, но это лучше отвечает на ваш вопрос — пока единственное приложение для чтения, которое вас интересует, - Bash.

Ответ 3

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

_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))
}

Это делается для перемещения курсора в конец выдернутого текста, что делает его более согласованным с другими встроенными командами.

Ответ 4

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

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

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

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

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