Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Code
  2. Python
Code

Wie kann man ein Sublime Text 2 Plugin erstellen

by
Difficulty:IntermediateLength:LongLanguages:

German (Deutsch) translation by Katharina Nevolina (you can also view the original English article)

Sublime Text 2 ist ein hochgradig anpassbarer Texteditor, der zunehmend die Aufmerksamkeit von Programmierern auf sich zieht, die nach einem leistungsstarken, schnellen und modernen Werkzeug suchen.  Heute werden wir mein populäres Sublime-Plugin neu erstellen, das CSS über die Nettuts + Prefixr-API für einfaches browserübergreifendes CSS sendet.

Wenn Sie fertig sind, werden Sie ein solides Verständnis davon haben, wie das Sublime Prefix-Plugin geschrieben ist, und Sie können damit beginnen, Ihre eigenen Plugins für den Editor zu schreiben!


Vorwort: Terminologie und Referenzmaterial

Das Erweiterungsmodell für Sublime Text 2 ist ziemlich voll ausgestattet.

Das Erweiterungsmodell für Sublime Text 2 ist ziemlich voll ausgestattet.  Es gibt Möglichkeiten, die Syntax-Hervorhebung, das eigentliche Chrome des Editors und alle Menüs zu ändern.  Darüber hinaus ist es möglich, neue Build-Systeme, Auto-Vervollständigungen, Sprachdefinitionen, Snippets, Makros, Tastenbelegungen, Mausbindungen und Plugins zu erstellen.  Alle diese verschiedenen Arten von Modifikationen werden über Dateien implementiert, die in Paketen organisiert sind.

Ein Paket ist ein Ordner, der in Ihrem Pakages-Verzeichnis gespeichert ist.  Sie können auf Ihr Pakages-Verzeichnis zugreifen, indem Sie auf den Menüeintrag Preferences > Browse Packages…klicken.  Es ist auch möglich, ein Paket in einer einzigen Datei zu bündeln, indem Sie eine Zip-Datei erstellen und die Erweiterung in .sublime-package ändern.  Wir werden in diesem Tutorial ein bisschen mehr über die Verpackung diskutieren.

Sublime wird mit einer ganzen Reihe verschiedener Pakete ausgeliefert.  Die meisten der gebündelten Pakete sind sprachspezifisch.  Diese enthalten Sprachdefinitionen, Autovervollständigungen und Build-Systeme.  Zusätzlich zu den Sprachpaketen gibt es zwei weitere Pakete: Deafult und User.  Das 
Deafult-Paket enthält alle Standard-Tastenbelegungen, Menüdefinitionen, Dateieinstellungen und eine ganze Reihe von Plugins, die in Python geschrieben sind.  Das User-Paket ist insofern besonders, als es immer zuletzt geladen wird.  Dadurch können Benutzer die Standardwerte überschreiben, indem sie Dateien in ihrem User-Paket anpassen.

Während des Schreibens eines Plugins wird die Sublime Text 2-API-Referenz benötigt.

Während des Schreibens eines Plugins wird die Sublime Text 2-API-Referenz benötigt.  Darüber hinaus dient das Default-Paket als gute Referenz, um herauszufinden, wie man etwas macht und was möglich ist.  Ein großer Teil der Funktionalität des Editors wird über Befehle verfügbar gemacht.  Jede andere Operation als die Eingabe von Zeichen wird über Befehle ausgeführt.  Wenn Sie den Menüeintrag Preferences > Key Bindings - Defaultmenu entry, ist es möglich, eine Fundgrube an integrierten Funktionen zu finden.

Jetzt, da die Unterscheidung zwischen einem Plugin und einem Paket klar ist, beginnen wir mit dem Schreiben unseres Plugins.


Schritt 1 - Starten eines Plugins

Sublime kommt mit einer Funktionalität, die ein Python-Skeleton generiert, das zum Schreiben eines einfachen Plugins benötigt wird.  Wählen Sie den Menüeintrag Tools > New Plugin… und ein neuer Puffer wird mit diesem Textbaustein geöffnet.

Hier können Sie sehen, dass die zwei Sublime Python-Module importiert werden, um die Verwendung der API zu ermöglichen, und eine neue Befehlsklasse erstellt wird.  Bevor wir das bearbeiten und ein eigenes Plugin erstellen, speichern wir die Datei und lösen die eingebaute Funktionalität aus.

