Copie spéciale
Cela fait quelques temps que je pensais à un petit script pour me simplifier la vie dans certaines circonstances :
- quand le clavier est verrouillé en majuscule et que je ne m'en rends compte qu'au bout d'une minute (et oui, je ne sais pas taper sans regarder mes doigts) !
- quand je dois copier coller une zone numérique dont le séparateur décimal est un point au lieu d'une virgule (ou inversement)
- quand je veux traduire à la volée un texte d'un document quelconque ailleurs que sur le web (page de man par exemple)
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="</div>"};/<span[^>]* 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)