集成readline的kill-ring和X11剪贴板

时间:2009-06-15 05:12:41

标签: shell unix clipboard readline

在我的.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巫术,但欢迎任何见解/想法。

4 个答案:

答案 0 :(得分:13)

Bash 4.0引入了一些新功能:

  

NEWS

     

分配给具有“bind -x”的键序列的命令现在设置两个新的   执行命令环境中的变量:READLINE_LINE_BUFFER   和READLINE_POINT。该命令可以更改当前的readline行   通过修改READLINE_LINE_BUFFERREADLINE_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配置)。

  • 使用 Ctrl + A [,&lt; 运动&gt;,<进行屏幕选择kbd>空间,&lt; 运动&gt;;
  • 使用 Enter ;
  • 复制到粘贴缓冲区
  • 粘贴 Ctrl + A ] ;
  • 由交换文件的内容替换为 Ctrl + A &lt; ;
  • 并使用 Ctrl + A &gt; 写到交换文件。

然后您需要的只是小助手来同步/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