Wenn wir die Datei speichern, erstellen wir ein neues Paket zum Speichern.  Drücken Sie ctrl+s (Windows / Linux) oder cmd+s (OS X), um die Datei zu speichern.  Der Speicherdialog wird für das User-Paket geöffnet.  Speichern Sie die Datei nicht dort, sondern durchsuchen Sie einen Ordner und erstellen Sie einen neuen Ordner namens Prefixr.

Speichern Sie nun die Datei im Prefixr-Ordner als Prefixr.py.  Es ist eigentlich egal, was der Dateiname ist, nur dass er in .py endet.  Wir verwenden jedoch standardmäßig den Namen des Plugins für den Dateinamen.

Jetzt, da das Plugin gespeichert ist, probieren wir es aus. Öffnen Sie die Sublime-Konsole, indem Sie ctrl+ `drücken.  Öffnen Sie die Sublime-Konsole, indem Sie ctrl+`drücken. Das ist eine Python-Konsole, die Zugriff auf die API hat.  Geben Sie das folgende Python ein, um das neue Plugin zu testen:

Sie sollten Hello World am Anfang der Plugin-Datei sehen.  Stellen Sie sicher, dass Sie diese Änderung rückgängig machen, bevor Sie fortfahren.


Schritt 2 - Befehlstypen und Benennung

Für Plugins bietet Sublime drei verschiedene Arten von Befehlen.

  • Textbefehle bieten über ein View-Objekt Zugriff auf den Inhalt der ausgewählten Datei/des ausgewählten PuffersFensterbefehle stellen über ein View-Objekt 
  • Fensterbefehle stellen über ein Window-Objekt Verweise auf das aktuelle Fenster bereit
  • Anwendungsbefehle haben keinen Verweis auf ein bestimmtes Fenster oder eine Datei/einen Puffer und werden seltener verwendet

Da wir den Inhalt einer CSS-Datei/eines Puffers mit diesem Plugin manipulieren werden, verwenden wir die sublime_plugin.TextCommand-Klasse als Basis für unseren benutzerdefinierten Prefixr-Befehl.  Das bringt uns zum Thema der Benennung von Befehlsklassen.

Im von Sublime bereitgestellten Plugin-Skelett werden Sie die Klasse bemerken:

Als wir den Befehl ausführen wollten, haben wir den folgenden Code in der Konsole ausgeführt:

Sublime nimmt jede Klasse, die eine der sublime_plugin-Klassen 
erweitert (TextCommand, WindowCommand oder ApplicationCommand), entfernen Sie das Suffix Command und konvertieren Sie dann CamelCasein in die underscore_notation für den Befehlsnamen.

Um einen Befehl mit dem Namensprefixr zu erstellen, muss die Klasse daher PrefixrCommand sein.


Schritt 3 - Auswählen von Text

Eine der nützlichsten Funktionen von Sublime ist die Möglichkeit, mehrere Auswahlen zu haben.

Jetzt, da wir unser Plugin korrekt benannt haben, können wir damit beginnen, CSS aus dem aktuellen Puffer zu holen und an die Prefixr-API zu senden.  Eine der nützlichsten Funktionen von Sublime ist die Möglichkeit, mehrere Auswahlen zu haben.  Da wir den ausgewählten Text greifen, müssen wir unseren Plug in Handle schreiben, nicht nur die erste Auswahl, sondern alle.

Da wir einen Textbefehl schreiben, haben wir über self.view Zugriff auf die aktuelle Ansicht. Die Methode sel () des View-Objekts gibt ein iterierbares RegionSet der aktuellen Auswahl zurück.  Wir beginnen mit der Suche nach geschweiften Klammern.  Wenn geschweifte Klammern nicht vorhanden sind, können Sie die Auswahl auf die umgebenden Klammern erweitern, um sicherzustellen, dass der gesamte Block vorangestellt ist.  Ob unsere Auswahl geschweifte Klammern enthielt oder nicht, wird auch später nützlich sein, um zu wissen, ob wir das Leerzeichen und die Formatierung des Ergebnisses optimieren können, das wir von der Prefixr-API erhalten.

Dieser Code ersetzt den Inhalt der skeleton run()-Methode.

