1<lexer>
  2  <config>
  3    <name>Fish</name>
  4    <alias>fish</alias>
  5    <alias>fishshell</alias>
  6    <filename>*.fish</filename>
  7    <filename>*.load</filename>
  8    <mime_type>application/x-fish</mime_type>
  9  </config>
 10  <rules>
 11    <state name="paren">
 12      <rule pattern="\)">
 13        <token type="Keyword"/>
 14        <pop depth="1"/>
 15      </rule>
 16      <rule>
 17        <include state="root"/>
 18      </rule>
 19    </state>
 20    <state name="math">
 21      <rule pattern="\)\)">
 22        <token type="Keyword"/>
 23        <pop depth="1"/>
 24      </rule>
 25      <rule pattern="[-+*/%^|&]|\*\*|\|\|">
 26        <token type="Operator"/>
 27      </rule>
 28      <rule pattern="\d+#\d+">
 29        <token type="LiteralNumber"/>
 30      </rule>
 31      <rule pattern="\d+#(?! )">
 32        <token type="LiteralNumber"/>
 33      </rule>
 34      <rule pattern="\d+">
 35        <token type="LiteralNumber"/>
 36      </rule>
 37      <rule>
 38        <include state="root"/>
 39      </rule>
 40    </state>
 41    <state name="root">
 42      <rule>
 43        <include state="basic"/>
 44      </rule>
 45      <rule>
 46        <include state="interp"/>
 47      </rule>
 48      <rule>
 49        <include state="data"/>
 50      </rule>
 51    </state>
 52    <state name="interp">
 53      <rule pattern="\$\(\(">
 54        <token type="Keyword"/>
 55        <push state="math"/>
 56      </rule>
 57      <rule pattern="\(">
 58        <token type="Keyword"/>
 59        <push state="paren"/>
 60      </rule>
 61      <rule pattern="\$#?(\w+|.)">
 62        <token type="NameVariable"/>
 63      </rule>
 64    </state>
 65    <state name="basic">
 66      <rule pattern="(?<=(?:^|\A|;|&&|\|\||\||\b(continue|function|return|switch|begin|while|break|count|false|block|echo|case|true|else|exit|test|set|cdh|and|pwd|for|end|not|if|cd|or)\b)\s*)(continue|function|return|switch|begin|while|break|count|false|block|test|case|true|echo|exit|else|set|cdh|and|pwd|for|end|not|if|cd|or)(?=;?\b)">
 67        <token type="Keyword"/>
 68      </rule>
 69      <rule pattern="(?<=for\s+\S+\s+)in\b">
 70        <token type="Keyword"/>
 71      </rule>
 72      <rule pattern="\b(fish_update_completions|fish_command_not_found|fish_breakpoint_prompt|fish_status_to_signal|fish_right_prompt|fish_is_root_user|fish_mode_prompt|fish_vcs_prompt|fish_key_reader|fish_svn_prompt|fish_git_prompt|fish_hg_prompt|fish_greeting|fish_add_path|commandline|fish_prompt|fish_indent|fish_config|fish_pager|breakpoint|fish_title|prompt_pwd|functions|set_color|realpath|funcsave|contains|complete|argparse|fish_opt|history|builtin|getopts|suspend|command|mimedb|printf|ulimit|disown|string|source|funced|status|random|isatty|fishd|prevd|vared|umask|nextd|alias|pushd|emit|jobs|popd|help|psub|wait|fish|read|time|exec|eval|math|trap|type|dirs|dirh|abbr|kill|bind|hash|open|fc|bg|fg)\s*\b(?!\.)">
 73        <token type="NameBuiltin"/>
 74      </rule>
 75      <rule pattern="#!.*\n">
 76        <token type="CommentHashbang"/>
 77      </rule>
 78      <rule pattern="#.*\n">
 79        <token type="Comment"/>
 80      </rule>
 81      <rule pattern="\\[\w\W]">
 82        <token type="LiteralStringEscape"/>
 83      </rule>
 84      <rule pattern="(\b\w+)(\s*)(=)">
 85        <bygroups>
 86          <token type="NameVariable"/>
 87          <token type="Text"/>
 88          <token type="Operator"/>
 89        </bygroups>
 90      </rule>
 91      <rule pattern="[\[\]()={}]">
 92        <token type="Operator"/>
 93      </rule>
 94      <rule pattern="(?<=\[[^\]]+)\.\.|-(?=[^\[]+\])">
 95        <token type="Operator"/>
 96      </rule>
 97      <rule pattern="<<-?\s*(\'?)\\?(\w+)[\w\W]+?\2">
 98        <token type="LiteralString"/>
 99      </rule>
100      <rule pattern="(?<=set\s+(?:--?[^\d\W][\w-]*\s+)?)\w+">
101        <token type="NameVariable"/>
102      </rule>
103      <rule pattern="(?<=for\s+)\w[\w-]*(?=\s+in)">
104        <token type="NameVariable"/>
105      </rule>
106      <rule pattern="(?<=function\s+)\w(?:[^\n])*?(?= *[-\n])">
107        <token type="NameFunction"/>
108      </rule>
109      <rule pattern="(?<=(?:^|\b(?:and|or|sudo)\b|;|\|\||&&|\||\(|(?:\b\w+\s*=\S+\s)) *)\w[\w-]*">
110        <token type="NameFunction"/>
111      </rule>
112    </state>
113    <state name="data">
114      <rule pattern="(?s)\$?"(\\\\|\\[0-7]+|\\.|[^"\\$])*"">
115        <token type="LiteralStringDouble"/>
116      </rule>
117      <rule pattern=""">
118        <token type="LiteralStringDouble"/>
119        <push state="string"/>
120      </rule>
121      <rule pattern="(?s)\$'(\\\\|\\[0-7]+|\\.|[^'\\])*'">
122        <token type="LiteralStringSingle"/>
123      </rule>
124      <rule pattern="(?s)'.*?'">
125        <token type="LiteralStringSingle"/>
126      </rule>
127      <rule pattern=";">
128        <token type="Punctuation"/>
129      </rule>
130      <rule pattern="&&|\|\||&|\||\^|<|>">
131        <token type="Operator"/>
132      </rule>
133      <rule pattern="\s+">
134        <token type="Text"/>
135      </rule>
136      <rule pattern="\b\d+\b">
137        <token type="LiteralNumber"/>
138      </rule>
139      <rule pattern="(?<=\s+)--?[^\d][\w-]*">
140        <token type="NameAttribute"/>
141      </rule>
142      <rule pattern=".+?">
143        <token type="Text"/>
144      </rule>
145    </state>
146    <state name="string">
147      <rule pattern=""">
148        <token type="LiteralStringDouble"/>
149        <pop depth="1"/>
150      </rule>
151      <rule pattern="(?s)(\\\\|\\[0-7]+|\\.|[^"\\$])+">
152        <token type="LiteralStringDouble"/>
153      </rule>
154      <rule>
155        <include state="interp"/>
156      </rule>
157    </state>
158  </rules>
159</lexer>