1

Ich bin neu in Python und Sublime API. Ich versuche, ein einfaches Plugin für ST3 zu schreiben, das ein leeres Fenster schließen soll (wenn ich Strg-E drücke). Hier sind die Schritte, die ich zu implementieren bin versucht:Anzahl der Registerkarten im aktuellen Fenster prüfen

  1. Überprüfen Sie, ob gespaltet Scheiben sind oder nicht (Ansicht> Layout)
  2. Wenn es keine gesplitteten Scheiben (Ansicht> Layout> Single) - nichts tun (Rückkehr).
  3. Wenn aufgeteilte Bereiche vorhanden sind und im aktuellen Bereich 1 oder mehr Registerkarten vorhanden sind, schließen Sie diese aktive Registerkarte. Wenn im aktiven Bereich keine Registerkarten vorhanden sind, schließen Sie dieses Fenster selbst.

Und da ist der Code, den ich versuche zu schreiben. Ja, offensichtlich gibt es eine Menge Fehler.

Ich vielleicht falsch, aber es scheint das Hauptproblem auftritt, wenn ich versuche, die Anzahl der geöffneten Registerkarten im aktuellen Bereich zu überprüfen. Wie kann es behoben werden?

Antwort

2

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_commandTextCommand 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.

+0

Fantastische Beschreibung! Jetzt ist es viel einfacher, alles darüber zu verstehen! – jsv

Verwandte Themen