【问题标题】:How to execute a Sublime plugin command from the command line?如何从命令行执行 Sublime 插件命令?
【发布时间】:2018-02-15 16:38:08
【问题描述】:

我将插件 SimpleSession 与 Sublime Text 3 一起使用(但任何插件都可以考虑)。如果我保存具有多个窗口的会话,则会创建一个 .simplesession 文件。如何仅通过单击文件来打开该会话文件?目标是避免必须启动 ST3 并使用命令面板来运行“加载会话”命令。目前,单击.simplesession 文件会导致 ST3 将其作为常规文件打开。

【问题讨论】:

  • 我犹豫是否将标题更改为“如何使用 Sublime Text 3 通过桌面快捷方式启动插件数据文件?”。告诉我这是否更好......

标签: plugins sublimetext3 desktop-shortcut


【解决方案1】:

Sublime 不知道simplesession 文件在任何方面都很重要,所以双击一个文件会打开它,就像 Sublime 打开任何其他文件一样。

由于它是创建文件的插件,因此该插件是唯一知道它的特殊性以及如何处理它的东西。所以你真正需要的是告诉插件为你采取行动的方式。

Sublime 中的所有操作(包括像插入文本这样简单的操作)都是通过执行命令来完成的。这将是插件中创建相关文件的命令,它会告诉它您想要执行通常手动执行的操作,例如加载会话。

要在 Sublime 中执行此操作,您需要执行一些操作,例如将键盘键绑定到适当的命令,将其添加到菜单、命令面板等。如果您想从 Sublime 之外执行操作,那么您需要将该命令传达给 Sublime 以使其执行。

在核心 Sublime 中,您可以通过执行 Sublime 附带的 subl 程序并告诉它您要执行的插件命令来做到这一点。

虽然可以做到这一点,但此处提供的解决方案要求 Sublime 已经运行,因为 Sublime 本身的技术限制,但稍后会详细介绍。

此答案将为您提供制定命令行所需的信息,以便让插件命令运行并执行您想要的操作。

如果您想运行此命令以响应双击特定类型的文件(此处为 simplesession 文件),具体操作方式取决于您使用的操作系统和文件浏览器,以及最好作为一个单独的问题提出。

假设您想要一个集成级别,其中您只有一个桌面快捷方式、开始菜单条目等执行此操作,这更直接,因为这样的快捷方式实际上只是一个执行您选择的命令的可视化包装器.

同样,您将如何做到这一点取决于您的操作系统,但重要的部分是知道您需要为快捷方式提供什么完整的命令行才能运行它,这就是这个答案告诉您如何构造。


重要提示:您问题中的特定包实现了load_session 命令,该命令会提示您从之前创建的会话列表中加载会话。

此命令不接受任何参数来告诉它要加载哪个会话,而不要求您先选择一个。因此,如果没有更多工作,您想要的在技术上是不可能的,因为无法直接告诉load_session 命令您要打开的文件。

为了在这种特殊情况下实现更全面的自动化,需要修改底层包。特别是 load_session 命令将需要一个可选参数,当给定该参数时,将导致它在不先提示的情况下加载该会话,或者 需要创建一个新命令来执行相同的操作。

如果您对直接对软件包进行此类修改感到不自在或知识不足,您需要找人为您做这件事,或者(甚至更好)与软件包作者讨论,因为这是一个功能其他人可能也会喜欢。


您需要知道的第一件事是,“插件中的什么命令是我需要执行的执行我想要的命令?”。在某些情况下,您可能已经确切知道需要使用什么命令,因为它已记录在案,或者您已经为其创建了自定义键绑定,等等。

如果您不知道需要使用的命令,请查看包上的文档(如果有),看看它是否提到了它们。在您的特定情况下,包页面上的README 特别提到了一个命令列表,其中load_session 似乎是最合适的。

