Mode Central

Das SubEthaEdit Modus Format

Allgemeines

SubEthaEdit's Modus Dateien sind Bundles, wie z.B. Keynote Präsentationen oder Rich Text mit Bildern (rtfd). Dies ermöglicht es eigene Bilder, eine Lizenz und andere Dateien in einem Modus zu speichern. Außerdem wird so die Erweiterbarkeit für Updates ermöglicht. Um die Inhalte eines Modus anzuzeigen, ctrl-klicken Sie auf den Modus und wählen Sie "Paketinhalte anzeigen".

Laden Sie sich das SubEthaEdit Modus Entwickler-Kit hier herunter. (Enthält auch Beispielbilder für Symbole.)

Wenn Sie z.B. mit einen regulären Ausdruck Probleme haben, lassen Sie sich doch von den mitgelieferten Modi inspirieren. Am einfachsten erreichen Sie diese wenn Sie die Alt-Taste gedrückt halten und das Menü "Modus → Im Finder Zeigen" aktivieren. Um einen mitgelieferten Modus nach ~/Library/Application Support/SubEthaEdit/Modes zu kopieren um ihn anzupassen, gehen Sie am einfachsten wie folgt vor:

  • Halten Sie die Alt-Taste gedrückt und aktiveren sie das Menü "Modus → Im Finder Zeigen → Modus-Ordner von SubEthaEdit öffnen"
  • Doppelklicken Sie den Modus den Sie anpassen wollen
  • Wählen Sie "Nur für diesen Benutzer installieren"
  • Halten Sie die Alt-Taste gedrückt während Sie das Menü "Modus → Im Finder Zeigen" aktivieren und klicken Sie auf den soeben installierten Modus.

Skripte

Modi können auch Skripte in ihrem Resources/Scripts Verzeichnis enthalten. Diese können Funktionalitäten samt Symbol in der Symbolleiste und Menüpunkte in SubEthaEdit ergänzen. Für detaillierte Information konsultieren Sie bitte unsere AppleScript Seite.

Struktur

Dies ist die Struktur eines SubEthaEdit Mode Bundle:

Fangen Sie am besten damit an den Namen des Modus und das Copyright in Info.plist und InfoPlist.strings zu ändern. Im Zweifelsfall einfach "Template" mit dem Modus-Namen und "Author" mit Ihrem Namen ersetzen.

Mode Einstellungen

In ModeSettings.xml werden Dateierweiterungen, Dateinamen und Inhalte spezifiziert für die sich der Modus zuständig fühlen sollte. Inhalte werden dabei über einen regulären Ausdruck definiert, der mit den ersten 4MB der Datei abgeglichen wird.

<?xml version="1.0" encoding="UTF-8"?>
<settings>
  <template>mytemplate.txt</template>   <!-- Eine Vorlage für Ablage->Neu -->
  <recognition>
    <extension>txt</extension>                   <!-- Dateierweiterungen -->
    <extension casesensitive="yes">C</extension> <!-- Dateierweiterungen die Groß-/Kleinschreibung berücksichtigen -->
    <filename>Makefile</filename>                <!-- Dateinamen -->
    <regex>\A#!/usr/bin/(env )?perl</regex>      <!-- Regex des Inhaltes -->
  </recognition>
</settings>

Syntax Definitionen

Syntax Definitionen sind XML Dateien mit folgender Struktur. Bitte sehen Sie sich die Kommentare zur Erklärung der einzelen Tags an.