Wenn wir keine geschweiften Klammern gefunden haben, durchlaufen wir jede Auswahl und passen die Auswahl an die nächste schließende geschweifte Klammer an.  Als nächstes verwenden wir den integrierten Befehl expand_selection mit dem in brackets gesetzten to arg, um sicherzustellen, dass der komplette Inhalt jedes CSS-Blocks ausgewählt ist.

Wenn Sie Ihre bisherige Arbeit noch einmal überprüfen möchten, vergleichen Sie bitte die Quelle mit der Datei Prefixr-1.py in der Quelltext-Zip-Datei.


Schritt 4 - Multithreading

Um zu verhindern, dass eine schlechte Verbindung andere Arbeiten unterbricht, müssen wir sicherstellen, dass die Prefixr-API-Aufrufe im Hintergrund ablaufen.

An dieser Stelle wurden die Auswahlen erweitert, um den vollständigen Inhalt jedes CSS-Blocks zu erfassen.  Jetzt müssen wir sie an die Prefixr-API senden.  Das ist eine einfache HTTP-Anfrage, für die wir die Module urllib und urllib2 verwenden werden.  Bevor wir jedoch damit beginnen, Web-Anfragen abzufeuern, müssen wir darüber nachdenken, wie eine möglicherweise verzögerte Web-Anfrage die Leistung des Editors beeinflussen könnte.  Wenn sich der Benutzer aus irgendeinem Grund in einer Verbindung mit hoher Latenz oder langsamer Geschwindigkeit befindet, können die Anforderungen an die Prefixr-API leicht einige Sekunden oder länger dauern.

Um zu verhindern, dass eine schlechte Verbindung andere Arbeiten unterbricht, müssen wir sicherstellen, dass die Prefixr-API-Aufrufe im Hintergrund ablaufen.  Wenn Sie nichts über Threading wissen, ist eine sehr grundlegende Erklärung, dass Threads eine Möglichkeit für ein Programm sind, mehrere Code-Sätze zu planen, die scheinbar gleichzeitig ausgeführt werden.  In unserem Fall ist es wichtig, da der Code, der Daten sendet und auf eine Antwort von der Prefixr-API wartet, verhindert, dass der Rest der Sublime-Benutzeroberfläche eingefroren wird.


Schritt 5 - Erstellen von Threads

Wir werden das Python-threading-Modul verwenden, um Threads zu erstellen.  Um das Threading-Modul zu verwenden, erstellen wir eine neue Klasse, die threading.Thread namens PrefixrApiCall erweitert.  Klassen, die threading.Thread erweitern, enthalten eine run()-Methode, die den gesamten Code enthält, der im Thread ausgeführt werden soll.

Hier verwenden wir die Thread-Methode __init __(), um alle Werte festzulegen, die während der Webanforderung benötigt werden.  Die Methode run() enthält den Code, der eingerichtet und beendet wird, um die HTTP-Anforderung für die Prefixr-API auszuführen.  Da Threads gleichzeitig mit anderem Code arbeiten, können Werte nicht direkt zurückgegeben werden.  Stattdessen setzen wir self.result auf das Ergebnis des Aufrufs.

Da wir gerade angefangen haben, einige weitere Module in unserem Plugin zu verwenden, müssen wir sie zu den Importanweisungen am Anfang des Skripts hinzufügen.

Jetzt, da wir eine Thread-Klasse zur Ausführung der HTTP-Aufrufe haben, müssen wir für jede Auswahl einen Thread erstellen.  Um dies zu tun, springen wir zurück in die run() Methode unserer PrefixrCommand Klasse und benutzen die folgende Schleife:

Wir verfolgen jeden von uns erstellten Thread und rufen dann die start()-Methode auf, um jeden Thread zu starten.

Wenn Sie Ihre Arbeit bisher noch einmal überprüfen möchten, vergleichen Sie bitte die Quelle mit der Datei Prefixr-2.py in der Quelltext-Zip-Datei.


Schritt 6 - Vorbereitung für die Ergebnisse

Jetzt, da wir die eigentlichen Prefixr-API-Anfragen begonnen haben, müssen wir einige letzte Details einarbeiten, bevor wir die Antworten behandeln.

Zuerst löschen wir alle Selektionen, weil wir sie früher modifiziert haben.  Später werden wir sie in einen vernünftigen Zustand versetzen.

Zusätzlich starten wir ein neues Edit-Objekt.  Dadurch werden Vorgänge zum Rückgängigmachen und Wiederholen gruppiert.  Wir geben an, dass wir eine Gruppe für den prefixr-Befehl erstellen.

