2012-09-21 12 views
14

Desidero scrivere un file di definizione della sintassi per Sublime Text 2 per i risultati di ricerca che rispetti le estensioni di file per ogni posizione in cui trova il termine cercato. La documentazione menziona che "Syntax definitions from separate files can be combined" ma non menziona come.Combinazione di definizioni di sintassi in SublimeText2

Qualcuno ha qualche esempio di come funziona? Una risposta a questa domanda: Sublime Text 2: Setting file syntax inside the file itself (as Vim modelines) funzionerebbe anche.

EDIT

Ok, quindi punta uno da un amico: http://manual.macromates.com/en/language_grammars

che utilizza il tag 'include' con un nome di riferimento un'altra lingua. Questo funzionerebbe per me, ma sfortunatamente avrei bisogno di scrivere un plugin per ricompilare il file ogni volta che Sublime Text apriva e riscrivilo con le varie estensioni del linguaggio ... Ogni volta hai una migliore idea?

+0

Questa non è una definizione di sintassi, ma potrebbe aiutare: [http://css-tricks.com/exclude-compiled-css-from-sublime-text-2-projects/](http://css -tricks.com/exclude-compiled-css-from-sublime-text-2-projects/) – runningRhetoric

+0

Non proprio quello che stavo cercando ... Sono contento del "Trova risultati" ... uh, 'risultati. ' Speravo di evidenziare meglio la sintassi – Crisfole

+0

Sto cercando qualcosa di simile e ho trovato questo http://blog.macromates.com/2012/injection-grammars-project-variables/. Tuttavia, la voce non è molto chiara per me. Sto ancora digerendo Anche questo (https://groups.google.com/forum/?fromgroups=#!msg/textmate/cEXeWHjEXNk/EWqV5L2CWQAJ), ma ancora, ancora piuttosto vago. – sntran

risposta

21

Recentemente, ho ossessivamente ingannato l'evidenziazione della sintassi CSS ST2. La mia comprensione di questi file * .tmLanguage si basa su tentativi ed errori - principalmente errori. Dico questo per notare che la mia comprensione è spotty, al massimo.

Penso che il file che si desidera modificare è ~/Library/Application Support/Sublime Text 2/Packages/Default/Find Results.hidden-tmLanguage

Per farla breve, credo che si desidera impostarla come questo Gist (che ha liberale commentando):

https://gist.github.com/4333623#file-find-results-hidden-tmlanguage

A tipico Trova nei file risultati sarà simile a questo:

Searching 11 files for "feedback-assistance-form" (regex) 

/_projects/___/group_reg.js: 
    60  }); 
    61 
    62:  $asstForm = $help.find('#feedback-assistance-form'); 
    63 
    64  if (!$asstForm.length) { 
    65:   console.log('WARN: Feedback assistance: #feedback-assistance-form not found'); 
    66   return; 
    67  } 

/_projects/___/group_register_help_tmpl.html: 
    6 <div id="group-reg-help"> 
    7 
    8: <form id="feedback-assistance-form" class="js-popover help-content hide" action="{% url info.views.assistance_request %}" method="post"> 
    9  
    10  <legend>Need Assistance?</legend> 

3 matches across 2 files 

Il Find Results.hidden-tmLanguage analizza ° e risultati in 3 parti rilevanti:

  • La linea con il nome
  • Una linea Tratto senza una partita
  • Una linea estratto con una corrispondenza

Le regole di questo sono in <patterns> sezione:

<key>patterns</key> 
<array> 
    <dict> 
     <key>match</key> 
     <string>^([^ ].*):$</string> 
     <key>captures</key> 
     <dict> 
      <key>1</key> 
      <dict> 
       <key>name</key> 
       <string>entity.name.filename.find-in-files</string> 
      </dict> 
     </dict> 
    </dict> 
    <dict> 
     <key>match</key> 
     <string>^ +([0-9]+) </string> 
     <key>captures</key> 
     <dict> 
      <key>1</key> 
      <dict> 
       <key>name</key> 
       <string>constant.numeric.line-number.find-in-files</string> 
      </dict> 
     </dict> 
    </dict> 
    <dict> 
     <key>match</key> 
     <string>^ +([0-9]+):</string> 
     <key>captures</key> 
     <dict> 
      <key>1</key> <!-- capture group 1 --> 
      <dict> 
       <key>name</key> <!-- name it so it can be colored --> 
       <string>constant.numeric.line-number.match.find-in-files</string> 
      </dict> 
     </dict> 
    </dict> 
