在我的.zshrc
中,我使用以下代码段来集成shell的剪贴板和我的主要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
巫术,但欢迎任何见解/想法。
答案 0 :(得分:13)
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
,但这更好地回答了您的问题 - 只要您关注的唯一的readline应用程序是Bash。
答案 1 :(得分:5)
就个人而言,我在GNU screen内运行所有内容。这为所有基于终端的程序提供了大量功能,而不仅仅是基于readline的程序。它有自己的粘贴缓冲区,它们在当前会话的所有屏幕之间共享,并且可以读/写交换文件(可以bufferfile
配置)。
然后您需要的只是小助手来同步/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 :(得分:5)
我想根据ephemient的答案提出以下_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))
}
这样做是将光标移动到被拉动的文本的末尾,使其与其他内置命令更加一致。
答案 3 :(得分:0)
当我写here时,我发现使用单独的键绑定来填充X剪贴板会更好,这是因为我经常使用&#34; kill&#34;在Readline中进行文本操作,我不希望每次都删除剪贴板。
当Readline能够获得触发与X交互的键绑定时,我建议绑定^ Xw和^ Xy进行复制和粘贴。
我知道这并不能解决您的问题,但我没有足够的代表在评论中说出来。
至于扩展Readline能够将键绑定到命令,我将其提交到Readline邮件列表,我们将看到Chet所说的内容:
https://lists.gnu.org/archive/html/bug-readline/2016-05/msg00002.html