J'ai un service système personnalisé sur mon Mac, intitulé Recherche Google qui place le texte sélectionné dans une URL définie et ouvre ensuite l'URL dans un nouvel onglet (adjacent à l'onglet actuel) dans Google Chrome.
Mon service reçoit une sélection text
sur any application
. Le service est exclusivement déclenché par le menu contextuel du clic droit sur le texte sélectionné, dans tout le système et dans toutes les applications. Aucune application tierce ou raccourci clavier n'est impliqué.
Par défaut, lorsqu'on clique sur un lien qui ouvre un nouvel onglet dans Chrome en maintenant la touche command l'onglet en cours dans Chrome ne change pas. Le nouvel onglet s'ouvre à droite et à proximité immédiate de l'onglet actuel, mais le nouvel onglet ne devient pas l'onglet actif.
Je voudrais que le command pour avoir le même effet lorsque je lance mon service. Donc ça :
if <the command key is being pressed when the Service is triggered> then
Open URL in a new, adjacent tab.
(Do not change the active tab.)
else
Open URL in a new, adjacent tab.
Change the active tab to the new tab.
Mon service consiste en une action "Run AppleScript". Voici le code complet :
on run {input, parameters}
(*
When triggering this Service in applications other than Google Chrome, such as TextEdit, the Chrome window opens in the background. This command brings the Chrome window to the foreground:
*)
activate application "Google Chrome"
(*
Converting the selected text to plain text to remove any formatting:
From: http://lifehacker.com/127683/clear-text-formatting-on-os-x
*)
set selectedText to input
set selectedText to (selectedText as text)
(*
Removing any line breaks and indentations in the selected text:
From: http://stackoverflow.com/a/12546965
*)
set AppleScript's text item delimiters to {return & linefeed, return, linefeed, character id 8233, character id 8232}
set plainTextSelectedText to text items of (selectedText as text)
set AppleScript's text item delimiters to {" "}
set plainTextSelectedText to plainTextSelectedText as text
(* Assigning variables: *)
set baseURL to "https://www.google.com/search?q="
set finalLink to baseURL & plainTextSelectedText
(* Opening webpage in Chrome: *)
(*
The following tell block creates a new tab, located immediately after the currently open tab, which is what I want to occur.
From: http://apple.stackexchange.com/questions/271702/applescript-how-to-open-a-link-in-google-chrome-in-a-new-adjacent-tab/271709#271709
*)
tell application "Google Chrome"
activate
tell front window to make new tab at after (get active tab) with properties {URL:finalLink} -- open a new tab after the current tab
end tell
end run
Ce que je reproche au code ci-dessus, c'est qu'il définit l'onglet actuel comme le nouvel onglet, même si command est maintenue enfoncée lorsque le service est lancé.
Est-il possible d'avoir l'onglet actuel pas sera changé pour le nouvel onglet si et seulement si l'utilisateur maintient la touche command lorsque le service est exécuté ?
Je m'attends seulement à ce que le command pour que la fonctionnalité clé fonctionne lorsque le menu contextuel du clic droit est cliqué dans Chrome.app. Par exemple, si ce service est déclenché à partir de Preview.app, même s'il serait agréable de disposer de la possibilité d'utiliser l'option command pour ne pas changer l'onglet actif de la fenêtre Chrome, je comprends que c'est probablement trop demander.
Je comprends qu'AppleScript n'a aucun mécanisme pour vérifier si une touche est pressée au milieu d'un script. Cependant, je me demande s'il n'existe pas une autre méthode pour créer un nouvel onglet dans AppleScript et faire en sorte que Chrome fasse tout le travail d'écoute afin que Chrome puisse répondre aux demandes suivantes command comme il le fait naturellement.