Send selected text to a command line argument
I found this utility, pytranslate, which translates a variety of languages into each other using Google's tra开发者_JAVA百科nslation API. It works exactly as described.
However I've gotten sick of selecting a word I do not understand, then middle-clicking it into the command. The command format is as such:
pytranslate WORD
Is there a program/script that has the ability to detect when I select a word, or a series of words with my mouse, and then executes the above command with the selected text in the place of WORD in a terminal window?
Example:
Selected text:
Bonjour mondiale...
Resultant command/result:
pytranslate Bonjour mondiale
Detected source language: fr
Hello World
#!/bin/bash
pytranslate "$(xsel -p)"
Now just put this in ~/bin
(make sure that's included in your PATH), and run it. (You may need to install the xsel package.) It will take the current contents of the primary selection buffer and pass it to pytranslate.
If you want it as a button, create a launcher which runs this in a terminal, and use bash's read command to do "Press ENTER to continue".
Taking inspiration from Roger Pate's brilliant one liner I've created a simple looping script for pytranslate. This is currently provisional - as I haven't implemented error catching yet - wait for new edits.
#!/bin/bash
# Primary Clipboard poller using xsel (middle click) and pytranslate
# Checks for changes every 1 second
# If change has occured, a command is executed (pytranslate here)
########## Information ##########
# It now stores definitions in a text file - saves bandwith and reduces hits on google (caseless)
# Works for Romance languagse
#TODO
# Character based langauges
# Catch errors
if [ ! -e "pytranslatecache" ]; then
touch pytranslatecache
fi
while [ 1 ]
do
OLDENTRY="$(xsel -p)"
sleep 1
NEWENTRY="$(xsel -p)"
if [ "$NEWENTRY" != "$OLDENTRY" ] ; then
if [ "$(grep -F -o -i "$NEWENTRY" pytranslatecache)" = "$NEWENTRY" ] ; then
echo "From Cache:"
echo "$(grep -i "$NEWENTRY" pytranslatecache)"
else
DEFINITION=""$(pytranslate -s fr "$(xsel -p)")""
echo "$NEWENTRY"":"$DEFINITION
echo "$NEWENTRY"":"$DEFINITION >> pytranslatecache
fi
fi
# Catch Errors - Commands
if [ $? != 0 ]; then
{
echo "Failed to translate string."
} fi
done
Would you be able to use clipboard support in the PyGTK package to do the job? It claims to have access to the "primary" X clipboard which it says is where you'd normally find the selected text.
Note: this answer was useless to the questioner, who wasn't using Windows. Given that the title doesn't specify the OS, I'll leave it around for Windows users who may come this way.
You can easily whip one up yourself using the pywin32 package and the win32clipboard module. See, for example, this question.
I've done this in the past with a routine that just polled the clipboard periodically, every few seconds or so, and whenever it found a change it grabbed the contents and did something with it. In your case, use the subprocess package to call out to pytranslate with the text.
精彩评论