为了完全公开,它是用香蕉而不是苹果写的。医生可能不会被拒之门外。
AppleScript突出显示:

用于复制和粘贴:
activate application "TextEdit"
tell application "System Events"
    repeat until first window of application "TextEdit" exists
        tell application "TextEdit" to make new document at the front
        delay 1.0E-3
    end repeat
    repeat until process "TextEdit" is frontmost
        set frontmost of process "TextEdit" to true
        delay 1.0E-3
    end repeat
    set focused of first window of process "TextEdit" to true
    
    repeat with i from 1 to 100
        if i mod 15 is 0 then
            keystroke "FizzBuzz"
            keystroke return
        else if i mod 3 is 0 then
            keystroke "Fizz"
            keystroke return
        else if i mod 5 is 0 then
            keystroke "Buzz"
            keystroke return
        else
            keystroke i
            keystroke return
        end if
    end repeat
end tell

我借用了适当等待“ TextEdit”的逻辑准备从这个出色的Code Review答案中接收文本。
我感觉我想编写函数...但是我不知道AppleScript中有哪些可用于模块化代码... err脚本...我只是在这里弄湿我的脚趾。

#1 楼

观看它键入FizzBu​​zz可能会很有趣,但是与UI交互直接存在陷阱。例如,如果用户在脚本运行时专注于其他应用程序,则现在输入的位置错误;而且如果您重新调整应用程序的方向,那可能会很烦人。

幸运的是,还有更好的方法。无需激活应用程序,而无需等到窗口出现并将窗口置于最前面,您就可以...

唯一的问题是TextEdit是否已打开,在这种情况下它将覆盖现有文档。在这种情况下,您可以使用

tell application "TextEdit" to set text of first document to "Hello, world!"


,无论哪种方式,您都不再直接与UI交互,这消除了很多潜在的问题。

尽管您可能考虑使用keystroke而不是keystroke "FizzBuzz" & returnkeystroke "FizzBuzz"分开,但FizzBu​​zz实现的实际内容(除非使用keystroke return)看起来不错。

#2 楼

我看到的主要问题是缺乏关注点分离。 FizzBu​​zz代码没有在System Events上下文中运行的业务,它应该驻留在自己的处理程序中。

to fizzbuzz from low to high
    repeat with i from low to high
        if i mod 15 is 0 then
            output("FizzBuzz")
        else if i mod 3 is 0 then
            output("Fizz")
        else if i mod 5 is 0 then
            output("Buzz")
        else
            output(i)
        end if
    end repeat
end fizzbuzz


我将keystroke调用分解为好吧,因为它们看起来很重复。由于您选择使用模拟的击键选项来输出文本,而不是仅告诉应用程序“ TextEdit”将第一个文档的文本设置为fizzBu​​zzOutput,因此,您确实应该一直进行并使其缓慢键入,例如电影。

on output(something)
    tell application "System Events"
        repeat with c in (something as string)
            keystroke c
            delay 0.05
        end repeat
        keystroke return
    end tell
end output


有了这两个处理程序,您将调用

tell application "System Events"
    repeat until first window of application "TextEdit" exists
        tell application "TextEdit" to make new document at the front
        delay 1.0E-3
    end repeat
    repeat until process "TextEdit" is frontmost
        set frontmost of process "TextEdit" to true
        delay 1.0E-3
    end repeat
    set focused of first window of process "TextEdit" to true
end tell
fizzbuzz from 1 to 100


请注意似乎不需要告诉应用程序“ TextEdit”激活。