Sublime Text 菜单项不起作用

Sublime Text menu item not working

我正在尝试创建一个 sublime 文本插件。我成功创建了它,我现在正尝试向菜单添加一个项目,当它被 selected 时,它将调用插件。我无法将菜单项插入正确的位置,也无法在创建后调用插件。

假设我有以下插件:

import sublime, sublime_plugin

class ExampleCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        self.view.insert(edit, 0, "Hello, World!")

我在

创建了一个文件夹

C:\Users\"userName"\AppData\Roaming\Sublime Text 3\Packages\"My Plugin"

并将插件文件添加到该目录。然后我在一个名为 Main.sublime-menu

的文件中添加了以下代码
[
{
    "id": "file",
    "children":
    [
        {"id": "save"},
        {"caption": "My Plugin"},
        { "command": "myPlugin" }
    ]
}
]

问题是,我在菜单中得到两个 My PluginmyPlugin 项,它们在 exit 菜单之后。我希望它是在保存之后。此外,当我 select My Plugin 时,我在控制台中收到错误消息:

Unable to parse command:

如何在 save 菜单项之后添加菜单项,并让菜单项调用名为 myPlugin 的插件?

插件中的命令名称不是取自它们存储的 python 文件的名称;它们源自实现命令的 class 的名称,因此多个命令可以存储在一个文件中。

此外,命令名称是 snake cased 并且强制全部小写。如果你的 class 没有以那种风格命名,Sublime 会通过以下方式将它转换成那种风格:

  1. 丢弃末尾的 Command 文本(如果存在)
  2. 将前导大写字符转换为小写
  3. 将每隔一个大写字符替换为下划线和该字符的小写等效字符。

这意味着对于上面的示例,您将使用的命令名称是 example。你不能把它变成 myPlugin 因为它里面有一个大写字符。将 class、MyPluginCommandMyPluginmy_plugin 命名将创建一个名为 my_plugin 的命令,该命令尽可能接近。

Main.sublime-menu 的示例内容没有遵循 children 数组中项目的正确数据结构,这就是这些项目出现两次的原因。有一些 unofficial documentation on the menu format 概述了菜单项的字段和结构。

项目被附加到菜单末尾的原因是来自多个包的菜单如何合并在一起。基本上有些项目有一个 id 字段,给他们一个唯一的 ID;当多个项目具有相同的 ID 时,它们会按照它们来自的包的加载顺序连接在一起。

您的菜单项使用fileid表示文件菜单,然后包含saveid;由于默认主菜单不包含具有该 ID 的项目,因此您的项目会卡在菜单末尾。

您在控制台中看到的错误是因为标题为 My Plugin 的菜单项不包含 command 字段;相反,它后面的菜单项指定 command 而未指定 caption。 Sublime 告诉你它无法解析命令,因为找不到命令。

为了做你想做的事,你需要一个看起来像这样的 Main.sublime-menu:

[
    {
        "id": "file",
        "children":
        [
            {
                "caption": "My Plugin",
                "command": "my_plugin"
            }
        ]
    },
]

这假设您已重命名 class 执行上述命令。