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

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

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

person walrifirir    schedule 13.03.2011    source источник
comment
Из любопытства: почему они должны быть остроумными? Также: не могли бы вы сказать, какое приложение получает foo и возвращает? Это упростит тестирование вашего скрипта. Кроме того, я предполагаю, что вторая и третья строки могут быть присоединены к tell app "System Events" to keystroke {"foo",return}.   -  person Asmus    schedule 13.03.2011
comment
Это должна быть одна строка, потому что я собираюсь реализовать этот AppleScript в приложении Cocoa.   -  person walrifirir    schedule 13.03.2011
comment
Не могли бы вы справиться с задержкой Cocoa?   -  person Asmus    schedule 13.03.2011
comment
Я также не понимаю, почему это должно быть одной строкой. Вы можете использовать экранированный разрыв строки внутри литерала NSString @"foo\nbar". Вы также можете использовать литеральный разрыв строки в литерале NSString. Или, если это не литерал, вы все равно сможете добавить подходящий символ разрыва строки как часть построения строки.   -  person Chris Johnsen    schedule 13.03.2011
comment
@Asmus @Chris Johnsen Хороший вопрос, думаю, я справлюсь с задержкой Cocoa.   -  person walrifirir    schedule 13.03.2011


Ответы (1)


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

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

Но это по-прежнему оставляет вам одну команду и оператор (delay и сказать … …).

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

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

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

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

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

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

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

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

Редактор AppleScript может преобразовывать escape-нотацию в литерал, если в его настройках редактирования не включен параметр «Экранировать табуляцию и разрыв строки в строке» (доступно в версии 10.5 и более поздних). Вы всегда можете использовать константу return и конкатенацию вместо внутристрочного литерала/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'
person Chris Johnsen    schedule 13.03.2011