Преобразование в одну строку AppleScript

У меня есть ряд команд AppleScript, которые мне нужно реализовать в одной строке AppleScript. Код ниже.

delay 2
tell application "System Events" to keystroke "foo"
tell application "System Events" to keystroke return

Ответ 1

Вы можете комбинировать две команды нажатия клавиш в одну, объединяя ваши строки вместе:

tell app "System Events" to keystroke "foo" & return

Но это все равно оставляет вас с одной командой и утверждением (задержка и указание... на...).

Фактически, разделитель операторов AppleScripts - это разрыв строки. В современном AppleScript разрывы строк могут быть либо CR, LF, либо CRLF (соответственно: старый-Mac-, Unix- или DOS-стиль). Нет удобного способа написать строку с несколькими операторами (например, foo; bar; baz; в C, Perl, Ruby и т.д.).

Для вашего конкретного запроса вы можете комбинировать два в уродливом виде, используя задержку как часть выражения.

tell application "System Events" to keystroke "" & (delay 2) & "foo" & return

Это уродливо, потому что время задержки технически не возвращает никакого значения, но мы можем конкатенировать его с пустой строкой, не вызывая ошибки.

Проблема в том, что такая конструкция не очень "общая цель". Вы не всегда можете превращать любую команду в выражение таким же образом (и вы не можете использовать такие выражения, как tell, как часть выражения 1). Для немного более краткости (и обфускации) вы можете записать последний бит как "foo" & return & (delay 2). Он по-прежнему работает в том же порядке (сначала задержка), потому что каждая часть выражения конкатенации должна быть оценена до того, как она может быть встроена в одно значение для команды нажатия клавиши.

<суб > 1 Короче говоря, они помещаются в строку, заданную для запуска script. Даже тогда некоторые утверждения (циклы, try/catch и т.д.) Всегда многолинейны; хотя вы можете обойти это, используя экранированные разрывы строк или конкатенацию и одну из констант разрыва строки (следующим образом). Суб >

Вы можете использовать run script со строковым аргументом и использовать обратную косую черту 2 для представления разрывов строк.

run script "delay 0.1\ntell app \"System Events\" to keystroke \"foo\" & return"

Редактор AppleScript может преобразовать обозначение escape в литерал, если вы не включили "Escape tabs и строку break in string" в настройках редактирования (доступно в 10.5 и более поздних версиях). Вы всегда можете использовать константу return и конкатенацию вместо строки in-string-literal/escape-нотации.

run script "delay 0.1" & return & "tell app \"System Events\" to keystroke \"foo\" & return"

<суб > 2 Если вы собираетесь представлять такие строки внутри строкового литерала Objective C (как может показаться в одном из ваших комментариев), вам придется избегать обратных косых черт и двойных кавычек для Objective C, также (... & \"tell app \\\"System...). Суб >

Или, если вы в конечном счете пытаетесь запустить код с помощью osascript, вы можете использовать тот факт, что каждый экземпляр -e станет отдельной строкой, чтобы поместить все это в одну командную строку оболочки.

osascript -e 'delay 2' -e 'tell app "System Events" to keystroke "foo" & return'