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

时间:2018-02-15 16:38:08

标签: plugins sublimetext3 desktop-shortcut

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

1 个答案:

答案 0 :(得分: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 +`。在出现的控制台中,输入以下命令并按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以便它在路径中(你如何做到这一点是OS特定的)。如果在终端中运行subl会出现有关缺少命令的错误,请将Sublime安装目录添加到路径中,或使用完全限定的文件名代替subl(例如,"C:\Program Files\Sublime Text 3\subl" if你在Windows上);或要求您知道Sublime的安装位置。

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

将命令名和参数都视为一个命令行参数非常重要,这要求您将整个事物包装在引号字符中,否则空格将使其显示为多个参数。

如果您忘记了这一点,Sublime将通过打开以命令的不同部分命名的文件和您尝试打开的参数作出回应,并错误地认为您要将文件打开。

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

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

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

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

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

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

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

同样,你如何做到这一点特定于你正在使用的操作系统,所以我在这个答案中并没有真正涵盖这一点。请记住,无论有问题的OS,保持不变的部分是您需要使用subl命令,如上所述。

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

但是,正如我上面提到的,此套餐目前还不允许这样做。

现在,这是整个事情的 GIANT CAVEAT ;这只适用于Sublime已经运行的情况。

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

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

问题在于,只要Sublime启动,subl就会传递相应的命令然后退出,并且由于尚未加载包,因此您要执行的命令不会被执行。 ; t存在(没有加载),所以没有实际发生。

不幸的是,如果你想启动Sublime并执行命令,那么对于这个特定问题并不是一个令人满意的方法。

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

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