【问题标题】:Sublime Text menu item not working崇高文本菜单项不起作用
【发布时间】:2016-08-10 03:53:44
【问题描述】:

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

假设我有以下插件:

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\"我的插件"

并将插件文件添加到该目录。然后我在一个名为Main.sublime-menu的文件中添加了以下代码

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

问题是,我在菜单中有两个 My PluginmyPlugin 项目,它在 exit 菜单之后。我希望它是在保存之后。另外,当我选择My Plugin 时,控制台中出现错误:

无法解析命令:

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

【问题讨论】:

  • 如果您在 Python 代码中定义的 TextCommand 命名为 ExampleCommand,则您要从菜单执行的命令将是 example
  • 并且您已经定义了 3 个孩子 - idcaptioncommand 应该都属于同一个 JSON 对象。

标签: sublimetext3 sublime-text-plugin


【解决方案1】:

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

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

  1. 丢弃末尾的 Command 文本(如果存在)
  2. 将前导大写字符转换为小写
  3. 将所有其他大写字符替换为下划线和对应的小写字符。

这意味着对于上面的示例,您将使用的命令名称是example。您不能将其设为myPlugin,因为其中包含大写字符。将类命名为 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"
            }
        ]
    },
]

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

【讨论】:

  • 感谢您完整详细的回答/解释!去接受它并支持它!就一个问题。如何控制菜单项的位置?
  • 当您指定菜单中已存在的id 值时,您的项目将附加在菜单中该特定项目之后的所有项目之后。另一个带有不同id 的项目标志着菜单部分的结束和新部分的开始。这就是为什么添加一个全新的id 会将您的项目放在菜单的末尾。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-03
  • 1970-01-01
  • 1970-01-01
  • 2013-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多