在bash和X11之间共享剪贴板


12

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

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

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


在gnome-terminal中,也可以键入Ctrl + Shift + C和Ctrl + Shift + V复制并粘贴到系统剪贴板。
Lie Ryan

2
看到这篇文章 stackoverflow.com/questions/994563/… 但这对我不起作用。
伟大的q

Answers:


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

如果要在shell中做一些花哨的事情,请切换到zsh,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

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


感谢@Gilles的想法!我认为现在是我学习并改用的时候了zsh
Amelio Vazquez-Reina

最后!谢谢一群!这copy_line_to_x_clipboard正是我很长时间以来一直缺少的东西:相当于shift + insert的副本。我更改为ctrl-x(bind -x '"\C-x"),因为Esc对我的口味而言太高了(而Cc将是最愚蠢的选择)。
pbarill

终端通常具有一个元键,默认情况下该键绑定到alt键。在按住该字符的同时键入字符会转换esc为该字符后跟的字符,因此您可以将其键入为alt-w
DoMiNeLa10

7

@吉尔斯已经给出了一个很好的答案。我只想提到存在xclip,这也是将终端输出通过管道传递到X剪贴板中的一种非常有用的方法:

$ cat /etc/passwd | xclip

1
请注意,xclip默认情况下会复制到主缓冲区中。要使用剪贴板,请使用xclip -selection clipboard
Sparhawk
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.