Le menu Services accessible par le menu pomme permet d’utiliser des fonctions proposées par certaines applications dans d’autres applications. Par exemple TextEdit permet d’ouvrir un nouveau fichier texte contenant le texte sélectionné dans la fenêtre dans laquelle on travaille, même si cette fenêtre n’est pas TextEdit. Ces services sont accessibles depuis n’importe quelle application si le service proposé peut s’appliquer à la situation. Dans cet exemple, il faut que du texte soit sélectionné pour que le service soit proposé.
Accessible dans toutes les applications… Hum… pas tout à fait. Il faut que l’application soit cocoa. Aucun espoir dans FireFox ou NeoOffice, par exemple.
Beaucoup d’applications proposent des services et le menu finit par être terriblement encombré. Pour rendre ce menu facilement utilisable, on en vient souvent à souhaiter en retirer les éléments qu’on n’utilise jamais, à les regrouper en sous-menus ou à les traduire en français.
L’envie de définir ou de redéfinir les raccourcis clavier associés aux services vient ensuite très rapidement parce qu’ils sont souvent malcommodes ou en conflit.
On peut faire toutes ses modifications de façon réversible et très facilement en utilisant
Service Scrubber qui est un donationware fait pour ça. Par esprit sportif, on peut aussi préférer faire ces modifications à la main en étudiant la syntaxe xml relativement compréhensible du fichier info.plist contenu dans le paquet des applications.
Si vous éditez ce fichier à la main, souvenez-vous qu’il est contenu dans l’application elle-même et qu’à la prochaine mise à jour ou réinstallation, les modifications seront perdues ! Faites-vous une sauvegarde du fichier une fois mis au point.
On trouvera ce fichier en ouvrant le paquet de l’application par le menu contextuel du Finder
Afficher le contenu du paquet : il se trouve directement dans Content/ au premier niveau.
Prenons un exemple avec Unicode Checker qui génère des services qui permettent de traiter une sélection de texte pour, par exemple, transformer les entités en caractères ou inversement dans du code HTML. Peu importe l’application, le principe et la syntaxe sont exactement les mêmes.
Je vous indique un exrait de la version telle que je l’ai modifiée, hors le fait que j’ai simplifié ici avec un seul service (et une ébauche d’un deuxième).
On commence par chercher la partie concernant la déclaration des services. Elle se trouve après <key>NSServices</key> et entre les balises <array> … </array> qui suivent :
- Code:
-
<key>NSServices</key>
<array>
<dict>
<key>NSMenuItem</key>
<dict>
<key>default</key>
<string> ◆ HTML ➞ Unicode</string>
</dict>
<key>NSMessage</key>
<string>convertHTMLToUnicodeService</string>
<key>NSPortName</key>
<string>UnicodeChecker</string>
<key>NSReturnTypes</key>
<array>
<string>NSStringPboardType</string>
</array>
<key>NSSendTypes</key>
<array>
<string>NSStringPboardType</string>
</array>
<key>NSUserData</key>
<string>HTMLEntity</string>
</dict>
<dict>
<key>NSMenuItem</key>
… service suivant de l’appli …
</dict>
</array>
On voit que chaque entrée de menu y est alors défini à la place des … dans
- Code:
-
<dict>
<key>NSMenuItem</key>
…
</dict>
Pour supprimer un service il suffit donc d’effacer la partie qui lui correspond et qu’on identifie sans problème par son intitulé dans le menu, par exemple ici la partie qui contient :
- Code:
-
<string> ◆ HTML ➞ Unicode</string>
On ne s’occupe pas ici des <key>NSPortName</key> qui définissent à qui le service doit s’adresser (ici UnicodeChecker est indiqué) ou autres <key>NSReturnTypes</key> qui définissent comment les données doivent être envoyées à l’appli et reçues en retour. Il ne faut évidemment rien modifier là-dedans.
Par contre si on veut réorganiser ou traduire les entrées de menu, il suffit d’éditer le champ string :
- Code:
-
<dict>
<key>default</key>
<string> ◆ HTML ➞ Unicode</string>
</dict>
Comme j’ai désactivé la plupart des services, j’ai préféré placer ceux qui me restent au premier niveau du menu services. Comme les entrées sont classées par ordre alphabétique, pour que ceux qui sont fonctionnellement liés restent groupés dans la liste, j’utilise des caractères spéciaux comme ici ◆ (accessibles par la palette de caractères) et qui peuvent servir d’« icônes » pour être repérés plus facilement.
Si je voulais au contraire regrouper des services par sous-menus (même des services générés par des applis différentes, pourquoi pas) il suffirait que je fasse précéder le libellé par nom_de_sous-menu/.
Par exemple j’ai trois services, l’un appartenant à WordService, l’autre à Mail et le troisième à TextEdit. Si je veux les grouper dans un sous-menu Texte, je modifie leur libellé en commençant par Texte/ :
- Code:
-
Texte/Convertir en minuscules
Texte/Envoyer en mail
Texte/Ouvrir la sélection dans TextEdit
et c’est tout.
Modifier le raccourci clavier d’un service est tout aussi simple.
Dans l’exemple plus haut, il n’y en a aucun de défini pour l’entrée du service. Un service comportant le raccourci clavier pomme / se présenterait comme ceci :
- Code:
-
<key>NSServices</key>
<array>
<dict>
<key>NSKeyEquivalent</key>
<dict>
<key>default</key>
<string>/</string>
</dict>
<key>NSMenuItem</key>
<dict>
<key>default</key>
<string> ◆ HTML ➞ Unicode</string>
</dict>
<key>NSMessage</key>
<string>convertHTMLToUnicodeService</string>
<key>NSPortName</key>
<string>UnicodeChecker</string>
<key>NSReturnTypes</key>
<array>
<string>NSStringPboardType</string>
</array>
<key>NSSendTypes</key>
<array>
<string>NSStringPboardType</string>
</array>
<key>NSUserData</key>
<string>HTMLEntity</string>
</dict>
</array>
On a tout simplement fait précéder sa définition par celle de son raccourci :
- Code:
-
<key>NSKeyEquivalent</key>
<dict>
<key>default</key>
<string>/</string>
</dict>
Autre exemple, pour attribuer majuscule+pomme+M à un service, on le fait précéder de :
- Code:
-
<dict>
<key>default</key>
<string>M</string>
</dict>
Dans le cas de / sur un clavier français, comme il faut obligatoirement appuyer sur majuscule pour taper /, le raccourci qui s’affichera dans le menu se présentera comme pomme+/ alors que pour M, il sera affiché majuscule+pomme+M.
Et pour pomme+m, il suffirait de mettre <string>m</string>, mais ça ne fonctionne pas, puisque pomme+m est déjà pris pour le repli de la fenêtre dans le Dock. D’une façon générale, il faut éviter les pomme+lettre minuscule qui entrent en conflit avec les applis. On utilisera donc systématiquement des majuscules, mais il est possible que certaines applis les utilisent aussi. À voir à l’usage.
Les caractères peu ascii comme pomme+§ ne donnent rien, mais pomme+( sera pris en compte. Ce qui est lourd dans ces modifications faites à la main est qu’il faut sortir de la session pour tester. Encore une raison d’utiliser Service Scrubber qui sait rafraîchir les services à la sauvegarde des modifications et donc de tester immédiatement, même dans une application et un fichier ouverts.