Проверить количество вкладок в текущей панели

Я новичок в Python и Sublime API. Я пытаюсь написать простой плагин для ST3, который должен закрывать пустую панель (когда я нажимаю Ctrl-E). Вот шаги, которые я пытаюсь реализовать:

  1. Проверьте, есть ли разделенные панели или нет (Вид> Макет)
  2. Если нет разделенных панелей (Вид> Макет> Одиночные) - ничего не делать (возврат).
  3. Если есть разделенные панели и на текущей панели есть одна или несколько вкладок, закройте эту активную вкладку. А если в активной панели нет вкладок, закройте саму панель.

И вот код, который я пытаюсь написать. Да, очевидно, здесь много ошибок.

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")

Возможно, я ошибаюсь, но, похоже, основная проблема возникает, когда я пытаюсь проверить количество открытых вкладок на текущей панели. Как это исправить?


person jsv    schedule 24.03.2017    source источник


Ответы (1)


Ваша первая попытка - довольно хорошее начало для того, что вы пытаетесь сделать, у вас просто есть пара незначительных проблем с синтаксисом и пара проблем, связанных с тем, как работает 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 может получить длину списка за вас.

Большая проблема (которая в какой-то момент улавливает всех) заключается в том, что View, Window и модуль sublime имеют run_command метод для запуска команды, но команды, которые они могут выполнять, немного отличаются.

View.run_command может запускать команды, реализованные как TextCommand (вещи, которые изменяют буфер), а Window.run_command может запускать TextCommand или WindowCommand. В этом случае команды, которые вы пытаетесь использовать, - это WindowCommand команды, поэтому для их работы вам нужно указать окну, чтобы они запускались, а не текущему представлению.

Когда вы работаете над плагином, это может быть удобно, чтобы консоль Sublime оставалась открытой, чтобы вы могли видеть, что происходит. Это сразу же расскажет вам о проблемах синтаксиса в вашем коде (например, о проблеме = vs ==) при сохранении и выдаст вам сообщение об ошибке, когда вы попытаетесь вызвать то, чего не существует (например, active_view_in_group, если вы этого не сделаете. скажите, что вы запускаете его на window).

Это происходит потому, что run_command не генерирует ошибку, если вы пытаетесь запустить команду, которую он не знает, как обрабатывать; на самом деле он даже не генерирует ошибку, если вы пытаетесь запустить команду, которой не существует.

Для такого рода проблем вам просто нужно отметить, что если нет других ошибок, и вы уверены, что они попадают в эту часть плагина, вы можете использовать неправильную вещь для запуска команды или она может быть написана неправильно.

person OdatNurd    schedule 25.03.2017
comment
Фантастическое описание! Теперь разобраться в ней стало намного проще! - person jsv; 25.03.2017