Ihr erster Versuch ist ein ziemlich guter Start für das, was Sie zu tun versuchen, Sie haben nur ein paar kleinere Syntaxprobleme und ein paar Probleme, die damit zu tun haben, wie die API funktioniert.
Eine angepasste Version Ihres Codes ist unten, um Sie ins Rollen zu bringen.
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")
Obwohl technisch nicht erforderlich ist, ist es gute Praxis zu Suffix-Klassen, die Befehle mit Command
umzusetzen; Sublime löst diesen Teil bei der Erstellung des internen Befehlsnamens ab, macht Ihren Code jedoch für andere Plugin-Autoren (und Sie selbst) leichter lesbar, da kompliziertere Plugins andere Nicht-Befehlsklassen enthalten können.
In der API-Dokumentation sagt Ihnen alles, was seine Rückgabe in [square brackets]
anzeigt, dass der Rückgabewert eine Liste von Dingen ist (d. H. Ein Array). Ihr Problem mit der Anzahl der Registerkarten in der Gruppe ist also, dass die Methode, die Sie aufrufen, Ihnen sagt, was alle Ansichten sind, anstatt , wie viele von ihnen gibt es. Hier kann die Python len
Funktion die Länge der Liste für Sie bekommen.
Der große Gotcha (das fängt jeder an einem gewissen Punkt out) ist, dass View
, Window
und das sublime
Modul alle eine run_command
Methode haben einen Befehl auszuführen, aber die Befehle, die sie sind etwas anders ausführen kann.
View.run_command
implementiert Befehle als TextCommand
(Dinge, die den Puffer ändern) ausführen, während ein Window.run_command
TextCommand
oder WindowCommand
laufen kann. In diesem Fall sind die Befehle, die Sie verwenden möchten, WindowCommand
-Befehle. Damit sie funktionieren, müssen Sie dem Fenster mitteilen, dass sie ausgeführt werden sollen, nicht die aktuelle Ansicht.
Es kann praktisch sein, wenn Sie an einem Plugin arbeiten, um die Sublime-Konsole offen zu halten, damit Sie sehen können, was passiert. Das sagt Ihnen sofort über Syntaxprobleme in Ihrem Code (wie =
vs ==
Problem), wenn Sie speichern, und erhalten Sie eine Fehlermeldung, wenn Sie versuchen, etwas aufzurufen, das nicht existiert (wie active_view_in_group
, wenn Sie nicht sag es, dass du es auf dem window
laufen lässt).
Wo das fällt ist, dass run_command
keinen Fehler generiert, wenn Sie versuchen, einen Befehl auszuführen, der nicht weiß, wie er behandelt wird; Tatsächlich erzeugt es nicht einmal einen Fehler, wenn Sie versuchen, einen Befehl auszuführen, der nicht existiert.
Für diese Art von Problem müssen Sie nur beachten, dass, wenn es keine anderen Fehler gibt und Sie sicher sind, dass es zu diesem Teil des Plugins kommt, verwenden Sie möglicherweise das falsche, um den Befehl auszuführen oder es möglicherweise falsch geschrieben.
Fantastische Beschreibung! Jetzt ist es viel einfacher, alles darüber zu verstehen! – jsv