Archive

Posts Tagged ‘xclip’

Copy string to X clipboards

March 5, 2011 2 comments

Problem

In a post on my other blog, I’ve presented two command-line utilities (xclip and xsel) to manipulate X selections.

At the end of that post, I pointed out a problem with these tools: they copy strings to one clipboard only. As we know, under X there are actually 3 different clipboards: the “primary”, the “secondary”, and the third that is simply called “clipboard”. The paste operation is available with the middle mouse button (for “primary”) or with Shift + Insert (for “clipboard”).

It must have happened to you too that you wanted to paste the contents of the clipboard and accidentally you pasted the contents of the other clipboard. It’s quite annoying… So, let’s make a Python script that works just like xclip or xsel, but the specified string is copied to all clipboards. Thus, you can use any paste method to insert your text :)

Solution

Here, I will copy the specified string to the “primary” and “clipboard” clipboards. The “secondary” clipboard is not very clear for me…

Our script will be a wrapper around xsel, thus first we need to install this tool:

sudo apt-get install xsel

Then, here is the script:

#!/usr/bin/env python

# tocb.py ("to clipboard(s)")

import sys
import subprocess

###############################################

def text_to_clipboards(text):
    # "primary":
    xsel_proc = subprocess.Popen(['xsel', '-pi'], stdin=subprocess.PIPE)
    xsel_proc.communicate(text)
    # "clipboard":
    xsel_proc = subprocess.Popen(['xsel', '-bi'], stdin=subprocess.PIPE)
    xsel_proc.communicate(text)

###############################################

stuff = sys.stdin.read()
text_to_clipboards(stuff)

In Python, sys.stdin is a file-like object; we read everything from the standard input, then this string is copied to the clipboards using the xsel tool.

Usage

I recommend saving the script above under the name “tocb.py” somewhere (for instance in ~/python/clipboard/tocb.py). Then put a symbolic link on the script called “tocb“. Make sure that the symbolic link is in the PATH. The usage of the script is similar to xsel or xclip:

cat file.txt | tocb

Now the contents of file.txt is on the clipboards. You can paste it either with the middle mouse button or with Shift + Insert.

Future work

The script could be improved to treat some command line parameters too like “-c” to clear to clipboards or “-o” to print the contents of the clipboard, etc.

Update (20110402)

The script is pushed to GitHub: https://github.com/jabbalaci/Bash-Utils.

Categories: python Tags: , ,