15

在我的.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 的剪贴板与 the-rest-of-the-world 集成?

当然,我在这里考虑一些.inputrc魔法,但欢迎任何见解/想法。

4

4 回答 4

15

Bash 4.0 引入了一些新功能:

消息

分配给带有 ' bind -x' 键序列的命令现在在执行命令的环境中设置了两个新变量: READLINE_LINE_BUFFERREADLINE_POINTREADLINE_LINE_BUFFER该命令可以通过分别修改和来改变当前的 readline 行和光标位置READLINE_POINT

NEWS文件似乎不准确;READLINE_LINE(no _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。

于 2009-07-06T19:16:57.940 回答
5

就个人而言,我在GNU screen中运行所有内容。这为我提供了所有基于终端的程序的大量功能,而不仅仅是基于 readline 的程序。它有自己的粘贴缓冲区,在当前会话中的所有屏幕之间共享,并且可以读取/写入交换文件(可使用 配置bufferfile)。

  • 使用Ctrl+ A[、 <移动>、Space、 <移动> 进行屏幕选择;
  • 复制到粘贴缓冲区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 选择粘贴到终端),但这完全取决于你。

于 2009-06-17T00:40:59.373 回答
5

我想_xyank()根据 ehemient 的回答提出以下功能:

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

这样做的目的是将光标移动到被拉出的文本的末尾,使其与其他内置命令更加一致。

于 2010-02-03T00:09:37.117 回答
0

正如我在这里所写,我发现使用单独的键绑定来填充 X 剪贴板会更好,这是因为我经常在 Readline 中使用“kill”进行文本操作,而且我不希望每次都清除剪贴板.

当 Readline 能够拥有触发与 X 交互的键绑定时,我建议绑定 ^Xw 和 ^Xy 以进行复制和粘贴。

我知道这不能为您的问题提供解决方案,但我没有足够的代表在评论中说出来。

至于扩展 Readline 以将键绑定到命令的能力,我在 Readline 邮件列表中提出了它,我们将看看 Chet 是怎么说的:

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

于 2016-05-02T21:57:34.607 回答