没有任何文档,下一个最简单的方法是直接询问 Sublime。为此,请从菜单中选择View > Show Console 或按下与其关联的键盘快捷键Ctrl+`。在出现的控制台中,输入以下命令并回车。

sublime.log_commands(True)

现在,无论您何时执行任何操作,此控制台都会准确显示 Sublime 正在执行的命令,以及它可能传递给命令的任何参数。这将一直有效,直到您对 False 使用相同的命令或重新启动 Sublime。

启用日志记录后,从命令面板中选择适当的命令,然后查看控制台显示的内容。

例如,安装此软件包后,我会得到如下输出:

>>> sublime.log_commands(True)
command: show_overlay {"overlay": "command_palette"}
command: load_session

这显示了两个命令;首先我打开了使用show_overlay 命令的命令面板,然后我选择了SimpleSession: Load 命令,这是不带参数的load_session 命令。

为了让 Sublime 从命令行执行命令,你使用--command 命令行参数到subl。因此,为了让 Sublime 运行load_session 命令,您可以在操作系统的命令提示符/终端中输入以下命令。这也是您在桌面快捷方式中设置的命令。

subl --command "load_session"

这假定您已经设置了 Sublime,以便它在路径中(具体操作方式取决于操作系统)。如果在终端中运行 subl 会提示您缺少命令,请将 Sublime 安装目录添加到路径中,或者使用完全限定的文件名代替 subl(例如 "C:\Program Files\Sublime Text 3\subl" 如果您在视窗);要么要求您知道 Sublime 的安装位置。

如果你想使用带参数的命令,你还需要在命令中包含参数,就像上面控制台中显示的那样。

将命令名称和参数都视为一个命令行参数很重要,这要求您将整个内容用引号字符括起来,否则空格会使其显示为多个参数。

如果您忘记了这一点,Sublime 将通过打开以您尝试打开的命令和参数的不同部分命名的文件来响应,因为您错误地认为您正在给它打开文件。

作为一个具体的例子,要让 Sublime 从 Sublime 外部打开命令面板,如果您使用的是 Linux/MacOS,执行此操作的命令如下所示:

subl --command 'show_overlay {"overlay": "command_palette"}'

再次注意,我们传递的正是上面控制台显示的内容,但整个内容、命令和参数都用单引号括起来,以便终端知道整个值是一个参数。

这在不允许单引号的 Windows 上使事情变得有点棘手。在该平台上,您需要使用双引号。这要求您使用前导 \ 字符“引用”内部双引号,以便命令处理器知道它们是参数的一部分,而不是结束参数的双引号。

对于在 Windows 上打开命令面板的情况,命令如下所示:

subl --command "show_overlay {\"overlay\": \"command_palette\"}"

有了这些信息,您可以设置诸如桌面快捷方式之类的东西来运行相应的命令,或者可能设置您用来执行命令的文件资源管理器,特别是当您双击您的文件时选择。

同样,您将如何做到这一点取决于您正在使用的操作系统,因此我在此答案中并没有真正深入讨论。请记住,无论所讨论的操作系统如何,保持不变的部分是您需要使用subl 命令,如上述。

现在,在您的特定情况下,如果您使用的软件包提供了一个命令,可以让它直接加载会话而无需先提示您,那么您使用的命令还需要包含会话文件的名称作为命令参数之一。

但是,正如我上面提到的,这个包目前不允许这样做。

现在,这是整个事情的GIANT CAVEAT;这仅在 Sublime 已经运行时才有效。

subl 命令与 Sublime 的现有运行副本对话,并为其提供打开文件、目录、运行命令的命令,就像我们在这里所做的那样。如果 Sublime 尚未运行,则subl 将首先启动 Sublime,然后将这些详细信息传达给它。

Sublime 启动并使其界面可供您立即工作,然后开始在后台加载包和插件。这是为了让您进入并处理您的文件,而不必等待所有包首先加载。

一个问题是,Sublime 启动后,subl 传递适当的命令然后退出,由于尚未加载包,因此您要执行的命令还不存在(hasn '没有被加载),所以实际上什么也没发生。

不幸的是,如果您想启动 Sublime 并执行命令,那么解决这个特定问题并没有真正令人满意的方法。

一个潜在的解决方法是使用脚本或批处理文件之类的东西来检查 Sublime 是否已经在运行,如果没有启动它并延迟一点以允许插件完成加载,然后使用 subl 来运行命令。

但是这需要你基本上猜测 Sublime 完成加载需要多长时间,这不太理想。

【讨论】:

  • 感谢 OdatNurd。您的答案非常完整,因为它在某些方面有点偏离主题。首先,我询问了任何方法,而不是将其限制为快捷方式;但我知道快捷方式涉及到主命令。你不知道的是我在网上搜索了一种理解命令的方法,但没有奏效。无论如何,我知道你从“第一件事”到“这正在显示两个命令”的所有解释:阅读 packagecontrol.io 文档给了我所有这些信息。但是你的方法让我向我解释了 ST 命令的使用和有关它的启动的详细信息,非常有用。
  • 仍然,它不能回答我的问题,因为您限制了命令行的方法。如果您在 Windows 中创建快捷方式时已将其转置,我本可以接受。但您没有提供有关这一点的详细信息。您刚刚对我说“有了这些信息,您可以设置诸如桌面快捷方式之类的东西来运行适当的命令”。此外,说“如果您使用的软件包提供了一个可以让它直接启动会话的命令......”并不能解释为什么它不这样做;虽然我知道您不想替换原始开发人员并让他工作。无论如何谢谢。
  • 感谢您提供如此详细的分步说明!我现在了解如何通过命令行使用 Sublime,非常有用。崇高的答案。
猜你喜欢
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 2013-11-02
  • 2011-05-05
  • 2012-07-15
相关资源
最近更新 更多