</array> 

Questi semplicemente passano attraverso il file, riga per riga e guardano f o una partita. Se viene trovata una corrispondenza, una o più definizioni <key>name</key> vengono applicate ai gruppi di cattura della partita, se ce ne sono. Queste definizioni name fanno riferimento al file di definizione del tema (ad esempio, Monokai) e il colore viene applicato ai caratteri corrispondenti al gruppo di acquisizione denominato.

I modelli sopra sono solo abbinamenti con gruppi di cattura. Penso che una limitazione di ciò sia la corrispondenza (o gruppi di acquisizione) non possa essere ulteriormente elaborata.

Che cosa è applicata nella sostanza sono modelli di formato:

<key>patterns</key> 
<array> 
    <dict> 
     <key>begin</key> 

<!-- add the filetype extensions, here --> 
<!-- these are XML formatted files: --> 

     <string>^([^ ].*\.(?:xml|tmLanguage|hidden-tmLanguage|tmTheme):)$</string> 
     <key>beginCaptures</key> 
     <dict> 
      <key>1</key> 
      <dict> 
       <key>name</key> 
       <string>entity.name.filename.find-in-files</string> 
      </dict> 
     </dict> 
     <key>end</key> 
     <string>^[^ ]</string> 
     <key>patterns</key> 
     <array> 
      <dict> 
       <key>include</key> 
       <string>#line-numbers</string> 
      </dict> 
      <dict> 
       <key>include</key> 


<!-- which syntax should match up to the filetype extensions listed above: --> 
<!-- to find out what the "scopeName" is, refer to the corresponding *.tmLanguage file --> 
<!-- for XML, this is ~/Library/Application Support/Sublime Text 2/Packages/XML/XSL.tmLanguage --> 

       <string>text.xml</string> 
      </dict> 
     </array> 
    </dict> 
    <!-- ... can have many more --> 
</array> 

La cosa principale con questo tipo di modello è che ha un <begin> ed un <end>, allora ha il proprio sezione <pattern>.Quando l'espressione regolare <begin> corrisponde, i contenuti di <patterns> vengono applicati fino a quando non si incontra (questo è il punto in cui ottengo un punto) un token non corrispondente, a questo punto viene testato il valore <end>. Credo.

In ogni caso, il gist definisce molti di questi blocchi di inizio-fine-pattern, uno per ogni tipo di XML, HTML, JavaScript e tipi di file CSS e sintassi. L'espressione regolare <being> corrisponde alla riga con il nome file e una particolare estensione di file. Questo è usato per creare l'inizio del "contesto" per una determinata sintassi. Il contesto termina quando gli elementi nel successivo blocco <patterns> terminano la corrispondenza e le espressioni regolari <end> corrispondono. Penso che in fondo vuole solo carne questo fuori per qualsiasi sintassi che si desidera evidenziare nei risultati find ...

Ecco uno screenshot dei risultati di sintassi evidenziata trovare sto ottenendo utilizzando tale sostanza:

Blingwear

Devo notare, un grosso problema che ho riscontrato è quando un blocco-commento inizia in un estratto ma l'estratto non include i caratteri che terminano il commento-blocco. Il commento di blocco continua finché il token di chiusura non viene rilevato da qualche altra parte nei risultati di ricerca. Questo si estende anche alle ricerche successive.

Aggiornamento:

volevo aggiungere che non dovrebbe essere necessario ricompilare nulla all'avvio. Anche se, vale la pena ricordare che è necessario riavviare sublime affinché le modifiche in Find Results.hidden-tmLanguage diventino effettive. Se rendi questo un plugin di qualche tipo, sembra che le modifiche consistano principalmente nell'aggiunta di nuove lingue, che potrebbero essere solo un aggiornamento di plugin non frequente.

+0

Wow, strada da percorrere! – Crisfole

+0

Benvenuto anche nel mondo "above 1000 rep"! – Crisfole

+0

@ChristopherPfohl Grazie! Sì, sono piuttosto entusiasta. E, se trovi un modo per aggirare il problema con i commenti del blocco, per favore pubblica un aggiornamento. – tiffon