2012-09-21 9 views
14

Deseo escribir un archivo de definición de sintaxis para Texto Sublime 2 para Buscar resultados que respete las extensiones de archivo para cada lugar donde encuentre el término buscado. La documentación menciona que "Syntax definitions from separate files can be combined" pero no menciona cómo.Combinación de definiciones de sintaxis en SublimeText2

¿Alguien tiene algún ejemplo de cómo funciona? Una respuesta a esta pregunta: Sublime Text 2: Setting file syntax inside the file itself (as Vim modelines) también funcionaría.

EDITAR

Ok, así inclinar uno de un amigo: http://manual.macromates.com/en/language_grammars

que utiliza la etiqueta 'incluir' con un nombre para hacer referencia a otro idioma. Eso funcionaría para mí, pero desafortunadamente necesitaría escribir un complemento para volver a compilar el archivo cada vez que se abriera Sublime Text y volver a escribirlo con las diferentes extensiones de lenguaje ... ¿Alguna posibilidad de que tengan una mejor idea?

+0

Esta no es una definición de sintaxis, pero podría ser de ayuda: [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

No es exactamente lo que estaba buscando ... Estoy contento con los resultados de "Buscar resultados" ... eh. ' Esperaba tener una sintaxis mejor, resaltando – Crisfole

+0

Estoy buscando algo similar, y encontré este http://blog.macromates.com/2012/injection-grammars-project-variables/. Sin embargo, la entrada no es muy clara para mí. Todavía estoy digiriendo. Incluso se encontró con esto (https://groups.google.com/forum/?fromgroups=#!msg/textmate/cEXeWHjEXNk/EWqV5L2CWQAJ), pero de nuevo, sigue siendo bastante vago. – sntran

Respuesta

21

Recientemente, truqué obsesivamente mi ST2 CSS resaltado de sintaxis. Mi comprensión de estos * .tmLanguage archivos se basa en prueba y error, principalmente error. Menciono esto para notar que mi agarre es manchado, en el mejor de los casos.

Creo que el archivo que desea modificar es ~/Library/Application Support/Sublime Text 2/Packages/Default/Find Results.hidden-tmLanguage

Para resumir, creo que se desee configurarlo para que de esta manera lo esencial (que tiene liberal comentar):

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

Un Búsqueda típico de archivos resultados se verá algo como esto:

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 

El análisis sintáctico Find Results.hidden-tmLanguage º e resultados en 3 partes relevantes:

  • la línea con el nombre de archivo
  • Una línea Extraído sin un partido
  • Una línea extraído con un partido

Las reglas para esto están en el <patterns> sección:

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

Estas solo pasan por el archivo, línea por línea, y miran f o un partido. Si se encuentra una coincidencia, una o más definiciones <key>name</key> se aplican a los grupos de captura de la coincidencia, si los hay. Estas definiciones name se referencian en el archivo de definición de tema (por ejemplo, Monokai) y el color se aplica a los caracteres que coinciden con el grupo de captura nombrado.

Los patrones anteriores son solo coincidencias con grupos de captura. Creo que una limitación de esto es que la coincidencia (o la captura de grupos) no se puede seguir procesando.

Lo que se aplica en lo esencial son los patrones del 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> 

Lo más importante en este tipo de modelo es que tiene un <begin> y un <end>, a continuación, que tiene su propia sección <pattern>.Cuando la expresión regular <begin> se corresponde, el contenido de <patterns> se aplica hasta que (aquí es donde me pongo muy irregular) se encuentra un token no coincidente, en cuyo punto se prueba <end>. Creo.

En cualquier caso, la esencia define varios de estos bloques de patrones de inicio y fin, uno para cada uno de los tipos y sintaxis de archivos XML, HTML, JavaScript y CSS. La expresión regular <being> coincide con la línea con el nombre de archivo y una determinada extensión de archivo. Esto se usa para crear el inicio del "contexto" para una sintaxis dada. El contexto finaliza cuando los elementos en el siguiente bloque <patterns> dejan de coincidir y coincide el <end> regex. Creo que, básicamente, sólo quieren dar cuerpo esto para cualquier sintaxis que desea resaltar en los resultados de encontrar ...

Aquí está una captura de pantalla de los resultados de sintaxis resaltado encontrar que estoy recibiendo el uso que el GIST:

Blingwear

Debo señalar, un gran problema que encontré es cuando un comentario de bloque comienza en un extracto, pero el extracto no incluye los caracteres que terminan el comentario de bloque. El comentario de bloque simplemente continúa hasta que el token de terminación se encuentra en otro lugar en los resultados de búsqueda. Esto se extiende a búsquedas posteriores, también.

Actualización:

que quería añadir que no debería ser necesario volver a compilar nada en el arranque. Aunque, vale la pena mencionar que debe reiniciar sublime para que los cambios en Find Results.hidden-tmLanguage surtan efecto. Si hace de esto un complemento de algún tipo, parece que los cambios consistirían principalmente en agregar nuevos idiomas, lo que podría ser una actualización de complemento poco frecuente.

+0

¡Guau, qué camino tomar! – Crisfole

+0

¡Bienvenido al mundo 'por encima de 1000 rep'! – Crisfole

+0

@ChristopherPfohl ¡Gracias! Sí, estoy muy feliz. Y, si encuentra una forma de resolver el problema con los comentarios bloqueados, publique una actualización. – tiffon