(Plugin Development) (崇高) (Python) (.崇高菜单)
我目前正在寻找一种方法来创建一个唯一的context_menu,它不依赖于任何已经存在的默认的“.崇高菜单”文件。我只想使用普通的context_menu,但我已经很好地填满了它。我想要不同菜单的不同按钮。
这是我当前的右击菜单:
我现在的context_menu:

我想要创建另一个类似于这个菜单的动态菜单,但它是而不是依赖于主/context.崇高菜单,并且是通过使用键/鼠标组合ctrl+button4 (我已经设置了)来激活的。
{
"button": "button4",
"count": 1,
"modifiers": ["ctrl"],
"command": "quick_click"
}我将show_popup_menu()视为选项,并将paste_from_history.py文件用作一种引用。
来自Sublime\Packages\Default.sublime-package.zip\paste_from_history.py的类
然而,菜单似乎要做的唯一一件事是从列表中获得突出显示的选择,并将其传递给文本变量,然后传递给文本命令“粘贴”。
即
g_clipboard_history.push_text(text)
sublime.set_clipboard(text)
self.view.run_command("paste")show_popup_menu(项目,on_done,标志)有字段“items”、“on_done”、“等”。我不知道这些是什么意思,也不知道如何使用它们。
我尝试过这样的代码:(我没有得到任何反馈)
class QuickClickCommand(sublime_plugin.TextCommand):
def run(self, view):
self.view.show_popup_menu (
[
"Select All",
"Swap Case"
],
[
self.view.run_command("select_all"),
self.view.run_command("swap_case")
],
["1", "2"] // ← with or without this option
)但是当我使用以下代码时,►
class QuickClickCommand(sublime_plugin.TextCommand):
def run(self, view):
self.view.show_popup_menu (
["Item 1", "Item 2"], ["1", "2"]
)►我得到了一个包含两个条目的上下文菜单--当按下它们时,它们都不会做任何事情。
一种上下文菜单类型:

我尝试过几种组合--似乎没有什么效果,而且我找不到关于这个主题的信息。
如你所见,我有一个插件:
类QuickClickCommand(sublime_plugin.TextCommand)
我通过选择ctrl+button4来访问这个插件
{
"button": "button4",
"count": 1,
"modifiers": ["ctrl"],
"command": "quick_click"
}是否有可能创建自己的QuickClick.崇高菜单文件,还是只能使用默认的context_menu.崇高-菜单?
任何关于如何使用appreciated. (项目、on_done)的链接、建议或解释都将是
这里是用户文档对它的看法:
显示插入符号处的弹出菜单,以在列表中选择项。
on_done将被调用一次,其中包含所选项的索引。
如果弹出菜单被取消,on_done将被调用,参数为-1。
项是字符串的数组。
标志当前没有选项。
当我使用时,下面的代码:我得到了以下结果。
class QuickClickCommand(sublime_plugin.TextCommand):
def run(self, view):
self.view.show_popup('Hello, <b>World!</b><br>
<a href="moo">Click Me</a>', on_navigate=print)
self.view.show_popup_menu (["Item 1", "Item 2"], ["1", "2"]) 会弹出菜单。
弹出菜单:

一旦我选择了这两个项目中的任何一个,我就会得到一个面板,上面写着“Hello”和“Click”链接。
你好,世界!小组讨论会:

一旦点击‘点击我’-‘你好,世界’-将自己传播到控制台。
是否有一种方法可以使我自己的自定义菜单变得崇高(除了向其他11个可能的菜单中添加内容外,还可以在注入时使用)?
感谢你的病人阅读这篇文章和你可能花在回复我的任何时间。
发布于 2019-05-31 19:17:49
view.show_popup_menu()的文档说明如下:

也就是说,该方法将菜单中显示的字符串列表作为第一个参数,并在用户选择一个项作为第二个参数时调用该函数;该函数将被传递给用户选择的项的索引。
在示例代码中,第二个参数不是函数,而是另一个列表。您不会得到任何直接的反馈,但这只是因为当崇高试图调用回调并失败时,它正在吃掉错误。
第三个参数对任何东西都没有影响,因为正如文档中所概述的那样,尽管它应该是标志,但它目前被忽略了。
您的问题还引用了使用此API端点的paste_from_history命令,相关代码行如下:
self.view.show_popup_menu(keys, lambda choice_index: self.paste_choice(choice_index))这表明第二个参数是一个函数(在本例中是lambda),它提供了用户选择该项时选择的索引。
这带来的好处是,与标准菜单不同,当您使用view.show_popup_menu()时,它所做的只是在窗口的插入符号位置打开一个菜单,以显示用户的选项,而当用户选择一个菜单时,您会被告知他们选择了哪个菜单。如果菜单没有被选中就被取消,您也会被告知(所选的项是-1,这不是一个有效的索引)。
如果您想从这样的菜单中运行命令,则需要下面这样的命令:
import sublime
import sublime_plugin
class QuickClickCommand(sublime_plugin.TextCommand):
def run(self, edit):
items = [
{"caption": "Echo stuff", "command": "echo", "args": {"a": True}},
{"caption": "Select All", "command": "select_all"},
{"caption": "Swap Case", "command": "swap_case"},
]
self.view.show_popup_menu(
[item["caption"] for item in items],
lambda idx: self.pick(idx, items))
def pick(self, idx, items):
if idx >= 0:
command = items[idx].get("command")
args = items[idx].get("args")
self.view.window().run_command(command, args)首先,有一个您希望能够执行的命令的列表,概述为指定一个caption (您想在菜单中看到的)、command (要执行的实际命令)和args (该命令可能碰巧接受或需要的任何参数)的对象。
我们调用show_popup_menu并向它传递一个字符串列表,该列表是使用列表理解的列表中所有项的标题。第二个参数是当用户取消菜单或选择项目时将调用的回调。我们指定,应该根据用户选择的项的索引以及项目的原始列表来调用它。
当选择一个项时,将调用pick()并给出所选项的索引。如果是-1,那么用户关闭了菜单,所以我们什么也不做。否则,我们将使用提供的索引从原始项列表中获取命令和参数(如果有的话),然后运行该命令。
这使用self.view.window().run_command()而不是self.view.run_command(),因为view只能执行修改缓冲区的命令;因此,通常最好使用window来运行命令,因为它可以运行所有命令。
https://stackoverflow.com/questions/56388928
复制相似问题