13

In this thread the top answer shows how to copy text that has been previously selected with the mouse on a gnome-terminal, to the clipboard in X11.

My question is: Say I copy a piece of text from the terminal using bash set-mark and copy keyboard shortcuts (i.e. set-mark + M-w). Is it possible to share this clipboard with X11?

EDIT: In the original question, I talked about sharing the clipboard with GNOME, but as Gilles points out below, GNOME doesn't specifically have a clipboard (it's general to X), so I have updated the question.

  • In gnome-terminal, you can also type Ctrl+Shift+C and Ctrl+Shift+V to copy and paste to the system clipboard. – Lie Ryan Aug 14 '11 at 17:49
  • 2
    See this post http://stackoverflow.com/questions/994563/integrate-readlines-kill-ring-and-the-x11-clipboard/28385543#28385543 But it is not working for me. – great q Feb 07 '15 at 18:05

2 Answers2

11

Bash's clipboard is internal to bash, bash doesn't connect to the X server.

What you could do is change the meaning of M-w to copy the selection to the X clipboard¹ in addition to bash's internal clipboard. However bash's integration is pretty loose, and I don't think there's a way to access the region information or the clipboard from bash code. You can make a key binding to copy the whole line to the X clipboard.²

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

If you want to do fancy things in the shell, switch to zsh, which (amongst other advantages) has far better integration between the line editor and the scripting language.

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 doesn't specifically have a clipboard, this is general to X.
² As of bash 4.1, there is a bug in the key parsing code: key sequences bound with bind -x may not be more than two characters long. I think bash 4.2 fixes some cases of longer prefixes but not all of them; I haven't researched the details.

  • Finally! Thanks a bunch! This copy_line_to_x_clipboard is exactly what I was missing for a very long time: the copy equivalent of shift+insert. I changed to ctrl-x (bind -x '"\C-x") because Esc is too far to my taste (and C-c would be the dumbest possible choice). – pbarill Jul 15 '18 at 17:26
  • Terminals normally have a meta key, which is bound to the alt key by default. Typing a character while holding it down is translated to esc followed by that character, so you can type it as alt-w. –  Oct 18 '18 at 19:16
9

@Gilles already gave an excellent answer. I would just like to mention the existence of xclip, which is also a very useful way to copy terminal output to the X clipboard, by just piping anything into it:

$ cat /etc/passwd | xclip
Michael Mrozek
  • 93,103
  • 40
  • 240
  • 233
raphink
  • 289
  • 3
    Just a note that xclip copies into the primary buffer by default. To use the clipboard, use xclip -selection clipboard. – Sparhawk May 30 '14 at 06:23