1 votos

¿Es posible mantener el atajo de Chrome para la pestaña de fondo, mientras se utiliza AppleScript para automatizar la creación de una nueva pestaña?

Tengo un servicio de sistema personalizado en mi Mac, titulado Búsqueda en Google que coloca el texto seleccionado dentro de una URL definida y luego abre la URL en una nueva pestaña (adyacente a la pestaña actual) en Google Chrome.

Mi Servicio recibe seleccionado text en any application . El Servicio se activa exclusivamente a través del menú contextual del botón derecho del ratón para el texto seleccionado, en todo el sistema y en todas las aplicaciones. No hay ninguna aplicación de terceros ni ningún atajo de teclado.

Por defecto, cada vez que uno hace clic en un enlace que abre una nueva pestaña en Chrome mientras mantiene command la pestaña actual en Chrome no cambia. La nueva pestaña se abre a la derecha de la pestaña actual e inmediatamente adyacente a ella, pero la nueva pestaña no se convierte en la pestaña activa.

Me gustaría que el command para tener el mismo efecto cuando ejecute mi Servicio. Pues eso:

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.

Mi servicio consiste en una acción "Run AppleScript". Aquí está el código 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

Mi queja con el código anterior es que establece la pestaña actual a la nueva pestaña, incluso si command se mantiene pulsado cuando se inicia el Servicio.

¿Es posible tener la pestaña actual no cambiar a la nueva pestaña si y sólo si el usuario mantiene pulsado command cuando se ejecuta el Servicio?

Sólo espero que el command para que funcione cuando se haga clic en el menú contextual del botón derecho en Chrome.app. Por ejemplo, si este Servicio se activa desde Vista Previa.app, aunque sería bueno seguir teniendo a mi disposición la capacidad de utilizar el command para no cambiar la pestaña activa de la ventana de Chrome, entiendo que esto es probablemente pedir demasiado.

Entiendo que AppleScript no tiene ningún mecanismo para comprobar si se está pulsando una tecla a mitad descript. Sin embargo, me pregunto si hay un método alternativo para crear una nueva pestaña en AppleScript que haga que Chrome haga toda la escucha para que Chrome pueda responder a command como lo hace naturalmente.

0 votos

@user3439894 Por supuesto que tenías razón en la discrepancia. Pido disculpas por la confusión. He actualizado mi respuesta para reflejar todo el Servicio.

1voto

user3439894 Puntos 5883

Creo que esto servirá para lo que pides. He modificado su original código para ver qué proceso es frontales en el momento en que se Ejecutar con el fin de rama y prueba adecuadamente en función de las condiciones expresadas en su pregunta mediante el uso de checkModifierKeys *. para ver si el command fue presionada cuando Google Chrome es el proceso frontal en el momento en que el servicio es Ejecutar . * (No tengo ninguna afiliación con el blog de Charles Poynton ni con el programa checkModifierKeys de Stefan Klieme, aparte de haber utilizado este programa durante algunos años sin problemas).

Tal y como está codificado, supone que el checkModifierKeys se encuentra en /usr/local/bin/ . Modifícalo si es necesario.

Ver el comentarios en el if theFrontmostProcessWhenRun is "Google Chrome" then bloque por su flujo lógico .

    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: Cuando Google Chrome está frontales en el momento en que el servicio es Ejecutar y el command se pulsa, se obtiene el active tab index y lo vuelve a poner después de hacer el nueva pestaña . Se trata de una solución provisional, ya que es un poco torpe, pero mejor que nada hasta que se encuentre una solución más elegante al problema.

0 votos

Funciona correctamente y cumple perfectamente mi deseo. Gracias. Mi única objeción es que cuando abro una pestaña en segundo plano (es decir, cuando mantengo pulsada la tecla mientras se activa el Servicio), la pestaña activa cambia brevemente a la pestaña recién creada antes de volver a la pestaña anterior. Pero, esta peculiaridad no tiene nada que ver con checkModifierKeys o su solución; tiene que ver con la forma en que AppleScript abre una pestaña en segundo plano en Chrome. ¿Existe otro método para abrir una pestaña de fondo de Chrome en AppleScript? Esa pregunta probablemente merezca un post propio y separado...

0 votos

La esfera de @xrubik, Esto es exactamente por lo que dije " Se trata de una solución provisional, ya que es un poco torpe, pero mejor que nada hasta que se encuentre una solución más elegante al problema. " El evento de comando hacia abajo se come pero el servicio no Google Chrome y por qué tener que simular como si éste recibiera la evento de comando hacia abajo obteniendo la corriente active tab index para volver a ponerlo después de que se haya puesto el foco en el nueva pestaña desde su creación.

0 votos

Entiendo lo que dices. Me sorprende que mi objetivo pueda lograrse en AppleScript, así que esta solución es suficientemente elegante para mí. (Te agradezco que me hayas presentado a checkModifierKeys .)

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X