2014-04-17 15 views
10

Wie kann ich meine Klasse als einen normalen primitiven Typ wie der Int oder Doppel markiert werden?Sublime Text - C++ Hervorhebung

Siehe exemple:

enter image description here

Ich möchte, dass, wenn ich die Test aloha;-Test erklären, dass int a der gleichen Art und Weise hervorgehoben werden.

+0

Können Sie das in Sublime Text? Wenn Sie könnten, würde ich jede IDE auf meinem Computer deinstallieren ... –

Antwort

13

Die Syntaxhervorhebung wird von der tmLanguage-Datei gesteuert. In ST3 werden diese in Cachedateien gespeichert.

Folgen Sie diesen Schritten.

  • öffnen Tools -> Befehl Paletten- und mit Package Manager installieren PackageResourceViewer
  • in der Befehlspalette wählen PackageResourceViewer: Open Resource
  • Im vorliegenden Panel wählen C++
  • Im vorliegenden Panel wählen C++.tmLanguage

Jetzt haben Sie die Sprachdefinitionsdatei für Sie angezeigt.

Schauen Sie sich an, wie die Teile einer Sprache definiert sind. Wenn wir für class finden wir die folgenden als eines der Matches zu suchen:

<dict> 
    <key>match</key> 
    <string>\b(class|struct)\s+([_A-Za-z][_A-Za-z0-9]*\b);</string> 
    <key>name</key> 
    <string>meta.class-struct-block.c++</string> 
    <key>captures</key> 
    <dict> 
     . . . 
    . . . 
</dict> 

wählte ich, dass man, weil es einige regelmäßige express (regex) Anpassung beinhaltet und das ist der Hinweis zu tun, was Sie tun möchten.

Da ST einen schönen offenen Rahmen hat, kann jeder von uns, der ein bisschen programmieren kann, unsere eigenen Sprachkomponentendefinitionen zu diesen .tmLanguage Dateien hinzufügen. Diese Flexibilität ist einer der Gründe, warum ST meine Wahl ist.

Also mal sehen, wie das geht.

Als erstes speichern wir die C++.tmLanguage Datei, die wir im Editor geöffnet haben, in unseren User Ordner.

Wir tun dies sowohl das Original als Zurückkehren zu halten, wenn die Dinge schief gehen und, weil es bedeutet, dass unsere Version in User wird nicht jedes Mal, ST-Updates überschrieben werden. Die Art und Weise, wie ST Dateien lädt, bedeutet, dass Duplikate im Ordner User die Werte im Standardspeicherort überschreiben, so dass unsere User Versionen Vorrang haben, wenn ST verwendet wird. Cool hey?

So jetzt haben wir unsere eigene Version der Datei C++.tmLanguage lass uns damit spielen.

Finden Sie eine Definition, die ein bisschen wie das, was wir tun wollen, aussieht und es dupliziert.

Ich werde diese kopieren:

<dict> 
    <key>match</key> 
    <string>\b(class|wchar_t|nullptr_t)\b</string> 
    <key>name</key> 
    <string>storage.type.c++</string> 
</dict> 

Das erste, was ich zu tun ist, werde entscheiden, was ich meine neue Sprachkomponente nennen werde.

Ich könnte es einfach den Namen einer vorhandenen Sprachkomponente geben, die die Farbe hat, die ich haben möchte. Dies hat den Vorteil, dass, wenn dieser Name bereits in den vorhandenen Farbschemas vorhanden ist, ich die Hervorhebung kostenlos erhalten werde. Fühlen Sie sich frei, diese Wahl zu treffen.

Aber um mehr von dem System zu erforschen, werde ich meinen eigenen Namen erfinden und es für mich erfassen. Also werde ich es duncan.name.class nennen. Sie können einen beliebigen Namen verwenden, der nicht mit einem vorhandenen Namen kollidiert.

Also werde ich diesen Wandel herbeizuführen in der duplizieren:

<dict> 
    <key>match</key> 
    <string>\b(class|wchar_t|nullptr_t)\b</string> 
    <key>name</key> 
    <string>duncan.name.class</string> 
</dict> 

Jetzt muss ich die Regex schreiben, um meine neue Sprachkomponente zu identifizieren. Dies ist ziemlich einfach, da ich davon ausgehe, dass wir alle die ziemlich übliche Praxis verfolgen, unsere Klassen mit führenden Caps zu benennen und nicht für andere Sprachkomponenten zu verwenden, so dass meine Regex nur eine Zeichenfolge finden muss, die mit einem GROßEN Alpha beginnt ist einfach definiert als [A-Z] gefolgt von einem beliebigen alphanumerischen Zeichen/s. Beachten Sie, dass dies Interpunktionszeichen ausschließt (wie Unterstrich _). Wenn Sie diese in Ihren Klassennamen verwenden, müssen Sie die Regex um diese Zeichen erweitern.

