È possibile mantenere la scorciatoia Chrome di Chrome per la scheda di sfondo, mentre si utilizza AppleScript per automatizzare la creazione di una nuova scheda?

1

Ho un servizio di sistema personalizzato sul mio Mac, intitolato Ricerca Google , che colloca il testo selezionato all'interno di un URL definito e quindi apre l'URL in una nuova scheda (adiacente alla scheda corrente) in Google Chrome.

Il mio servizio riceve text selezionato in any application . Il Servizio viene attivato esclusivamente tramite il menu di scelta rapida del tasto destro del mouse per il testo selezionato, a livello di sistema e in tutte le applicazioni. Nessuna app o scorciatoia da tastiera di terze parti è coinvolta.

Per impostazione predefinita, ogni volta che si fa clic su un collegamento che apre una nuova scheda in Chrome mentre si tiene premuto ⌘ comando , la scheda corrente in Chrome non cambia. La nuova scheda è aperta a destra e immediatamente adiacente alla scheda corrente, ma la nuova scheda non viene visualizzata nella scheda attiva.

Vorrei che il ⌘ comando abbia lo stesso effetto quando eseguo il mio servizio. In questo modo:

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.

Il mio servizio consiste in un'azione "Esegui AppleScript". Ecco il codice completo:

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

Il mio reclamo con il codice precedente è che imposta la scheda corrente sulla nuova scheda, anche se viene tenuto premuto ⌘ comando all'avvio del servizio.

È possibile avere la scheda corrente non modificata nella nuova scheda se e solo se l'utente tiene premuto ⌘ comando quando viene eseguito il servizio?

Mi aspetto che la funzionalità chiave ⌘ comando funzioni quando si fa clic sul menu di scelta rapida con clic destro in Chrome.app. Ad esempio, se questo servizio viene attivato da Preview.app, mentre sarebbe bello avere ancora a mia disposizione la possibilità di utilizzare il tasto ⌘ comando per non modificare la scheda attiva della finestra di Chrome , Capisco che questo è probabilmente chiedere troppo.

Capisco che AppleScript non abbia alcun meccanismo per controllare se un tasto è premuto a metà script. Tuttavia, mi chiedo se esiste un metodo alternativo per creare una nuova scheda in AppleScript che faccia sì che Chrome esegua tutto l'ascolto in modo che Chrome possa rispondere a ⌘ comando come fa naturalmente.

    
posta rubik's sphere 08.03.2017 - 09:22
fonte

1 risposta

1

Penso che questo farà ciò che stai chiedendo. Ho modificato il codice originale per vedere quale processo è in primo piano al momento in cui esegue , al fine di branch e test in base alle condizioni espresse nella domanda utilizzando checkModifierKeys *. per vedere se il tasto ⌘ comando è stato premuto quando Google Chrome è il processo in primo piano nel momento in cui il servizio è eseguito . * (Non ho alcuna affiliazione con il blog di Charles Poynton o con CheckModifierKeys di Stefan Klieme se non per aver usato questo programma per alcuni anni senza problemi.)

Come codificato, si presuppone che checkModifierKeys si trovi in /usr/local/bin/ . Modifica secondo necessità.

Vedi i commenti nel if theFrontmostProcessWhenRun is "Google Chrome" then blocco per il suo flusso logico .

    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

Nota: quando Google Chrome è in primo piano al momento il servizio è eseguito e il tasto ⌘ comando viene premuto, questo ottiene l'attuale active tab index e lo imposta di nuovo dopo aver creato la nuova scheda . Questo è inteso come soluzione temporanea in quanto è un po 'cauto, ma meglio di niente finché non si trova una soluzione più elegante di un problema.

    
risposta data 08.03.2017 - 23:14
fonte

Leggi altre domande sui tag