2014-04-17 9 views
10

Come posso rendere la mia classe essere evidenziata come un normale tipo primitivo come l'int o il doppio?Sublime Text - C++ Highlight

Consulta l'exemple:

enter image description here

voglio che quando mi dichiaro il Test aloha; prova evidenziata dello stesso modo che int a.

+0

Puoi farlo in Sublime Text? Se potessi, disinstallerei ogni IDE sul mio computer ... –

risposta

13

L'evidenziazione della sintassi è controllata dal file tmLanguage. In ST3 questi sono contenuti nei file .cache.

Quindi, attenersi alla seguente procedura.

  • Aperte Strumenti -> Comando di pallets e utilizzando Package Manager installare PackageResourceViewer
  • Nel Pallet comando SELECT PackageResourceViewer: Open Resource
  • Nel pannello presentato scegliere C++
  • Nel pannello presentato scegliere C++.tmLanguage

Ora hai il file di definizione della lingua visualizzato per te.

Dai un'occhiata alla forma di come sono definite le parti di una lingua. Se cerchiamo class troviamo quanto segue come una delle partite:

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

ho scelto che uno perché si tratta di un po 'di expresssion corrispondenza regolare (regex) e questo è il suggerimento di fare ciò che si vuole fare.

Poiché la ST ha una struttura aperta e piacevole, chiunque conosca un po 'di programmazione può aggiungere le proprie definizioni di componente linguistico a questi file .tmLanguage. Questa flessibilità è parte del motivo per cui ST è la mia scelta.

Quindi vediamo come farlo.

La prima cosa è salvare il file C++.tmLanguage che abbiamo aperto nell'editor nella nostra cartella User.

Lo facciamo sia per mantenere l'originale come un rollback se le cose vanno male e perché significa che la nostra versione in User sarà non ottenere sovrascritto ogni volta che gli aggiornamenti ST. Il modo in cui ST carica i file significa che i duplicati nella cartella User sovrascrivono i valori nella posizione predefinita in modo che le nostre versioni User abbiano la precedenza su ciò che è in esecuzione quando utilizziamo ST. Ehi ehi?

Così ora abbiamo la nostra versione del file C++.tmLanguage giochiamo con esso.

Trova una definizione che assomigli un po 'a quello che vogliamo fare e duplicala.

ho intenzione di copiare questo:

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

La prima cosa che ho intenzione di fare è decidere quello che sto per citare il mio nuovo componente lingua.

Potrei semplicemente dargli il nome di un componente linguistico esistente che ha la colorazione che voglio avere. Questo ha il vantaggio che se quel nome è già presente negli schemi di colori esistenti otterrò l'evidenziazione gratuitamente. Sentiti libero di fare questa scelta.

Ma per esplorare più del sistema, ho intenzione di inventare il mio nome e portarlo a me stesso. Quindi lo chiamerò duncan.name.class. Puoi usare qualsiasi nome che ti piace che non sia in conflitto con un nome esistente.

Così farò che il cambiamento nella duplicare:

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

Ora ho bisogno di scrivere l'espressione regolare per identificare il mio nuovo componente lingua. Questo è abbastanza facile dal momento che assumerò che stiamo seguendo la pratica abbastanza comune di nominare le nostre classi con i Caps principali e di non utilizzarli per altri componenti linguistici, quindi la mia regex ha solo bisogno di trovare qualsiasi stringa che inizi con una ALFA UPPERCASE, che è facilmente definito come [A-Z] seguito da qualsiasi carattere alfanumerico/s. Si noti che questo preclude la punteggiatura (come il carattere di sottolineatura _), quindi se si utilizzano quelli nei nomi delle classi sarà necessario espandere la regex per includere tali caratteri.

Quindi cerchiamo di cambiare la condizione partita di utilizzare tale espressione regolare:

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

ora ho un nuovo componente di lingua ho bisogno di dirvi il mio tema come gestirlo. Sto andando a lavorare sul tema Amy per questo esempio.

Ma torniamo al sempre disponibile PackageResourceViewer come questo:

  • Nel Pallet comando SELECT PackageResourceViewer: Open Resource
  • Nel pannello presentato scegliere Color Scheme - Default
  • Nel pannello presentato scelgono Amy.tmTheme

Ora hai il file del tema visualizzato per te.

Ancora una volta voglio salvare la mia copia nella cartella User e quindi duplicare un esempio esistente. Ho intenzione di duplicare String ma tutto ciò che afferra la tua fantasia va bene.

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

Ora cambierò il duplicato di String a fare da colorare per il mio nuovo componente lingua.

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

Spero che tu riconosca i nomi che sto utilizzando dal lavoro svolto in precedenza?

Ho scelto un set leggermente pazzo di preferenze di evidenziazione della sintassi solo per mostrare alcune delle opzioni disponibili.Rilassati giocando con le idee qui.

Tutto ciò ha senso?

Con queste idee è possibile correggere qualsiasi problema di evidenziazione della sintassi che si ha in ST3 affinché funzioni esattamente come desiderato. Forse la mia regex di sopra non è troppo grande? Non ci ho pensato molto, quindi potresti scoprire che devi lavorare di più per ottenere quello che vuoi.

Fammi sapere se un po 'di questo non ha senso e cercherò di fare meglio.

+0

Fantastico! Molto utile. – user3286105

+0

@jwpfox. Grazie per il tutorial dettagliato ed educativo. Sfortunatamente, non riesco a trovare il file C++ .tmLanguage quando segui le tue istruzioni sopra. ST3 ha spostato le impostazioni di evidenziazione della sintassi in un file diverso? – herteladrian

+0

Ora c'è un nuovo formato di file, vedere https://www.sublimetext.com/docs/3/syntax.html – jwpfox

4

Vorrei anche suggerire di installare il pacchetto Scope Hunter e quindi abilitare Toggle Instant Scoper tramite Ctrl+Shift+P. Questo ti mostrerà l'ambito dell'elemento sotto il cursore.

Con questo è possibile vedere come ST ha analizzato il file e utilizzare il nome di ciascun ambito in una definizione di tema per colorare gli elementi di diverso ambito in modo diverso.

+1

Molto più facile capire rapidamente cosa sta succedendo ed esplorare l'analisi ora. Ho appena realizzato che il parsing predefinito di C++ in Sublime Text 3 ha un minor numero di ambiti rispetto a quanto inizialmente immaginato. Alternativamente 'Ctrl + Alt + Shift + P' mostrerà gli ambiti nella barra di stato senza installare pacchetti. – arthropod