我试图编写一个简单的插件,根据某个列表生成一个快速面板,等待用户选择一个项目,然后根据用户选择的值执行操作。基本上,我想做以下事情:
class ExampleCommand(sublime_plugin.TextCommand):
def __init__(self):
self._return_val = None
self._list = ['a', 'b', 'c']
def callback(self, idx)
self._return_val = self._list[idx]
def run(self):
sublime.active_window().show_quick_panel(
options, self.callback)
if self._return_val == 'a'
// do something
然而,show_quick_panel在选择任何内容之前返回,因此在if语句运行之前,self._return_val不会被分配给所选索引。
我该如何解决这个问题?有一个事件监听器?我是Python和Sublime插件开发的新手。
答案 0 :(得分:1)
qmap
是异步的,因此在执行时show_quick_panel()
方法的其余部分已完成执行。选择后的操作应该在回调中完成。只有在用户从快速面板中选择了某个项目或将其解除后,才会调用该回调。
首先,您使用的是run()
,因此TextCommand
方法的签名为run()
,它需要run(edit, <args>)
参数。
另请注意,如果用户未选择任何内容(取消快速面板),则回调将收到edit
的索引,例如如果用户按 Escape 。
以下是-1
API:
<强>
show_quick_panel
强>显示快速面板,以选择列表中的项目。将使用所选项目的索引调用
show_quick_panel(items, on_done, <flags>, <selected_index>, <on_highlighted>)
一次。如果快速面板被取消,将使用on_done
参数调用on_done
。项可以是字符串列表,也可以是字符串列表列表。在后一种情况下,快速面板中的每个条目都将显示多行。
的按位OR 如果给出了
-1
是flags
和sublime.MONOSPACE_FONT
sublime.KEEP_OPEN_ON_FOCUS_LOST
,则每次更改快速面板中突出显示的项目时都会调用它。
现在,让我们重新编写示例命令。
on_highlighted
有关使用class ExampleCommand(sublime_plugin.TextCommand):
def on_done(self, index):
if index == -1:
# noop; nothing was selected
# e.g. the user pressed escape
return
selected_value = self.items[index]
# do something with value
def run(self, edit):
self.items = ['a', 'b', 'c']
sublime.active_window().show_quick_panel(
self.items,
self.on_done
)
的更多示例,请参阅我的polyfill包。
答案 1 :(得分:0)
显示quickpanel显然不会阻止程序执行。我建议创建并传递一个延续:
import sublime
import sublime_plugin
class ExampleQuickpanelCommand(sublime_plugin.WindowCommand):
def run(self):
# create your items
items = ["a", "b", "c"]
def on_select(index):
if index == -1: # canceled
return
item = items[index]
# process the selected item...
sublime.error_message("You selected '{0}'".format(item))
self.window.show_quick_panel(items, on_select)