Als letzten Schritt rufen wir eine Methode auf, die wir als nächstes schreiben werden und die das Ergebnis der API-Anfragen behandeln wird.


Schritt 7 - Umgang mit Threads

An diesem Punkt laufen unsere Threads oder sind möglicherweise sogar abgeschlossen.  Als nächstes müssen wir die Methode handle_threads() implementieren, auf die wir gerade verwiesen haben.  Diese Methode wird die Liste der Threads durchlaufen und nach Threads suchen, die nicht mehr ausgeführt werden.

Wenn ein Thread noch am Leben ist, fügen wir ihn zur Liste der Threads hinzu, um ihn später erneut zu überprüfen.  Wenn das Ergebnis ein Fehler war, ignorieren wir es, aber für gute Ergebnisse rufen wir eine neue replace()-Methode auf, die wir bald schreiben werden.

Wenn noch Threads vorhanden sind, die noch am Leben sind, müssen wir diese in Kürze erneut überprüfen.  Darüber hinaus ist es eine nette Erweiterung der Benutzeroberfläche, einen Aktivitätsindikator bereitzustellen, um zu zeigen, dass unser Plugin noch läuft.

Der erste Codeabschnitt verwendet einen einfachen ganzzahligen Wert, der in der Variablen i gespeichert ist, um an = zwischen zwei Klammern hin- und herzubewegen.  Der letzte Teil ist jedoch der wichtigste.  Dadurch wird Sublime angewiesen, die Methode handle_threads() in weiteren 100 Millisekunden erneut mit neuen Werten auszuführen.  Das ist genau wie die Funktion setTimeout() in JavaScript.

Das Schlüsselwort lambda ist eine Funktion von Python, mit der wir eine neue unbenannte oder anonyme Funktion erstellen können.

Die Methode sublime.set_timeout() benötigt eine Funktion oder Methode und die Anzahl der Millisekunden, bis sie ausgeführt werden soll.  Ohne lambda könnten wir sagen, wir wollten handle_threads() ausführen, aber wir könnten die Parameter nicht spezifizieren.

Wenn alle Threads abgeschlossen sind, müssen wir kein weiteres Timeout festlegen. Stattdessen beenden wir unsere Undo-Gruppe und aktualisieren die Benutzeroberfläche, damit der Benutzer wissen kann, dass alles erledigt ist.

Wenn Sie Ihre bisherige Arbeit noch einmal überprüfen möchten, vergleichen Sie bitte die Quelle mit der Datei Prefixr-3.py in der Quelltext-Zip-Datei.


Schritt 8 - Durchführen von Ersatz

Nachdem wir unsere Threads bearbeitet haben, müssen wir nur den Code schreiben, der das ursprüngliche CSS durch das Ergebnis der Prefixr-API ersetzt.  Wie bereits erwähnt, schreiben wir eine Methode namens replace().

Diese Methode akzeptiert eine Reihe von Parametern, einschließlich des Edit-Objekts zum Rückgängigmachen, des Threads, der das Ergebnis von der Prefixr-API erfasst hat, wenn die ursprüngliche Auswahl geschweifte Klammern enthielt, und schließlich des Auswahl-Offsets.

Der Offset ist notwendig, wenn Sie mit Mehrfachauswahl arbeiten.  Wenn wir einen CSS-Block durch das vorangestellte CSS ersetzen, wird die Länge dieses Blocks erhöht.  Der Offset stellt sicher, dass wir den richtigen Inhalt für nachfolgende Auswahlen ersetzen, da sich die Textpositionen bei jedem Ersetzen verschieben.

Der nächste Schritt besteht darin, das Ergebnis der Prefixr-API so vorzubereiten, dass es als Ersatz-CSS eingefügt wird.  Das beinhaltet das Konvertieren von Zeilenenden und Einrückungen, um dem aktuellen Dokument und der ursprünglichen Auswahl zu entsprechen.

Als letzten Schritt setzen wir die Auswahl des Benutzers auf das Ende der letzten Zeile des neuen CSS, das wir eingefügt haben, und geben dann den angepassten Offset zurück, der für jede weitere Auswahl verwendet wird.

Wenn Sie Ihre bisherige Arbeit noch einmal überprüfen möchten, vergleichen Sie bitte die Quelle mit der Datei Prefixr-4.py in der Quelltext-Zip-Datei.


