1 votes

Est-il possible de conserver le raccourci ⌘-shortcut de Chrome pour l'onglet de fond, tout en utilisant AppleScript pour automatiser la création d'un nouvel onglet ?

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.

1voto

user3439894 Points 52496

Je pense que cela fera ce que vous demandez. J'ai modifié l'original code pour voir ce que processus est le plus avant au moment où il est exécuter afin de branche y test de manière appropriée en fonction des conditions exprimées dans votre question par l'utilisation de checkModifierKeys *. pour voir si le command a été pressé lorsque Google Chrome est le processus frontal au moment où le service est exécuter . * (Je n'ai aucune affiliation avec le blog de Charles Poynton ou le checkModifierKeys de Stefan Klieme, si ce n'est que j'utilise ce programme depuis quelques années sans problème).

Tel que codé, il suppose que le checkModifierKeys est situé à /usr/local/bin/ . Modifier selon les besoins.

Voir le commentaires dans le if theFrontmostProcessWhenRun is "Google Chrome" then bloc pour son flux logique .

    on run {input, parameters}

        --  # Get the name of frontmost process at the time the services was run.
        --  #
        --  # This is used later in an if statement block for when if Google Chrome was frontmost process when run
        --  # to check that the value returned from checkModifierKeys was for the command key being pressed.

        tell application "System Events"
            set theFrontmostProcessWhenRun to get name of process 1 where frontmost is true
        end tell

        (*
    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
*)

        if theFrontmostProcessWhenRun is "Google Chrome" then
            --  # Google Chrome was the frontmost process when the service was run.
            if ((do shell script "/usr/local/bin/checkModifierKeys") as integer) is equal to 256 then
                --  # The command key was pressed when the service was run.
                tell application "Google Chrome"
                    --  # See Note: below.
                    set activeTab to active tab index of front window
                    tell front window to make new tab at after (get active tab) with properties {URL:finalLink} -- open a new tab after the current tab
                    set active tab index of front window to activeTab
                end tell
            else
                tell application "Google Chrome"
                    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 if
        else
            --  # Google Chrome was not the frontmost process when the service was run.
            tell application "Google Chrome"
                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 if

    end run

Remarque : Lorsque Google Chrome est le plus avant au moment où le service est exécuter et le command est pressée, cela permet d'obtenir le active tab index et le remet à sa place après avoir effectué le nouvel onglet . Il s'agit d'une solution de contournement un peu maladroite, mais c'est mieux que rien jusqu'à ce qu'une solution plus élégante soit trouvée.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X