<?xml version="1.0" encoding="UTF-8"?>
<syntax>


    <!--
    The <head> tag encloses some global information about the mode.
    This tag is required.
    -->
   

    <head>

        <!--
        The <name> specifies the modes name.
        This tag is required and must match with the name in the plist after the SEEMode..
        -->
   

        <name>Example Syntax</name>

        <!-- optional to add spelling-dicitionary autocomplete words -->
        <autocompleteoptions use-spelling-dictionary="yes" />

        <!-- optional to define the folding level for ctrl-command-up (default is 1) -->
        <folding toplevel="2" />

        <!--
        The <charsintokens> and the <charsdelimitingtokens> instruct the syntax highlighter
        where to tokenize the text for fast finding of plain strings.
        The <charsintokens> tag specifies the characters that can occur in strings,
        the <charsdelimitingtokens> tag specifies the tags that cannot occur in strings.
        One of these tags has to be specified.
        Tip: Use CDATA here.
        -->
   

        <charsintokens><![CDATA[_0987654321abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@]]></charsintokens>
        <!-- <charsdelimitingtokens><![CDATA[ -]]></charsdelimitingtokens> -->
        
        
        <!--
          the <charsincompletion> defines characters used for autocompletion. e.g. in perl
          you want this to include the $ sign to autocomplete variables.
          If left out the regular expression word boundaries are used.
        -->

        <!-- <charsincompletion><![CDATA[_0987654321abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-@$</=>!]]></charsincompletion> -->
    </head>


    <!--
    The <states> tag encloses all syntax states.
    States are areas of the test that begin and end with an regex like comments or strings,
    with exception of the default state, that exists anywhere where no other state exists.
    This tag is required.
    -->
   

    <states>
    
        <!--
        The <default> tag specifies what is colored within the default state (see above).
        It features the following attributes, all optional if not noted otherwise:
            id
                Has to be a unique string. Has to be specified.
            color
                a html comptible color in three or six letter hexadecimal format.
                Used for text on bright document background colors.
            inverted-color
                a html comptible color in three or six letter hexadecimal format.
                Used for text if a dark document background color is set.
            font-weight
                normal  Normal font-weight (default)
                bold    Bold text in popup
            font-style
                normal  Normal font-weight (default)
                italic  Bold text in popup
            usesymbolsfrommode
                a mode name to use the symbol recognition from
                when left out the value is inherited from the parent state
            useautocompletefrommode
                a mode name to use the autocomplete from - default is this mode
                when left out the value is inherited from the parent state
            type
                a string description of the type. currently only the values
                "string" and "comment" have meaning and cause bracket matching
                and syntax highlighting to ignore these areas of text
                
                and code folding has special handling for comments
                
            foldable
                yes makes this state foldable
                no means this state does not fold (default)
        -->
   
    
        <default id="Base" color="#000" inverted-color="#fff">

            <!--
            The <keywords> tag specifies keyword groups within the current state.
            It features the following attributes, all optional if not noted otherwise:
                id
                    Has to be a unique string. Has to be specified.
                color
                    a html comptible color in three or six letter hexadecimal format.
                    Used for text on bright document background colors.
                inverted-color
                    a html comptible color in three or six letter hexadecimal format.
                    Used for text if a dark document background color is set.
                font-weight
                    normal  Normal font-weight (default)
                    bold    Bold text in popup
                font-style
                    normal  Normal font-weight (default)
                    italic  Bold text in popup
                casesensitive
                    yes     This group is case sensitive (default)
                    no      Ignore case for the group
                useforautocomplete
                    yes     Add this group's strings to the autocomplete dictionary (default)
                    no      Don't add to autocomplete dictionary
            -->
   

            <keywords id="Keywords" color="#6C0540" casesensitive="no" useforautocomplete="yes">
            
                <!--
                    <string> tags specify plain text to be colored. If your tag does not
                    get colored, check in <charsintokens> if you are tokenizing correctly.             
                -->
   
            
        <string>colorme</string>
        <string>andmetoo</string>

                <!--
                    <regex> tags specify regular expression to be colored.
                    Only the first group will be colored, so enclose the part to color
                    with parens.
                    
                    The example colors digits prefixed by foo. (only the digits)             
                -->
   

        <regex>foo([0-9])</regex>

            </keywords>

            <keywords id="Other keywords" color="#400080" font-weight="bold" font-style="italic">
              <string>foo</string>
              <string>bar</string>
            </keywords>


            <!--
                The <state> tag specifies a state other than the default state.
                It features the same attributes as <default>.
                It has to contain a <begin> and a <end> tag which in turn have to
                contain a <regex> tag. They can contain <keywords> tags like specified above.
                
                For example here a states for C blockcomments, C++ singleline comments and strings.
                The strings state handles escaped quotes with a lookbehind regular expression
                (see a regex tutorial) and colors "foobar" with strings.
            -->
   
    
    
            <state id="Comment" color="#236E25" font-style="italic">
                <begin><regex>/\*</regex></begin>
                <end><regex>\*/</regex></end>
            </state>
            
            <state id="SingleComment" color="#236E25" font-style="italic">
                <begin><regex>//</regex></begin>
                <end><regex>[\n\r]</regex></end>
            </state>
            
            <state id="String" color="#760f15">
                <begin><regex>"</regex></begin>
                <end><regex>(((?&lt;!\\)(\\\\)*)|^)"</regex></end>
                <keywords id="Other keywords" color="#400080" font-style="italic">
                  <string>foobar</string>
                </keywords>
            </state>

            <!--
                The <import> tag lets you import substates and keywords from other modes.
                It features the following attributes, all optional if not noted otherwise:

                  mode
                      the mode to import from if left out it will import from this mode
                      
                  state
                      the state to import - if left out the content of the
                      default state will be imported
                      
                  keywords-only
                      'yes' if you only want to import the keywords and not the substates
                      of that state
                  
            -->
   

            <state id="Inline Javascript" color="#000" usesymbolsfrommode="Javascript"
                 useautocompletefrommode="Javascript">
                <begin><regex>&lt;(?=script)</regex></begin>
                <end><regex>/script&gt;</regex></end>
    
                <import mode="Javascript" />

                <keywords id="Script Tags"  color="#881280" font-style="italic">
                    <regex>(\A&lt;\Z)</regex>
                    <regex>(&lt;/script[^&gt;]*&gt;)</regex>
                </keywords>

                <state id="Opening Script Tag" color="#881280" font-style="italic"
                  usesymbolsfrommode="HTML" useautocompletefrommode="HTML">
                    <begin><regex>\Ascript</regex></begin>
                    <end><regex>&gt;</regex></end>
        
                    <import mode="XML" state="Tags" />
                </state>
                
            </state>

            <!--
                The <state-link> tag lets you reuse complete states including the
                begin and end regex as well as the attributes on the linked .
                It features the following attributes, all optional if not noted otherwise:

                  state
                      the state to link - not optional
                      
                  mode
                      the mode to import from if left out it will import from this mode
                      
                  
            -->
   
            <state-link state="PHP" mode="PHP-HTML" />

        </default>
        
    </states>