Schritt 9 - Whitespace-Manipulation

Wir haben während des Ersetzungsprozesses zwei benutzerdefinierte Methoden verwendet, um das neue CSS für das Dokument vorzubereiten.  Diese Methoden verwenden das Ergebnis von Prefixr und ändern es so, dass es dem aktuellen Dokument entspricht.

normalize_line_endings() übernimmt die Zeichenfolge und stellt sicher, dass sie mit den Zeilenenden der aktuellen Datei übereinstimmt.  Wir verwenden die Settings-Klasse der Sublime-API, um die richtigen Zeilenenden zu erhalten.

Die Methode fix_whitespace() ist ein wenig komplizierter, macht aber die gleiche Art von Manipulation, nur für den Einzug und die Leerzeichen im CSS-Block.  Diese Manipulation funktioniert nur mit einem einzelnen Block von CSS, also beenden wir, wenn eine oder mehrere Klammern in der ursprünglichen Auswahl enthalten waren.

Andernfalls ermitteln wir zunächst die Einzugsebene des ursprünglichen CSS.  Das geschieht durch Suchen nach Leerzeichen am Anfang der Auswahl.

Als Nächstes trimmen wir die Leerzeichen aus dem vorangestellten CSS und verwenden die aktuellen Ansichtseinstellungen, um das zugeschnittene CSS auf die ursprüngliche Ebene zurückzusetzen, indem Sie abhängig von den aktuellen Einstellungen des Editors entweder Tabulatoren oder Leerzeichen verwenden.

Wir beenden die Methode, indem wir den ursprünglichen Anfangs- und nachfolgenden Leerraum verwenden, um sicherzustellen, dass das neue Präfix-CSS genau an die Stelle des Originals passt.

Mit der Methode fix_whitespace() haben wir das Python-Modul für reguläre Ausdrücke (re) verwendet. Daher müssen wir es zur Liste der Importe am Anfang des Skripts hinzufügen.

Und damit haben wir den Vorgang des Schreibens des prefixr-Befehls abgeschlossen. Der nächste Schritt, um den Befehl einfach auszuführen, ist eine Tastenkombination und ein Menüeintrag.


Schritt 10 - Tastenbelegung

Die meisten Einstellungen und Änderungen, die an Sublime vorgenommen werden können, werden über JSON-Dateien ausgeführt.  Das gilt auch für Tastenbelegungen. Tastenbelegungen sind normalerweise betriebssystemspezifisch, was bedeutet, dass drei Tastenbelegungsdateien für Ihr Plugin erstellt werden müssen.  Die Dateien sollten Deafult (Windows).sublime-keymapDeafult (Linux).sublime-keymap und Deafult (OSX).sublime-keymap heißen.

Die .sublime-keymap-Dateien enthalten ein JSON-Array, das JSON-Objekte zur Angabe der Tastenbelegungen enthält. Die JSON-Objekte müssen key und Befehl-key enthalten und können auch einen args-Schlüssel enthalten, wenn der Befehl Argumente erfordert.  Der schwierigste Teil bei der Auswahl einer Schlüsselbindung besteht darin, sicherzustellen, dass die Schlüsselbindung nicht bereits verwendet wird.  Das erreichen Sie, indem Sie im Menü Preferences > Key Bindings - Default nach der gewünschten Tastenbelegung suchen.  Sobald Sie eine geeignete nicht verwendete Bindung gefunden haben, fügen Sie sie Ihren .sublime-keymap-  Dateien hinzu.

Normalerweise sind die Tastenkombinationen für Linux und Windows identisch.  Der Befehl cmd in OS X wird durch den String super in den .sublime-keymap- Dateien angegeben.  Bei der Portierung einer Key-Bindung über Betriebssysteme hinweg ist es üblich, dass der ctrl-Schlüssel auf Windows und Linux für super auf OS X ausgetauscht wird.  Das ist jedoch nicht immer die natürlichste Handbewegung. Versuchen Sie also, falls möglich, Ihre Tastaturbelegungen zu testen auf einer echten Tastatur.


Schritt 11 - Menüeinträge

