AppleScript 1-2-3的第一章是免费阅读的,它讲的是如何用AppleScript来操作Finder, 讲得深入浅出,绝对是上手AppleScript的最佳入门材料。我还看了GUI Scripting 的一些简单介绍 <1> Graphic User Interface (GUI) Scripting <2> AppleScript Essentials — User Interface Scripting 试了如何用AppleScript来切换输入法。但要再怎么深入学习就有点犯难了,首先找不到合适的材料;其次没有合适的应用场景。我不是为了学习AppleScript而学习,还没吃那么饱;我一向都觉得没有合适的应用而单纯学习一门新语言实在是浪费时间,也学不深入。特别是像AppleScript这种没几个人知道东东,我又不能凭它找份工作。
不过既然我已经写了(抄了)一个很酷的修改输入法的代码,就想再深入学习一下。碰到的第一个问题,该再读读哪些材料?官方的AppleScript Language Guide 像是reference guide,一直觉得看reference guide不是学习新语言好办法。查了几本讲AppleScript的书,动辄都好几百页:AppleScript 1-2-3 有896页;Learn AppleScript 有1105页;Beginning AppleScript有601页;AppleScript Definitive Guide最少也有590页。这一比,AppleScript Language Guide才262,反而是最少的。我就想搞几个简单的脚本玩玩,要让我读好几百页的书,不是吧!每每这个时候我都能想起Essential C++ 的前言,作者讲他为什么写了C++ Primer之后还要再写这本书,我摘抄在这 ,因为这段话真的说到我心里去了:
“My C++ Primer is 1237 pages counting the index, title, and dedication pages. This one weighs in at 276 — in boxing terms, we’re talking bantamweight. The first question, of course, is how come? Actually, there’s a story to that. … I didn’t know Perl. I thought, OK, I’ll read a book. But it can’t be too big a book, at least not right now. And it had better not tell me too much, although I know I should know everything, only later. I didn’t need the best book on Perl — just the right book to get me going and not steer me too far off the righteous path. … I found that book in Learning Perl, by Randal Schwartz. It got me up and running, and it was fun to read. Well, as much as any computer book is fun. It leaves out gobs of good stuff. At the time, though, I didn’t need all that stuff — I needed to get my Perl scripts working. … Eventually, I realized sadly that the third edition of C++ Primer could no longer fill a similar role for someone needing to learn C++. It had just become too big. It’s too comprehensive for this kind of just-in-time C++ language learning.”
是啊我也很需要一本薄薄的just in time learning的书。像”in action” 系列,虽然我没怎么读过他们,但感觉他们写书思路就是这样。对于AppleScript,我其实就想知道它有没有什么基本概念和别人是不同的,有哪些特殊的语法和关键字;哪些常用的数据结构,哪些特殊的调用方式(能配合几个例子最好)。对于有经验的开发人员,这是最基本的,这用不着几百页来讲吧!
结果我发现维基百科关于AppleScript的条目写得很好,短短几页居然把我想了解的都提到了,除了GUI Scripting!强烈推荐每个想学AppleScript的人都看看,可以作为一个很好的起点,再去看别的资料。它提到这么几个关键点:
- Basic Concept解释得很清楚。有了些经验回过头来读更是如此。首先,它启发我想到AppleScript和其他 Unix Shell Script的主要差别,我的感觉是(这可能完全是错的,因为我对这两种script都只是懂个皮毛):Shell Script更多的是为了OS交互,用各种“神奇”的Unix命令和参数来鼓捣文件、目录、进程。AppleScript更多的是为了和应用程序交互,通过脚本让应用程序完成一些重复性的工作 (从这个意义上说我觉得AppleScript还真有点像Expect)。AppleScript 脚本的结构大体是 tell app to do. 一般是一行命令标识一条动宾结构的语句:command object (to do), tell 是最常见的起始动作,但AppleScript还定义其他少数几个动作,如set;至于应用程序能完成哪些动作则由它自己决定,比如我们可以 tell application “iTunes” to play 但如果 tell application “Finder” to play 运行时就会提示 “The variable play is not defined.” 每个应用程序能做哪些动作 AppleScript Editor 的Library 菜单项可以查到。Library里列出的是OS X 自带的scriptable 应用,所以对于其他应用,我猜大概只能通过GUI Scripting 来模拟用户的动作。其次,AppleScript脚本可以指示、协调几个应用程序一同工作,完成一个workflow. 对这点我的体会是AppleScript和 GUI程序交互是它的特长,如果workflow涉及是对程序输出结果的处理,文本的修改或是主要和命令行程序交互自然还是Shell Script好。那些用AppleScript和Finder交互来处理文件和目录的脚本还真不如就用Shell Script的好。
- Natural language metaphor 让程序更易读。比如动宾结构的语句形式,上篇提到的whose, the, every和复数形式, of , ‘s, 1st, last,get/set 关键字,包括循环的关键字是repeat. 当然会写AppleScript多半都有一定的开发经验,我感觉除了whose这个关键字是个很有意义的新概念之外,其他的东东对写代码的帮助有多大不好说。”The Definitive Guide” 对 English-like的语法就很不感冒。
- 基本语法。AppleScript语法特殊的地方基本都点到了。比如AppleScript特殊的loop关键字 repeat;函数的定义叫handler以及handler的调用方式;droplet指的是什么;applet的定义没提,但也容易想到,即存成可执行的application的代码。但有一点没提到,定义了run handler就不能再有可直接执行的代码;有两个重要的概念没有提:<1> coercion 其实就是类型转换,用as关键字来表达。<2> result这个关键字,我在上一篇里提到它的“神奇”应用。
- 常用的数据结构 list & record,当然这个它只是简单提到,还要参考别的资料。record 其实就是key values pairs. record as list 即把这个record 变成 list of values,而丢掉了key的内容。除了dailog的结果用 text returned 和 button returned 这两个特殊的key,其他key都只能一个单词。list & record的使用以及list 和 string的相互转化我还得再学学。
另一份很薄的资料叫applescript for absolute starters 比较老,应该是针对tiger写的,也没有提到GUI Scripting;不过对初学者还是有不少信息量,推荐看看。还需要注意的是Editor里的这个Library菜单项,它定义了每个Scriptable app 支持的动作以及可操作的动作对象的属性值 。如果要和某个具体的应用,交互写出复杂的脚本,必然要参考这个Library 才知道能发什么指令,设什么样属性值 。“The Ultimate Beginner’s Guide To AppleScript”这篇文章 讲了通过查Library知道怎么和Mail交互,发一封邮件。
这篇文章的另一个要点是引出了AppleScript里的另一个神秘关键字make (make new 实际含义是create). make 虽然是缺省的关键字,但具体要怎么make, 给什么参数,是由应用程序决定的(所以make new 一定是放在tell app block里)。每个应用程序定义的参数五花八门,比如发邮件这个例子,make 一个 outgoing message 写法就不是那么直观,只能通过查 Library,并不停的尝试才知道。”The Definitive Guide”说make是AppleScript里最让人头疼的命令。
再然后呢,我就不清楚了。我现在就看看系统自带的一些例子,再把上面提到的几本书的目录看看(applescript 1-2-3始终搞不到),看有没有那些我感兴趣的章节。再怎么深入,还有哪些有趣的应用我也还没更好的办法。Mac Hacks: 17 AppleScripts To Make Your Life Easier 列了17个很实际的例子,都附有代码,或许可以是个不过学习例子。
注:过了一阵时间后回过头来看,我现在使用AppleScriptp频率最高的场合居然是让它教我怎么读一些英文单词
. OS X带的字典只有音标,不能发音,折腾半天想找个带发音的字典,结果发现用AppleScript里的say功能最省事,而且就算让它完整的读一句话,它的发声也很自然,不像其他一些电脑合成的读音软件。嘿嘿还真是大材小用了AppleScript. 遗憾的是Dictionary.app不提供对AppleScript的支持,我想了不少办法想绕过这个障碍都没有成功。其实要做的事很简单,就是把在Dictionary.app里选中的单词直接传给一个AppleScript,可惜因为AppleScipt现在没法和Dictionary.app直接交互,我始终没有得逞。
