PROJET AUTOBLOG


Planet-Libre

source: Planet-Libre

⇐ retour index

Vincent Gay : Copie spéciale

mercredi 19 novembre 2014 à 19:42

Cela fait quelques temps que je pensais à un petit script pour me simplifier la vie dans certaines circonstances :

Je n'imaginais pas à quel point cela pouvait être facile... à une toute petite difficulté près.

Tout d'abord récupérer dans une variable le texte sélectionné ⇔ selection=$(xsel -o | tr "\\n" " "). Le paquet xsel doit être installé et tr est utilisé pour supprimer les retours chariot.

Le changement de casse est pris directement en compte par les versions de bash ≥ 4 : $(myVar^^) pour tout passer en majuscule, $(myVar,,)  pour tout passer en minuscule, man bash section "Parameter Expansion" pour en savoir plus. Curieusement il manque dans la page de man l'explication de $(myVar~~) qui inverse la casse, ce qui peut s'avérer bien pratique.

Remplacer un caractère par un autre est classiquement le travail de sed ⇔ echo $selection | sed "s/\\./,/g"

Pour la traduction j'ai trouvé mon bonheur sur un forum de crunchbang. J'ai repris et adapté la fonction et remercie ici son auteur. Si quelqu'un a une solution équivalente sans Google je suis preneur. Le paquet html2text doit être installé.

Pour manipuler le presse-papier en lignes de commande il existe l'outil xclip (du paquet du même nom). xclip -i -selection clipboard pour écrire dans le presse-papier, xclip -o -selection clipboard pour lire. man xclip pour plus de détails.

Enfin pour les notifications voir notify-send du paquet libnotify (pas de page de man ⇒ notify-send --help)

Reste à appeler le script avec les paramètres qui vont bien, ce que je fait, faute de mieux, avec les raccourcis clavier de mon environnement de travail. Avec OpenBox c'est relativement cool car les raccourcis claviers peuvent comporter des raccourcis secondaires (child keybind) à la Emac. Par exemple Ctrl-Y suivi de la lettre u pour mettre en majuscules ou Ctrl-Y suivi de la lettre l pour passer en minuscules. Voir le wiki d'openbox pour des explications plus claires (mais en anglais). Je ne sais pas si cela est possible dans d'autres environnements.

Quoiqu'il en soit cette solution n'est pas très élégante, mais je n'ai pas trouvé mieux.

Mon script scopy :

#! /bin/bash 
# dépendance xclip html2text libnotify
IFS=$'\\n'
NotifyTime=5000
traduction ()
{
# fonction provenant d'un script de Johnraff sur le forum de crunchbang
# http://crunchbang.org/forums/viewtopic.php?id=17034
result=$(curl -s -i --user-agent "" -d "sl=auto" -d "tl=$1" --data-urlencode "text=$selection" https://translate.google.com)
encoding=$(awk '/Content-Type: .* charset=/ {sub(/^.*charset=["'\\'']?/,""); sub(/[ "'\\''].*$/,""); print}' <<<"$result")
trad=$(iconv -f $encoding <<<"$result" |  awk 'BEGIN {RS="
"};/]* id=["'\\'']?result_box["'\\'']?/' | html2text | tr "\\n" " ") } selection=$(xsel -o | tr "\\n" " ") case $1 in u) # tout en majuscule echo ${selection^^} | xclip -i -selection clipboard;; l) # tout en minuscule echo ${selection,,} | xclip -i -selection clipboard;; i) # casse inverse echo ${selection~~} | xclip -i -selection clipboard;; v) # remplace le point par une virgule echo $selection | sed "s/\\./,/g" | xclip -i -selection clipboard;; p) # remplace la virgule par un point echo $selection | sed 's/,/\\./g' | xclip -i -selection clipboard;; a) # traduit de auto en anglais traduction "en" NotifyTime=15000 echo $trad | xclip -i -selection clipboard;; f) # traduit de auto en français traduction "fr" NotifyTime=15000 echo $trad | xclip -i -selection clipboard;; *) # cas non prévus echo "usage inattendu" | xclip -i -selection clipboard esac notify-send --icon=dialog-information -t $NotifyTime "scopy" $(xclip -o -selection clipboard)

Gravatar de Vincent Gay
Original post of Vincent Gay.Votez pour ce billet sur Planet Libre.