Чи можливо підтримувати ярлик ⌘ Chrome для вкладки фону, використовуючи AppleScript для автоматизації створення нової вкладки?


1

На моєму Mac працює спеціальна системна служба під назвою Пошук Google , яка розміщує вибраний текст у визначеній URL-адресі, а потім відкриває URL-адресу на новій вкладці (поруч із поточною вкладкою) у Google Chrome.

Моя служба отримує вибране textв any application. Служба спрацьовує виключно за допомогою контекстного меню правою кнопкою миші для вибраного тексту, загальносистемного та всіх програм. Жоден сторонній додаток чи ярлик клавіатури не задіяний.

За замовчуванням кожне натискання на посилання, що відкриває нову вкладку в Chrome, утримуючи її ⌘ command, поточна вкладка в Chrome не змінюється. Нова вкладка відкривається праворуч від та безпосередньо примикає до поточної вкладки, але нова вкладка не робиться активною вкладкою.

Я хотів би, щоб ⌘ command ключ мав такий самий ефект, коли я запускаю Сервіс. Так що:

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.

Моя служба складається з однієї дії "Запустити AppleScript". Ось повний код:

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

Моя скарга з вищевказаним кодом полягає в тому, що він встановлює поточну вкладку на нову вкладку, навіть якщо ⌘ commandвона утримується, коли Служба починається.

Чи можливо, щоб поточна вкладка не була змінена на нову вкладку, якщо і лише у випадку, якщо користувач утримує ⌘ commandпри запуску Служби?

Я очікую, що ⌘ commandключова функціональність працюватиме лише тоді, коли контекстне меню правою кнопкою миші натискається в Chrome.app. Наприклад, якщо ця Служба запускається в Preview.app, хоча було б непогано все-таки мати в своєму розпорядженні можливість використовувати ⌘ commandключ, щоб не змінювати активну вкладку вікна Chrome, я розумію, що це, ймовірно, просить забагато.

Я розумію, що AppleScript не має механізму перевірити, чи натискається клавіша середнього скрипту. Однак мені цікаво, чи існує альтернативний метод створення нової вкладки в AppleScript, який змушує Chrome виконувати все прослуховування, щоб Chrome міг реагувати так, ⌘ commandяк це відбувається природно.


@ user3439894 Ви, звичайно, мали рацію щодо розбіжності. Прошу вибачення за плутанину. Я оновив свою відповідь, щоб відобразити всю Службу.
сфера

Відповіді:


1

Я думаю, що це зробить те, що ви просите. Я змінив ваш оригінальний код, щоб побачити, який процес є передовим у той момент, коли він запущений , щоб розгалужуватись і перевіряти належним чином на основі умов, висловлених у вашому запитанні, використовуючи checkModifierKeys*. щоб побачити , якщо ⌘ commandклавіша була натиснута , коли Google Chrome є самим переднім процесом в той час , послуга буде бігти . * (Я не маю приналежності до блогу Чарльза Пойнтона або до перевірки Стефана Клієма, крім того, що декілька років без проблем користувався цією програмою.)

Як закодований, він передбачає, що checkModifierKeysрозміщений в /usr/local/bin/. Змініть за потребою.

Дивіться коментарі в if theFrontmostProcessWhenRun is "Google Chrome" then блоці щодо його логічного потоку .

    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

Примітка: Коли Google Chrome є самим переднім на час служби в перспективі і ⌘ commandнатиснута клавіша, це отримує струм active tab indexі встановлює його назад до нього після створення нової вкладки . Це розроблено як вирішення, оскільки це трохи невдало, але краще нічого, поки не знайдеться більш елегантне рішення проблеми.


Це працює правильно і прекрасно виконує моє бажання. Дякую! Єдиний мій виклик - це те, що коли я відкриваю вкладку у фоновому режимі (тобто, коли я утримую клавішу while під час спрацьовування Служби), активна вкладка ненадовго змінюється на новостворену вкладку перед поверненням до попередньої вкладки. Але ця хитрість не має нічого спільного з checkModifierKeysвашим рішенням; це пов'язано з тим, як AppleScript відкриває вкладку фону в Chrome. Чи є інший спосіб відкрити фонову вкладку Chrome в AppleScript? Це питання, мабуть, заслуговує на свою окрему посаду ...
сфера

@ Сфера xrubik, це саме те, чому я сказав : « Це призначено в якості обхідного шляху , як це трохи заплутано, але краще , ніж нічого , поки більш елегантне рішення проблеми не може бути знайдено. » Команда вниз подія з'їдена , але послуга не Google Chrome і чому потрібно імітувати так, ніби останній отримав команду вниз події , отримуючи струм active tab index, щоб повернути його після того, як фокус був встановлений на новій вкладці від його створення.
користувач3439894

Я бачу, що ти кажеш. Я здивований, що моя ⌘ мета фактично могла бути досягнута в AppleScript, тому для мене це рішення досить елегантне. (Я вдячний, що ти мене познайомив checkModifierKeys.)
сфера

Сфера @ rubik, Ось дві інші корисні утиліти, CLICLICK та MouseTools , які були корисні з нагоди.
користувач3439894

Я радий повідомити, що щодо версії Chrome 69.0.3497.100 ваше рішення працює чудово! (Після створення нової вкладки активна вкладка більше не змінюється коротко.)
сфера
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.