Eines der kühleren Dinge beim Erweitern von Sublime ist, dass es möglich ist, Elemente zur Menüstruktur hinzuzufügen, indem .sublime-menu- Dateien erstellt werden.  Menüdateien müssen bestimmte Namen haben, um anzugeben, auf welches Menü sie sich auswirken:

  • Main.sublime-menu steuert das Hauptprogrammmenü
  • Side Bar.sublime-menu steuert das Rechtsklickmenü einer Datei oder eines Ordners in der Seitenleiste
  • Context.sublime-menu  steuert das Rechtsklick-Menü einer Datei, die bearbeitet wird

Es gibt eine ganze Reihe von anderen Menü-Dateien, die verschiedene andere Menüs in der Benutzeroberfläche betreffen.  Das Durchsuchen des Deafult-Pakets ist der einfachste Weg, um all dies zu erfahren.

Für Prefixr möchten wir einen Menüeintrag zum Edit-Menü hinzufügen und einige Einträge im Preferences-Menü für Einstellungen.  Das folgende Beispiel zeigt die JSON-Struktur für den Edit-Menü Eintrag. Ich habe die Einträge für das Menü Preferences weggelassen, da sie ziemlich ausführlich sind, wenn sie ein paar Ebenen tief verschachtelt sind.

Das eine Stück, auf das man achten muss, sind die id-Schlüssel.  Durch Angabe der id eines vorhandenen Menüeintrags ist es möglich, einen Eintrag anzuhängen, ohne die bestehende Struktur neu zu definieren.  Wenn Sie die Main.sublime-menu- Datei aus dem Deafult-Paket öffnen und durchsuchen, können Sie bestimmen, welcher id Sie Ihren Eintrag hinzufügen möchten.

An dieser Stelle sollte Ihr Prefixr-Paket fast identisch mit der offiziellen Version auf GitHub aussehen.


Schritt 12 - Verteilen Sie Ihr Paket

Jetzt, da Sie sich die Zeit genommen haben, ein nützliches Sublime-Plugin zu schreiben, ist es an der Zeit, sich in die Hand anderer Benutzer zu begeben.

Sublime unterstützt die Verteilung einer Zip-Datei eines Paketverzeichnisses als einfache Möglichkeit, Pakete zu teilen.  Zip einfach deinen Paketordner und ändere die Erweiterung in .sublime-package.  Andere Benutzer können dies jetzt in ihrem Verzeichnis Installierte Pakete ablegen und Sublime neu starten, um das Paket zu installieren.

Neben der einfachen Verfügbarkeit für viele Benutzer stellt die Verfügbarkeit des Pakets über die Paketsteuerung sicher, dass Benutzer automatisch auf die neuesten Updates aktualisiert werden. 

Während das sicherlich funktionieren kann, gibt es auch einen Package Manager für Sublime namens Package Control, der eine Master-Liste von Paketen und automatische Upgrades unterstützt. Um Ihr Paket zum Standard-Channel hinzuzufügen, hosten Sie es einfach auf GitHub oder BitBucket und geben Sie dann die Channel-Datei (auf GitHub oder BitBucket) aus, fügen Sie Ihr Repository hinzu und senden Sie eine Pull-Anfrage.  Sobald die Pull-Anfrage akzeptiert wurde, wird Ihr Paket für Tausende von Benutzern mit Sublime verfügbar sein.  Neben der einfachen Verfügbarkeit für viele Benutzer stellt die Verfügbarkeit des Pakets über die Paketsteuerung sicher, dass Benutzer automatisch auf die neuesten Updates aktualisiert werden.

Wenn Sie nicht auf GitHub oder BitBucket hosten möchten, gibt es ein benutzerdefiniertes JSON-Channel/Repository-System, mit dem Sie überall hosten können, während Sie das Paket allen Benutzern zur Verfügung stellen. Es bietet auch erweiterte Funktionen wie die Angabe der Verfügbarkeit von Paketen nach Betriebssystem.  Weitere Informationen finden Sie auf der Seite PackageControl.


Schreiben Sie ein paar Plugins!

Jetzt, wo wir die Schritte zum Schreiben eines Sublime-Plugins besprochen haben, ist es Zeit für dich zu tauchen!  Die Sublime-Plugin-Community erstellt und veröffentlicht fast täglich neue Funktionen.  Mit jeder Veröffentlichung wird Sublime immer leistungsfähiger und vielseitiger.  Das Sublime Text Forum ist ein großartiger Ort, um Hilfe zu erhalten und mit anderen darüber zu sprechen, was Sie bauen.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.