Sublime 3插件存储快速面板返回值

时间:2016-10-13 17:51:40

标签: sublimetext3 sublimetext sublime-text-plugin

我试图编写一个简单的插件,根据某个列表生成一个快速面板,等待用户选择一个项目,然后根据用户选择的值执行操作。基本上,我想做以下事情:

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插件开发的新手。

2 个答案:

答案 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

     

项可以是字符串列表,也可以是字符串列表列表。在后一种情况下,快速面板中的每个条目都将显示多行。

     

-1flagssublime.MONOSPACE_FONT

的按位OR      如果给出了

sublime.KEEP_OPEN_ON_FOCUS_LOST,则每次更改快速面板中突出显示的项目时都会调用它。

     

- Sublime Text API Reference

现在,让我们重新编写示例命令。

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)