如何从命令行执行Sublime插件命令



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

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+'。在出现的控制台中,输入以下命令并按 Enter 键。

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 FilesSublime Text 3subl"如果你在Windows上);两者都需要您知道Sublime安装在哪个位置。

如果要使用接受参数的命令,则还需要在命令中包含参数,其方式与在上面的控制台中显示的方式相同。

命令名称和参数都被视为一个命令行参数非常重要,这需要您将整个内容括在引号字符中,否则空格将使其显示为多个参数。

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

举个具体的例子,要让Sublime从Sublime外部打开命令面板,如果你在Linux/MacOS上,执行此操作的命令将如下所示:

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

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

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

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

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

掌握这些信息后,您可以设置桌面快捷方式之类的内容来运行相应的命令,或者可能设置用于在双击所选文件时专门执行命令的文件资源管理器。

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

现在,在您的特定情况下,如果您使用的包提供了一个命令,该命令允许它直接加载会话而不先提示您,则您使用的命令还需要包含会话文件的名称作为命令参数之一。

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

现在,这是整个事情的巨大警告;这只有在Sublime已经在运行时才有效。

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

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

这样做的一个问题是,一旦Sublime启动,subl传递适当的命令然后退出,并且由于包尚未加载,因此您要执行的命令尚不存在(尚未加载),因此实际上什么都不会发生。

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

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

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

最新更新