Also lassen Sie uns das Spiel Zustand ändern, dass die Regex zu verwenden:

<dict> 
    <key>match</key> 
    <string>\b([A-Z][a-zA-Z0-9]+)\b</string>   
    <key>name</key> 
    <string>duncan.name.class</string> 
</dict> 

Jetzt habe ich eine neue Sprache Komponente Ich brauche mein Thema zu sagen, wie es zu handhaben. Ich werde an dem Thema Amy für dieses Beispiel arbeiten.

Also zurück zum immer hilfreich PackageResourceViewer wie folgt aus:

  • in dem Befehl Pallet PackageResourceViewer: Open Resource wählen
  • Im vorliegenden Panel wählen Color Scheme - Default
  • Im vorliegenden Panel wählt Amy.tmTheme

Jetzt haben Sie die Themendatei für Sie angezeigt.

Wieder möchte ich meine Kopie in den Ordner User speichern und dann ein vorhandenes Beispiel duplizieren. Ich werde String duplizieren, aber alles, was Ihnen gefällt, ist in Ordnung.

<dict> 
    <key>name</key> 
    <string>String</string> 
    <key>scope</key> 
    <string>string</string> 
    <key>settings</key> 
    <dict> 
     <key>foreground</key> 
     <string>#999999</string> 
    </dict> 
</dict> 

Jetzt werde ich die von String duplizieren ändern Färbung für meine neue Sprachkomponente zu tun.

<dict> 
    <key>name</key> 
    <string>Class Names :: Duncan</string> 
    <key>scope</key> 
    <string>duncan.name.class</string> 
    <key>settings</key> 
    <dict> 
     <key>foreground</key> 
     <string>#999999</string> 
     <key>background</key> 
     <string>#FFFFFF</string> 
     <key>fontStyle</key> 
     <string>bold</string> 
    </dict> 
</dict> 

Ich hoffe, Sie erkennen die Namen, die ich aus der Arbeit, die wir oben getan haben, verwenden?

Ich habe einen leicht verrückten Satz von Syntaxhervorhebungseinstellungen ausgewählt, nur um einige der verfügbaren Optionen anzuzeigen.Mach dich hier mit Ideen zu schaffen.

Macht das alles Sinn?

Mit diesen Ideen können Sie alle Syntaxhervorhebungsniggles beheben, die Sie in ST3 haben, um genau so zu arbeiten, wie Sie möchten. Vielleicht ist meine Regex oben nicht zu groß? Ich habe nicht viel darüber nachgedacht, also wirst du feststellen, dass du mehr Arbeit machen musst, um genau das zu bekommen, was du willst.

Lassen Sie mich wissen, wenn einige davon keinen Sinn machen und ich werde versuchen, es besser zu machen.

+0

Awesome! Sehr hilfreich. – user3286105

+0

@jwpfox. Danke für das detaillierte und lehrreiche Tutorial. Leider kann ich die C++. TmLanguage-Datei nicht finden, wenn Sie Ihre obigen Anweisungen befolgen. Hat ST3 die Einstellungen für die Syntaxhervorhebung in eine andere Datei verschoben? – herteladrian

+0

Es gibt jetzt ein neues Dateiformat siehe https://www.slimetext.com/docs/3/syntax.html – jwpfox

4

Ich würde auch empfehlen, das Paket Scope Hunter zu installieren und dann Toggle Instant Scoper über Ctrl+Shift+P zu aktivieren. Dies zeigt Ihnen den Umfang des Elements unter dem Cursor.

Mit diesem können Sie sehen, wie ST die Datei analysiert hat, und den Namen jedes Bereichs in einer Motivdefinition verwenden, um Elemente mit unterschiedlichem Bereich unterschiedlich zu färben.

+1

So viel einfacher, schnell zu verstehen, was vor sich geht und das Parsing jetzt erforschen. Ich habe gerade festgestellt, dass das Standard-Parsing von C++ in Sublime Text 3 viel weniger Bereiche hat, als ich mir ursprünglich vorgestellt habe. Alternativ können Sie mit Strg + Alt + Umschalt + P die Bereiche in der Statusleiste anzeigen, ohne Pakete zu installieren. – arthropod