检查当前窗格中的选项卡数量

时间:2017-03-24 23:24:11

标签: sublimetext2 sublimetext3 sublimetext sublime-text-plugin

我是Python和Sublime API的新手。我试图为ST3编写一个简单的插件,它应该关闭一个空窗格(当我按下Ctrl-E时)。以下是我尝试实施的步骤:

  1. 检查是否存在拆分窗格(查看>布局)
  2. 如果没有拆分窗格(View> Layout> Single) - 什么都不做(返回)。
  3. 如果存在拆分窗格且当前窗格中有1个或多个选项卡,则关闭此活动选项卡。如果活动窗格中没有选项卡,请关闭此窗格本身。
  4. 还有我试图写的代码。是的,显然有很多错误。

    import sublime_plugin
    
    class CloseEmptyPane(sublime_plugin.WindowCommand):
        def run(self):
            window = self.window
            if window.num_groups() = 1:
                return
            active_pane = window.active_group()
            tabs_in_pane = window.views_in_group(active_pane)
            current_tab = active_view_in_group(active_pane)
            if tabs_in_pane > 0:
                current_tab.run_command("close_file")
            else:
                active_pane.run_command("close_pane")
    

    我可能错了,但是当我试图检查当前窗格中打开的标签数量时,似乎出现了主要问题。如何解决?

1 个答案:

答案 0 :(得分:2)

你的第一次尝试是你正在尝试做的一个非常好的开始,你只是有一些小的语法问题和一些与API如何工作有关的问题。

下面是您的代码的调整版本,以帮助您实现目标。

import sublime_plugin

# Note 1: Add "Command" to name
class CloseEmptyPaneCommand(sublime_plugin.WindowCommand):
    def run(self):
        window = self.window
        # Note 2: '=' is assignment; use '==' for equality
        if window.num_groups() == 1:
            return

        active_pane = window.active_group()
        # Note 3: views_in_group returns a list of views
        tabs_in_pane = len(window.views_in_group(active_pane))
        # Note 4: This method is in window
        current_tab = window.active_view_in_group(active_pane)

        # Note 5: These commands are window commands
        if tabs_in_pane > 0:
            window.run_command("close_file")
        else:
            window.run_command("close_pane")

虽然技术上不需要,但优良作法是使用Command实现命令的后缀。 Sublime在创建内部命令名时会抛弃该部分,但它使您的代码更容易为其他插件作者(和您自己)读取,因为更复杂的插件可能包含其他非命令类。

在API文档中,列出其在[square brackets]中返回的任何内容都告诉您返回值是事物列表(即数组)。因此,获取组中标签数量的问题在于,您调用的方法会告诉您所有视图 ,而不是 那些是。这里python len函数可以为你获取列表的长度。

最重要的是({1}},ViewWindow模块都有sublime方法来运行命令,但他们可以执行的命令略有不同。

run_command可以运行以View.run_command(修改缓冲区的内容)实现的命令,而TextCommand可以运行Window.run_commandTextCommand。在这种情况下,您尝试使用的命令是WindowCommand命令,因此要使它们工作,您需要告诉窗口运行它们,而不是当前视图。

当您使用插件来保持Sublime控制台处于打开状态时,它可以很方便,以便您可以看到正在发生的事情。当您保存时,会立即告诉您代码中的语法问题(例如WindowCommand vs =问题),当您尝试调用不存在的内容时会出现错误(例如==,如果你没有告诉它你在active_view_in_group上运行它。

如果你试图运行一个它不知道如何处理的命令,那么window不会产生错误;实际上,如果您尝试运行不存在的命令,它甚至不会生成错误。

对于那种问题,您只需要注意,如果没有其他错误并且您确定它已经到达插件的那一部分,那么您可能使用了错误的操作来运行命令,或者它可能拼写错误错。