在 bash 和 X11 之间共享剪贴板

在 bash 和 X11 之间共享剪贴板

这个线程最上面的答案显示了如何将先前在 gnome 终端上用鼠标选择的文本复制到 X11 中的剪贴板。

我的问题是:假设我使用 bash 设置标记从终端复制一段文本并复制键盘快捷键(即set-mark+ M-w)。可以和X11共享这个剪贴板吗?

编辑:在原来的问题中,我谈到了与 GNOME 共享剪贴板,但正如 Gilles 在下面指出的那样,GNOME 没有专门有剪贴板(它对 X 来说是通用的),所以我更新了这个问题。

答案1

Bash 的剪贴板是 bash 内部的,bash 不连接到 X 服务器。

M-w您可以做的就是更改将选择内容复制到 X 剪贴板以及 bash 的内部剪贴板的含义。然而 bash 的集成相当松散,我认为没有办法从 bash 代码访问区域信息或剪贴板。您可以进行键绑定以将整行复制到 X 剪贴板。²

if [[ -n $DISPLAY ]]; then
  copy_line_to_x_clipboard () {
    printf %s "$READLINE_LINE" | xsel -ib
  }
  bind -x '"\eW": copy_line_to_x_clipboard'
fi

如果您想在 shell 中做一些奇特的事情,请切换到 zsh,它(除其他优点外)在行编辑器和脚本语言之间具有更好的集成。

if [[ -n $DISPLAY ]]; then
  x-copy-region-as-kill () {
    zle copy-region-as-kill
    print -rn -- "$CUTBUFFER" | xsel -ib
  }
  x-kill-region () {
    zle kill-region
    print -rn -- "$CUTBUFFER" | xsel -ib
  }
  zle -N x-copy-region-as-kill
  zle -N x-kill-region
  bindkey '\C-w' x-kill-region
  bindkey '\ew' x-copy-region-as-kill
fi

1 Gnome 没有专门的剪贴板,这对于 X 来说是通用的。
2 从 bash 4.1 开始,按键解析代码中存在一个错误:绑定的按键序列bind -x可能不超过两个字符长。我认为 bash 4.2 修复了一些较长前缀的情况,但不是全部;具体细节我还没有研究过。

答案2

@Gilles 已经给出了一个很好的答案。我只想提一下 的存在xclip,这也是将终端输出复制到 X 剪贴板的非常有用的方法,只需将任何内容通过管道传输到其中即可:

$ cat /etc/passwd | xclip

相关内容