</syntax>

Symbol Definitionen

Symbol Definitionen sind XML Dateien mit folgender Struktur. Bitte sehen Sie sich die Kommentare zur Erklärung der einzelnen Tags an.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE syntax SYSTEM "symbol.dtd">
<symbols>

    <!--
    Das <symbol> Tag legt die Elemente im Function-Popup fest.
    Folgende Attribute, alle bis auf "id" optional, sind möglich:
        id
            Ein eindeutiger Identifikator.
        image
            Legt ein Bild, dass in der Applikation enthalten ist (keine Erweiterung)
            oder ein Bild im Resources Verzeichnis des Modus fest. (mit Erweiterung)
            SubEthaEdit kommt mit folgenden Bildern:
            Symbol#, SymbolC, SymbolE, SymbolF, SymbolF(), SymbolG, SymbolK,
            SymbolL, SymbolM, SymbolP, SymbolS, SymbolT, SymbolV, SymbolWarn
        indentation
            0-15    Einrück-Niveau
        font-weight
            normal  Normaler Schriftsatz
            bold    Fetter Schriftsatz
        font-style
            normal  Normaler Schriftsatz
            italic  Kursiver Schriftsatz
            
        Das Beispiel zeigt ein Symbol mit dem Namen "First example" und dem Bild SymbolM
        mit einer Einrückung von 1.
    -->
   

    <symbol id="First Example" image="SymbolM" indentation="1">
        
        <!--
            Das regex Tag legt den regulären Ausdruck fest, der dem Symbol
            entspricht. Es handelt sich hier um Ruby-RegEx. Wenn Gruppen
            festgelegt werden, wird nur die erste im Menü angezeigt.
            Ungewollte Gruppen also mit (?:) escapen.
            Dieses Tag wird benötigt.
            Tipp: Ausdrücke kann man mit SubEthaEdit's Suchfunktionen testen.
            Tipp: Gross-/Kleinschreibung kann mit (?i) ignoriert werden
        -->

        
        <regex>(function[^\n\r]*)</regex>

        <!--
            Das postprocess Tag verändert den gefundenen String per suchen und ersetzen
            Gruppen wie \1 und so weiter können verwendet werden.
            Es handelt sich hier um Ruby-RegEx.
            Dieses Tag ist optional.
            
            Das Beispiel sucht alle Strings, die von Klammern umschlossen sind und
            ersetzt sie mit einem leeren String Dann sucht es alle "foo" und
            ersetzt sie mit "bar".
        -->

                
        <postprocess>
            <find>\([^\)]*\)</find>
            <replace></replace>
            <find>foo</find>
            <replace>bar</replace>
        </postprocess>
    </symbol>

    <symbol id="Second Example" font-weight="bold" image="SymbolF" indentation="0">
        <regex>foobar</regex>
    </symbol>
    
</symbols>

Autocomplete Wörterbuch

AutocompleteAdditions.txt ist eine Text Datei, die pro Zeile einen Eintrag im Wörterbuch enthält. Hier können also Vervollständigungen die nicht in SyntaxDefinition.plist auftauchen hinzugefügt werden.