A Sublime Text 4 package for the Python-powered shell xonsh
extending the default Python package with xonsh-specific contexts

## Introduction This package adds support for the `xonsh` language (for files with `.xsh` and `.xonshrc` extensions) by extending the syntax definitions from the default Python package with the following xonsh-specific contexts: - Variables: `$variableA`, including the environment `${...}` - Subprocess operators: `$()` `$[]` `${}` `@()` `@$()` (and `!()` `![]`) - Search functions: `` @functionB`search_string` `` - Builtin functions: `abbrevs()` `aliases()` `compilex()` `execx()` `evalx()` `events()` `print_color()` `exit()` `printx()` ... and copying all the other relevant elements (Snippets, Comments, Completion Rules, Indentation Rules, Symbol List, and the Default keymap) & re-scoping them to work in the `xonsh` syntax ## Installation - __Via [Package Control](https://packagecontrol.io)__: open `Command Palette` → `Package Control: Install Package` → `xonsh`
                                        ^Ctrl/⌘Cmd⇧ShiftP - __Manually__: clone this repository to your [Packages directory](https://www.sublimetext.com/docs/packages.html) and rename it to `xonsh` ```sh cd /path/to/sublime/packages/directory git clone https://github.com/eugenesvk/sublime-xonsh.git mv sublime-xonsh xonsh ``` ## Usage Open any `xonsh` file (e.g. [syntax_example_screen.xsh](./test/syntax_example_screen.xsh)) and verify that the selected syntax is `Xonsh` and xonsh-specific contexts are properly scoped[^1] and highlighted, maybe like so (depending on your color scheme): ![xonsh syntax screenshot solarized](./doc/syntax_example_screen_solar.png?raw=true "Custom solarized scheme") ![xonsh syntax screenshot default](./doc/syntax_example_screen_def.png?raw=true "Default color scheme") [^1]: scope naming is supposed to conform to that of the default Python package and [ST's scope naming guidelines](https://www.sublimetext.com/docs/scope_naming.html)
Examples of supported syntaxes: variables | Example | Description | :-------------- | :---------- | `$` | Match a single variable definition symbol to help with completions | `$varA=[1,2]` | Regular variable | `$varA[0]` | Variable indexing | `$varA[$varB]` | Variable inside an index | `funct($varB)` | Variable inside a function | `f"{$varA}"` | Variable inside a function string | `${...}` | The environment itself
Examples of supported syntaxes: subprocess operators | Example | Description | :-------------- | :---------- | `@$(which ls)` | Command Substitution | `@('echo', 1)` | Python Evaluation | `$(echo 1)` | Captured Subprocess | `!(echo 1)` | ... | `$[echo 1]` | Uncaptured Subprocess | `![echo 1]` | ...
### Exposed scopes
List of scope names | xonsh construct | Scope name | :------------ | :---------- | Variable | `meta.variable.xonsh`
`variable.other.xonsh` `variable.other.env.xonsh` `variable.other.env.ellipsis.xonsh`
`punctuation.definition.variable.xonsh` | Command Substitution | `meta.interpolation.command.xonsh` `meta.parens.interpolation.command`
`keyword.operator.subprocess.pyeval.xonsh` `keyword.operator.subprocess.xonsh`
`punctuation.section.parens.` `begin`/`end` `.xonsh` | Python Evaluation | `meta.interpolation.command.xonsh` `meta.parens.interpolation.command`
`keyword.operator.subprocess.pyeval.xonsh`
`punctuation.section.parens.` `begin`/`end` `.xonsh` | Captured Subprocess | `meta.interpolation.command.xonsh` `meta.parens.interpolation.command`
`keyword.operator.subprocess.captured.xonsh`
`punctuation.section.parens.` `begin`/`end` `.xonsh` | Uncaptured Subprocess | `meta.interpolation.command.xonsh` `meta.brackets.interpolation.command`
`keyword.operator.subprocess.uncaptured.xonsh`
`punctuation.section.brackets.` `begin`/`end` `.xonsh` | Search Function | `meta.function-call.xonsh` `meta.function-call.arguments.xonsh` `meta.string.xonsh`
`string.quoted.backtick.xonsh`
`punctuation.definition.annotation.xonsh` `punctuation.section.string.` `begin`/`end` `.xonsh` `punctuation.section.arguments.` `begin`/`end` `.xonsh`
### Keybindings This plugin adds two keybindings for the `xonsh` scope: `"`/`'` that auto-pair double/single quotes even after string modifiers ## Known issues - Only works in Sublime Text 4 since build __4048__ (2023 March 14th) since it's using `meta_append`/`meta_prepend` APIs - Illegal Python names that would be legal in a subprocess mode are nonetheless scoped as illegal since there is no differentiation between Python and subprocess modes:
e.g. `as` in `echo "$HOME" as well as '$HOME'`
As a workaround use `"`quotes`"` or dim/remove error highlighting for `source.xonsh invalid.illegal.name` ## Credits The default packages' syntax files ([Python](https://github.com/sublimehq/Packages/blob/master/Python/Python.sublime-syntax), [Bash](https://github.com/sublimehq/Packages/blob/master/ShellScript/Bash.sublime-syntax), [PHP](https://github.com/sublimehq/Packages/blob/master/PHP/PHP.sublime-syntax)), as well as [fish](https://github.com/Phidica/sublime-fish/blob/master/fish.sublime-syntax)