防止Sublime插件TextCommand在控制台上运行?

时间:2014-10-07 15:52:42

标签: python sublimetext sublime-text-plugin

我有一个Sublime插件TextCommand,其中包括设置视图语法文件。我以前没有意识到这一点,但似乎控制台输入实际上是一个视图,因此如果在运行TextCommand时选择它,它将在控制台输入字段上执行。如何阻止我的命令在其上运行?

这是一个示例插件:

from sublime_plugin import TextCommand

class ExampleCommand(TextCommand):
    def run(self, edit):
        if 'Python' not in self.view.settings().get('syntax'):
            self.view.set_syntax_file('Packages/Python/Python.tmLanguage')

如果我打开控制台,然后单击输入字段,并使用键盘快捷键激活TextCommand,然后更改控制台的输入字段以匹配Python主题。

要清楚,我根本不希望这个TextCommand在控制台的输入字段上运行。我如何检测这是否是我的命令运行的地方,如果是这样的话就中止它?

1 个答案:

答案 0 :(得分:1)

好吧,我找到了解决方案。

不使用self.view,而是使用self.view.window().active_view()。这将导致您的代码在当前所选窗口中最近处于活动状态的普通视图上运行,这可能是用户意图做的很好的假设。

您可能想要处理的一个不寻常的情况:用户可能有一个没有打开缓冲区的窗口,它打开了控制台。它可以运行TextCommand,但在这种情况下,self.view.window().active_view()将返回None。您可能想要检查并处理该案例。

如果您在控制台输入视图中将光标运行时用户运行命令时更喜欢采用更安全的路径并且不执行任何操作,则可以执行以下操作:

from sublime_plugin import TextCommand

class ExampleCommand(TextCommand):
    def run(self, edit):
        # If the user attempted to run the command while having a non-activatable
        # view selected, such as the console input view, don't run anything.
        if self.view.id() != self.view.window().active_view().id():
            return
        # Otherwise continue running the command as normal...