在 bash 和 X11 之间共享剪贴板

Ame*_*ina 13 bash x11 clipboard

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

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

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

Gil*_*il' 10

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

M-w除了bash的内部剪贴板之外,您可以做的是更改将选择复制到X剪贴板¹的含义。然而 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
Run Code Online (Sandbox Code Playgroud)

如果您想在 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
Run Code Online (Sandbox Code Playgroud)

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


rap*_*ink 7

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

$ cat /etc/passwd | xclip
Run Code Online (Sandbox Code Playgroud)

  • 请注意,默认情况下“xclip”会复制到主缓冲区中。要使用剪贴板,请使用“xclip -selection剪贴板”。 (3认同)