Sublime Text菜单项不起作用

时间:2016-08-10 03:53:44

标签: sublimetext3 sublime-text-plugin

我正在尝试创建一个崇高的文本插件。我成功创建了它,现在我正在尝试将一个项目添加到菜单中,当它被选中时,它将调用该插件。我在将菜单项插入正确的位置时遇到问题,并在创建后调用插件。

说我有以下插件:

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菜单后面。我希望它在保存之后。此外,当我选择My Plugin时,我在控制台中收到错误:

  

无法解析命令:

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

1 个答案:

答案 0 :(得分:1)

插件中的命令名不是从存储它们的python文件的名称中获取的;它们派生自实现命令的类的名称,以便多个命令可以存储在单个文件中。

此外,命令名称为snake cased,并强制为全部小写。如果您的类未以该样式命名,Sublime将通过以下方式将其转换为该样式:

  1. 最后丢弃Command文本(如果存在)
  2. 将前导大写字母转换为小写
  3. 用下划线替换每个其他大写字符,并使用该字符的小写等效字符。
  4. 这意味着对于上面的示例,您将使用的命令名称为example。你不能使它成为myPlugin,因为它有一个大写字符。命名类MyPluginCommandMyPluginmy_plugin会创建一个名为my_plugin的命令,该命令尽可能接近。

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

    将项目追加到菜单末尾的原因是因为多个包中的菜单如何合并在一起。基本上一些项目中有一个id字段,为它们提供唯一的ID;当多个项目具有相同的ID时,它们会按照它们来自的软件包的顺序连接在一起。

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

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

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

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

    这假定您已重命名实现上述命令的类。