Hier, je vous ai parlé de Clipboard, un module permettant d'accéder au presse-papier de votre système d'exploitation. Aujourd'hui, je vais compléter ces informations avec quelques subtilités concernant l'utilisation de Clipboard sous Linux.
Alors que Clipboard utilise les outils natifs sous Windows et Mac OS X, il s'appuie sur un petit utilitaire sous Linux. Cet utilitaire, xclip, permet de manipuler le contenu des presse-papier sous X11, et oui, vous avez bien lu, j'ai bien écrit le contenu des presse-papier. Car sous X11, nous en avons plusieurs à disposition, et ceci ne va pas sans poser quelques problèmes à l'occasion.
Dans la page de documentation d'xclip, on nous explique qu'il y a trois presse-papier disponibles :
- primary, utilisé par défaut, donc, quand vous sélectionnez du texte sous X11, il est automatiquement copié dans ce presse-papier, et vous pouvez y accéder via un clic du troisième bouton de votre souris (et si votre souris n'a pas de troisième bouton, vous pouvez l'émuler ; par exemple, par le clic simultané du clic gauche et du clic droit) ;
- secondary, ce qui est cohérent avec l'existence d'un primary ;
- clipboard, qui est employé par votre window manager, et donc, par exemple sous Gnome, ce qui est copié via Ctrl-c et collé via Ctrl-v.
Dans un des outils développés accédant au presse-papier pour trouver les informations à traiter, je préférais utiliser le clipboard plutôt que le primary (j'utilise ce script quotidiennement, et sur des machines n'ayant pas toujours une souris externe, et la combinaison clic gauche/clic droit est parfois irritante sur certains trackpads). J'ai donc été lire le module et j'ai constaté qu'une gestion des différents presse-papier avait été mise en place :
-
une méthode
paste_from_selection()permettant de prendre l'information à partir d'un des presse-papier à disposition ; -
une méthode
copy_to_selection()permettant de copier de l'information vers un presse-papier particulier.
Je pouvais donc travailler de la manière suivante :
#!/usr/bin/env perl
use strict;
use warnings;
use Clipboard;
my $text = Clipboard::Xclip->paste_from_selection('clipboard'); # pour récupérer le texte du presse-papier
Clipboard::Xclip->copy_to_selection('clipboard', 'Balh blah blah'); # pour coller du texte dans le presse-papier
Malheureusement, j'utilise ces scripts également avec Windows et Mac OS X, il
était donc hors de question d'avoir des appels directs à
paste_from_selection() ou copy_to_selection(). Il me restait donc la
solution de tester $^O pour connaître mon environnement d'exécution et
adapter le comportement de mon programme en fonction, ou alors utiliser le
hack suivant.
Dans Clipboard::Xclip, une autre méthode est définie pour définir le
presse-papier favori, cette méthode s'appelle favorite_selection(), dont
voici la définition :
sub favorite_selection { ($self->all_selections)[0] } # retourne le premier presse-papier disponible, donc primary
sub all_selections { qw(primary buffer clipboard secondary) } # liste les presse-papier disponibles
Il me suffit donc de redéfinir la fonction favorite_selection() pour lui
faire sélectionner mon presse-papier favori. Voici donc le code :
undef &Clipboard::Xclip::favorite_selection; # on « supprime » la définition de la méthode favorite_selection
*Clipboard::Xclip::favorite_selection = sub { 'clipboard' }; # on redéfinit l'action de la méthode
Et maintenant, je peux continuer à utiliser Clipboard->paste() et
Clipboard->copy() sans me soucier du reste !

Laisser un commentaire