Интегрируйте 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
здесь, но любые идеи и идеи будут приветствоваться.
Ответы
Ответ 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