为什么脚本编辑器.scpt文件没有另存为纯文本文件?


16

脚本编辑器(以前是Yosemite 10.10之前的AppleScript编辑器)将.scpt文件另存为二进制文件,而不是纯文本文件。

这使得在源代码控制系统中使用它们有些麻烦。

有谁知道为什么会这样吗?是否有一些长期的历史记录要求这种文件格式不是纯文本文件?


我不知道为什么,但是正如这里所说,您可以编写一个热键/脚本宏另存为文本。这是一种痛苦,但可行的……
2015年

2
在“保存”面板中,可以将脚本保存为几种不同的格式,包括纯文本。
克里斯·佩奇

“从scpt文件中以文本形式获取脚本吗?”:lists.apple.com/archives/applescript-users/2007/Mar/…–
pkamb

Answers:


20

威廉·R·库克(William R. Cook)的论文包含了 1989年与AppleScript相关的优秀历史和见解

接下来是有趣和投机。

节省空间和加工

AppleScript是在每个字节和每一位都很宝贵的时候编写的。在那些早期开发人员的眼中,OS X的惰性编码作为属性列表格式是浪费的。

二进制格式提供了一种预先解析的形式,避免了磁盘上的每次加载都重复复杂,容易出错且耗时的解析过程。最好直接加载到内存中并运行。

适应性强

以二进制格式保存可以将AppleScripts绑定到底层AppleEvent代码,而不是它们的长格式术语词典。

这将允许针对一个应用程序版本编写和保存的AppleScript自动更新为目标应用程序版本之间的术语更改。

整数对象在脚本中可能称为“整数”,但int 在二进制表示形式中另存为四个字符代码“ ”。四个字符代码来自操作系统提供的AppleScript词典。

如果将来的AppleScript术语决定将面向用户的单词更改为整数,则二进制表示形式可以映射到较新的名称。

今天有可能看到另一面。针对应用程序的字典编写AppleScript。然后从您的Mac中完全删除该应用程序。打开脚本后,您会在脚本编辑器中看到什么?

至少在最新版本中,AppleScript编辑器显示了围绕四个字符代码的V形符号。该代码已被记住并突出显示。用户不是面对术语。

这可能不是主要的好处,而是可能的好处。

现代偏见

值得承认我们对文本文档的现代偏见。经验告诉我们许多人以二进制格式存储有价值的内容会带来风险。二进制格式的文档通常收录不好,对于最终用户而言是不透明的,并且在不维护拥有软件的情况下很难打开

当创建AppleScript及其二进制格式时,这种偏见尚未形成。存储和计算限制非常真实,每节省千字节或数千个周期是值得的。

历史和起源

AppleScript的起源故事很精彩,但如今很难追踪。AppleScript试图成为一种友好的英语语言,并且在其愿景中叹为观止。实际的实现更难实现!


16

简而言之,.scpt允许向后兼容。另外,鉴于Script Editor现在支持javascript ,applescript / javascript(等)可以使用相同的扩展名保存。

.scpt在shell中反编译:

https://github.com/rupa/applescript/blob/master/decompile.sh

最相关的部分:

osadecompile

Textmate是可以读取.scpt以下内容的第三方编辑器:

https://github.com/textmate/textmate/blob/master/Applications/decompile_as/src/decompile_as.mm

最相关的部分:

[[OSAScript alloc] initWithCompiledData:];

此功能来自OSAScript.hOS X SDK之外的。在中OSAScript.h,有一个冗长的注释:

给定一个用于定位已编译脚本,脚本应用程序或脚本源的URL,创建并返回一个自动发布的脚本数据描述符及其内容。您可以使用描述符使用-[OSAScript initWithScriptDataDescriptor:...]创建脚本。这使您可以使用特定的OSALanguageInstance创建脚本。您可以使用+ [OSALanguage languageForScriptDataDescriptor:]获取脚本数据的语言,然后可以使用该语言为OSAScript创建或选择适当的语言实例。脚本源数据可以通过-[OSAScript initWithScriptDataDescriptor:...]进行编译,也可以将描述符强制为字符串(使用NSAppleEventDescriptor方法),并使用源显式创建OSAScript。+(NSAppleEventDescriptor *)scriptDataDescriptorWithContentsOfURL:

基本上,保存时.scptOSALanguageInstance描述符也会保存在文件中。

如果文件另存为.applescript/ text,则系统将使用最新版本的applescript语言对其进行编译。例如,为旧版本的OS X编写的脚本可能无法在新版本上使用,因为某些功能已过时。使用.scpt,系统/应用程序将选择它打算使用的版本的applescipt。

从10.10开始,可以将javascript保存.scpt并正确执行。


得到了errOSASourceNotAvailable(-1756)。这是什么意思?
TCB13

1
+1用于反编译链接。当您的.scpt文件不是二进制文件并且应该是@ TCB13时,会发生@ TCB13,因此编辑器无法解决的问题是关闭窗口,该窗口会要求您进行复制。然后,副本将以编译后的格式保存信息。但是,所有这些都将在我将要发布的答案中得到解决,该答案是从这个包含反编译命令的更遥远的答案中学到的。
Michael Dimmitt

除此之外asprint,< hasseg.org/asprint > 也提供了该功能,可让您“漂亮地打印” .scpt文件。唯一的缺点是,它不适用于JavaScript .scpt文件,仅适用于AppleScript文件。
TJ Luoma

1

看到Fartheraway共享的反编译命令后,我找到了解决方案。如果您希望applescript(.scpt)文件不是二进制文件。

@fartheraway在回答的底部也提到了它。

只需使用.applescript扩展名进行所有开发。

脚本编辑器将能够运行代码,并且不会将其保存为编译格式。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.