【问题标题】:AppleScript: open frontmost file with another applicationAppleScript:用另一个应用程序打开最前面的文件
【发布时间】:2014-08-21 18:17:44
【问题描述】:

我想编写一个AppleScript 程序来执行以下操作(Automator 也可以):

我想用应用程序Transmit 2 打开当前活动的TextMate 文件(可能打开了几个选项卡和其他窗口)。 (这将使用 Transmit 的 DockSend 功能通过 FTP 上传文件。)

我在这里使用了一个特定的应用程序 (TextMate),但理想情况下,我希望它适用于任何应用程序中当前处于活动状态的任何文件。

最终我会分配一个键盘快捷键来运行它。

这是我目前所拥有的:

tell application (path to frontmost application as text)
    set p to path of document 1
end tell

tell application "Finder"
     open POSIX file p using "Transmit 2"
end tell

我已经尝试了很多变种,但没有任何效果。

编辑: 我找到了这个页面:http://wiki.macromates.com/Main/Howtos 并且有人制作了我正在寻找的脚本:

tell application "Transmit" to open POSIX file "$TM_FILEPATH"

这是用于传输 [不是 2],我认为是用于 TextMate pre v2。我收到错误(使用 Transmit 2 时):

Transmit 2 got an error: AppleEvent handler failed.

v2 的一个更新破坏了它(不确定是哪一个)。

【问题讨论】:

  • 您使用的是什么版本的 TextMate?据我所知,就 AppleScript 字典而言,最新的 alpha (2.0-alpha.9561) 是一团糟(它不知道文档是什么,并且 Window 对象没有路径或文件)。 V 1.5 支持“path of document 1
  • 是的,我使用的是最新版本。您在哪里可以找到 AppleScript 词典?我总是很难为 AppleScript 找到好的文档。另见编辑。 (感谢您的调查)
  • 将应用程序拖到脚本编辑器上以查看字典。脚本编辑器中还有一个“打开字典...”菜单项(文件)。对于 TextMate,开发人员在未完成功能的情况下添加了字典(不好的做法)。换句话说,字典不正确。
  • 你知道,如果你真的想让它适用于每个应用程序,你必须为不同的应用程序使用不同的命令(并且,对于 TextMate,你将必须使用旧版本并等待新版本修复)。有些应用程序的文档具有“文件”属性,有些应用程序具有“路径”属性,还有一些具有其他术语。有些在其 Window 对象中具有这些类型的属性(而不是文档或除了文档之外)。如果您不了解原始 AppleEvent 代码,您可能会摸不着头脑。对不起。
  • 要查看应用程序的字典,在 [Apple] 脚本编辑器中,查看文件/打开字典。

标签: applescript automator textmate2


【解决方案1】:

您的问题似乎有两个步骤。一,获取文档的路径(或其他一些允许您稍后打开文档的参考),二,在所需的应用程序中打开文档。

如果 AppleScript 保存为应用程序,则最前面的应用程序是您正在运行的 AppleScript,因此该路径将是 AppleScript 应用程序的路径。在那种情况下,我不知道如何获得第二个最前面的应用程序。

但是,如果应用程序支持脚本文件夹(进入 AppleScript 编辑器的首选项,并启用“在菜单栏中显示脚本菜单”),您可以将脚本保存为用户脚本文件夹中的“脚本”,并且从脚本菜单运行时,最前面的应用程序将是您当前所在的应用程序。

您可能希望在测试时显示 p 变量,以确保获得正确的路径而不是 AppleScript 的路径。

至于在另一个应用程序(例如 Transmit)中打开文档,最好的方法是直接与支持它的应用程序对话:

tell application (path to frontmost application as text)
    set p to path of document 1
end tell

--for testing: verify that the path is for the correct document
display dialog p

tell application "Transmit 2"
    open p
end tell

我没有 Transmit,但我已经验证,如果我将“Transmit 2”替换为 Textastic 或 Smultron 6,这将有效。

如果您确实需要使用 Finder 打开文档,Finder 似乎更喜欢将其路径作为字符串,并且似乎更喜欢应用程序的完整路径。像这样的东西应该可以工作:

tell application (path to frontmost application as text)
    set p to path of document 1
end tell

--for testing: verify that the path is for the correct document
--display dialog p

set transmitPath to path to application "Transmit 2"
set p to POSIX file p as string

tell application "Finder"
    open file p using transmitPath
end tell

我再次使用 Textastic 和 Smultron 作为应用程序对此进行了测试。

【讨论】:

    【解决方案2】:

    对于您要解决的问题,最常见的解决方案是运行一个应用程序,使您的 Web 服务器看起来像是一个已安装的 Mac 磁盘。 Transmit 4 具有该功能,Panic 将其称为“传输磁盘”。但还有其他一些应用程序——Transmit 不是第一个。

    您的 Mac 应用程序(和 AppleScripts)只看到一个典型的 Mac 磁盘,它们可以在其中保存文件和从中读取文件(最基本的基本 AppleScript 任务),但传输磁盘(或类似应用程序)透明地将任何更改镜像到该 Mac 磁盘在后台连接到您的 Web 服务器。这使得所有网络和 FTP 的东西完全消失,让您编写非常简单的脚本来为您的 Web 服务器做非常强大的事情。您将 HTML 文档保存在那里,您将图像和电影文件导出到那里,就像您将它们保存在您的桌面上一样容易,而且它们会立即发布到您的 Web 服务器。即使是仅有的几乎无法编写脚本的应用程序也可以将其文件保存到特定磁盘上。

    例如,如果我在 BBEdit 中打开了一个 HTML 文档,并且我想将该文档的副本保存到我的 Web 服务器,它只需要几行代码,这在任何支持 AppleScript 的文本中都可能类似编辑器(这个脚本也可以在免费的 TextWrangler 中逐字运行):

    tell application "BBEdit"
        set theHTMLSource to the contents of text window 1
        make new document with properties {text:theHTMLSource}
        save document 1 to file "Transmit Disk:index.html"
        close document 1 saving no
    end tell
    

    请注意,上面的 AppleScript 不仅不需要了解有关 SFTP 的任何信息或具有任何登录凭据,它甚至不需要弄清楚我当前文档的文件路径,因为它只是将内容直接从当前窗口。没有 POSIX 路径名,没有 shell 脚本,根本没有猴子业务。而且因为这个任务和代码非常简单,你可以想象你可以为你可能使用的 20 个不同的应用程序重写这个脚本 20 次,这样他们都可以将他们当前文档的副本保存到你的传输磁盘上,从而将该文档发布到您的网络服务器。

    如果我有一个包含该 HTML 文档的图像文件夹,我可以要求 Finder 将该文件夹复制到我的传输磁盘上以发布它。只需一行代码:

    tell application "Finder"
        duplicate folder "images" of (the path to the desktop folder as alias) to the disk "Transmit Disk" replacing no
    end tell
    

    ...但是这些图像也可以从 Photoshop 或任何应用程序中导出,直接通过 AppleScript 导出到传输磁盘。

    简而言之,所有 Mac 应用程序的共同点是它们都可以将文件保存到 Mac 磁盘。他们不一定都给你他们打开的文件的路径名,或者用 Transmit 打开这些文件。 Mac 应用程序和 AppleScript 主要设计用于处理从本地磁盘保存或打开的文件。因此,如果您使用 Transmit Disk 之类的东西来使您的 Web 服务器基本上成为 AppleScript 派对的一部分,您将获得很多收益,因为它看起来只是一个普通的旧 Mac 磁盘。

    【讨论】:

      猜你喜欢
      • 2019-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-11
      相关资源
      最近更新 更多