Releases: xonsh/xonsh
v0.23.8
0.23.8 (2026-05-28)
Features
- Parser: Support multiline string with logical subprocess (#6465) (78d9c53), @anki-code
- Add
events.on_completer_filterto skip certain completer if needed (#6453) (ea747d2), @anki-code (@gforsyth) - Support SSH escape sequences (#6462) (c5300ed), @anki-code (@brechtm)
- Builtins: source-foreign: Add ash, dash, ksh as reference to sh (#6459) (9bb681f), @anki-code
Fixes
- Parser: Treat
!inside f-string{…}as conversion (#6466) (6f52fdc), (b41ba78), @anki-code - xcontext: Show both path and resolved path (#6448) (8b75ce2), @anki-code
- xontribs: Invalidate import caches before loading xontribs (#6452) (794b53c), @rautyrauty
- TTY: Fix termios error (#6461) (b8e51f0), @anki-code (@dysfungi)
- Builtins: trace: Fix lags issue by avoiding settrace for all files. Also improve output flushing (#6460) (da4e2c9), @anki-code (@certik, @johny65, @gnikit)
- completer: Source user bash completion scripts (#6464) (a17c6f6), @doronz88
- Proc: Additional polling return code (#6457) (0549cc5), @anki-code (@rautyrauty)
- Readline: Completer: Fix file with space in name (#6455) (d7a2811), @anki-code (@ttufts)
- Builtins: source-foreign: Show more detailed error, add
source-sh(#6458) (8ef52c1), @anki-code (@CmdQ, @damienflament) - tests: Add pytest-xdist support (#6454) (85f6c55), @anki-code (@jnoortheen)
Refactoring
- Remove docstring shenanigans from events (#6449) (8bc46d0), @anki-code (@AstraLuma)
v0.23.7
0.23.7 (2026-05-17)
Features
- Command: Add
@toml,@xml,@lxmlcommand decorators (#6436, #6437, 97f701d), @anki-code - Completer: Add dedicated
sudocompleter (#6433) (f7f2d27), @anki-code (@Infinidoge) - Env: Add sentinel
@.env.DELETE_VARto removing env variables using env swap/layouts/specs (#6427) (7e66501), @anki-code (@dconeybe)
Fixes
- Builtins:
exit Naborts execution immediately (#6429) (eb916a0), @anki-code (@nahoj) - Proc: Fix alias with pipe backgrounding (#6439) (208d359), @anki-code (@goodboy)
- Env: Pop THREAD_LOCAL from inherited os.environ in default_env (#6434) (4d966d2), @ZZBaron
- Nix: Forward $PATH in foreign shell tests so they work in Nix sandbox (#6430) (#6431) (afb2eda), @anki-code (@ZZBaron)
- BSD: Added regular FreeBSD testing to Xonsh CI (#6440), @anki-code
- Aliases: Add repr to DecoratorAlias and ArgParserAlias (#6443) (554b675), @anki-code
Documentation
- Docs: Capitalize docs title (#6441) (c458ba4), @anki-code
Xonsh World
- xontrib-jedi has massive update, @anki-code
- xontrib-fish-completer has massive update, @anki-code
- xontrib-mpl has massive update, @anki-code (@wangjiawen2013, @melund)
v0.23.6
0.23.6 (2026-05-11)
Shining Features
Allow comments in multiline commands (#6417)
Now you can comment line in a multiline command:
curl https://xon.sh \
-fsSL \
# --compressed \
-H "User-Agent: curl"Add xontrib info (#6407)
xontrib info output_searchName: output_search
Source: xontrib.output_search at /Users/snail/.local/xonsh-env/lib/python3.14/site-packages/xontrib/output_search.py
Description: Get identifiers, paths, URLs and words from the previous command output and use them for the next command in xonsh shell.
Loaded: yesFeatures
- Parser: Allow comments in multiline commands (#6417) (081deeb), @anki-code (@goodboy)
- Extensions: Add
xontrib info <xontrib_name>(#6407) (6fe1e11), @anki-code - Completer: Show alias body in description if no docstring (#6408) (fe6472e), @anki-code
- Release: Add checksums for artifacts on release page and on nightly build page (#6420) (cf0ee6b), @anki-code (@ScriptAutomate, @jirutka, @meramsey)
- source-foreign: Add
--show-outputto source foreign (#6421) (23e26b8), @anki-code (@a-da, @gforsyth, @batthias, @jnoortheen)
Fixes
- AppImage: Remove legacy logic from entrypoint (#6415) (ab26546), @anki-code (@elgow, @cocoix)
- Completer: Fix completer in case of xontrib load with unknown arg (#6405) (68c234a), @anki-code (@goodboy)
- Windows: Aliases: Fix sudo shadowing and significantly improve win_sudo logic (#6410) (58b835b), @anki-code (@jaraco)
- Conda on Windows: Initial fix of
conda init xonshand activate/deactivate aliases when conda is on $PATH (#6423) (6708eee), @anki-code (@melund, @scopatz, @royess, @wybert) - Environ: EnvPath should preserve empty values in the general case (#6416) (3e63379), @anki-code (@nahoj)
- source-foreign: Foreign shell function aliases now stream their output through the caller-supplied stdout/stderr instead of inheriting xonsh's terminal fds (#6409) (c40cfc5), @anki-code (@japert)
- Prompt: Fix exception in case IGNOREEOF + ^D (#6413) (03cd547), @anki-code (@elgow)
- Docs: Fix code highlighting (#6418) (b009635), @anki-code
- Docs: Highlight xonsh code block in docs/xonshrc (#6419) (bfb4667), @anki-code
v0.23.5
0.23.5 (2026-05-05)
Features
- Aliases: Show alias description in completion menu (#6399) (cf6db23), @anki-code
- Dev: Alpha version of a Xonsh code formatter. Run
xonsh format file.xsh(#6401) (8c3191e), @anki-code
Fixes
- Сompleter: Allow completion of explicit dot-dirs (#6402) (343f5fd), @anki-code
- Completer: Fix regress with parent directory completion (#6404) (0d5a2fc), @anki-code (@nahoj)
- Tests: Fix webconfig test with preventing adding tail to global xonsh RC (#6400) (a94eb6a), @anki-code
Xonsh World
v0.23.4
0.23.4 (2026-05-03)
Fixes
- Parser: f-strings: SyntaxError with int formatting (#6390) (f5ca787), @anki-code (@yobleck)
- Parser: Fix lost LHS in
cmd && ![…]chain wrap (#6392) (4daff85), @anki-code (@nahoj) - Prompt: AssertionError: wrong color format 'blink' (#6391) (a31a53e), @anki-code (@Triquetra)
- Cross-platform: Jupyter: pyghooks lexer fix when XSH.aliases is None (#6384) (dc16ca6), @anki-code
- Cross-platform: FreeBSD: test_integrations
tests/bin/cat: No such file or directory(#6383), @anki-code (@nunotexbsd) - Nix: fix nix build (#6388) (5831959), @SamLukeYes
- Xontrib: Xontrib load using entrypoint e.g. coconut (#6394) (d68e39c), @anki-code (@nahoj)
- Chore: Added smoke tests (#6393) (c5c2a3f), @anki-code
Xonsh World
- virtualenv reintroduced xonsh activator in 21.3.0, @anki-code (thanks @gaborbernat)
- xontrib-jupyter is going to release 0.4.0 with big refactoring and features on board, @anki-code
- xontrib-template now supports
uv, @anki-code
v0.23.3
0.23.3 (2026-04-30)
Features
- Cross-platform: Better FreeBSD support: added defaults, fixed jail tests and found and fixed FreeBSD specific pipeline behavior (#6375) (ced252e), @anki-code (@nunotexbsd, @yonas)
- Cross-platform: Better Android/Termux support: all tests are reviewed and fixed, added ON_ANDROID and ON_TERMUX variables, additional TERMUX support was implemented (#6382) (c3aefaf), @anki-code
- Debug: Added frame to
@.debug.breakpoint()(#6376) (8e17615), @anki-code (@goodboy)
Fixes
- Parser: Fix SyntaxError in case
cmd && @() && cmd(#6380) (759f9bb), @anki-code (@nedsociety) - Debug: Show debug warning in case of worker thread (#6378) (58b66d5), @anki-code (@goodboy)
v0.23.2
0.23.2 (2026-04-26)
This fix release focused on improving the completer and adding an instant debugging tool and GitHub Actions.
Features
- Added
@.debugwithbreakpointandreplace_builtin_breakpoint(#6363) (f092a8c), @anki-code (@goodboy) - Completer: Use quotation only if needed (#6367, #6366), @anki-code (@bobhy)
- Added Xonsh Github Actions -
xonsh/actions@v2(c27c97e), @anki-code
Fixes
- Completer: Fix
@.<obj>.<tab>completion (#6364), @anki-code - Completer: Fix bash completer quotation (#6370), @anki-code
- Completer: Hide syntax and private methods if line is empty (#6372), @anki-code
- Nix: Now flake uses the package built from source (#6361), @shubms
Documentation
- Update index.html for i18n support (#6359) (cac1476), @hwhsu1231
- Replace xonshrc mentions to the link with xonshrc.rst (#6365) (6032abc), @anki-code
- Fix dockerhub container name (8b323de), @anki-code
v0.23.1
0.23.1 (2026-04-21)
Fix release.
Fixes
- Docs: Avoid error when output dir is not
_build(#6357) (6ba2b3e), @hwhsu1231 - Parser: Preserve "func()[subscript]" at statement level (#6355) (aa7383a), @anki-code (@amotl)
- Prompt:
virtualenvname now has smarter formatting (#6353) (014715e), @anki-code - Chore: Fixed release-please depth to avoid reace with nightly build (#6351) (3d9eb6a), @anki-code
v0.23.0
0.23.0 (2026-04-19)
Release Description
Overview
A major release focused on reliability and language capabilities. The process subsystem has been reworked with proper thread safety, file descriptor management, and pipe handling across all platforms. The parser now supports PEP 701 f-strings, the walrus operator for env variables, and positional-only arguments. Completions are smarter — sorted by substring match position with visual highlighting. Callable aliases gained a local env overlay, decorator-based configuration, and full help/superhelp support. Globbing is unified under $DOTGLOB with a new regex match glob m. Over 150 potential breaking cases were identified and resolved, making this the most stable release of xonsh to date.
Changes requiring attention
Process subsystem reworked (#6159)
Pipe file descriptor management, thread safety, and signal handling have been extensively investigated, rigorously tested, and corrected. The internal thread management mechanisms for callable aliases have been stabilized and thoroughly stress-tested. Terminal handshake has been added, along with additional OS signal handling to improve behavior when xonsh process groups run in the foreground, background, or as child processes. We ask you to report any issues related to I/O and file descriptors to the issue tracker, so we can catch potential edge cases.
Error handling for subprocess chains enabled by default (#6267)
Xonsh now treats subprocess commands like real code. Every subprocess chain raises an exception on non-zero exit by default ($XONSH_SUBPROC_RAISE_ERROR=True), so a failing command in a function or loop stops execution immediately instead of silently letting subsequent logic run on invalid state:
ls nofile # exception
ls nofile || echo fallback # no exception — chain handled the error
echo ok && ls nofile ; echo done # exception on the first chain
def func():
echo Start
ls nofile # exception
echo End
func()
# BEFORE: Start <stderr> End
# NOW: Start <stderr> <exception>Captured subprocess !() does not raise — full control is on the user:
if !(ls nofile): # no exception — user handles the result
passFor granular error handling, use command decorators and env swap:
@error_ignore ls nofile # suppress for this command
with @.env.swap(XONSH_SUBPROC_RAISE_ERROR=False):
ls nofile # suppress for this block
!(@error_raise ls nofile) # raise exceptionThe old $RAISE_SUBPROC_ERROR (raise exception on every command) is renamed to $XONSH_SUBPROC_CMD_RAISE_ERROR (default False).
Globbing: $DOTGLOB now controls all globs including regex (#6234)
Previously regex globs (r`\..*`) and backtick globs always matched dotfiles regardless of $DOTGLOB. Now all glob forms respect it uniformly. Since $DOTGLOB defaults to False, existing scripts that use regex globs to match hidden files will stop finding them. Set $DOTGLOB = True if you want to match hidden files.
Prompt: Completions match by substring, not just prefix (#6125)
Completions now match by substring, not just by prefix. Typing deploy will find dev-xonsh-deploy, and results are sorted by the position of the match — earlier occurrences rank higher.
Don’t forget about $COMPLETION_MODE = "menu-complete" if you want to select the first option immediately.
Shining Features
Substring Completions (#6125)
aliases |= {'dev-xonsh-deploy': 'echo'}
deploy<Tab>
# dev-xonsh-deploy # matched by substring, sorted by positionPEP 701 f-strings (#6202)
echo f"{"$HOME"}"
# /home/snail
echo f"{'hello':>10}"
# helloCompile XSH Files, Xontribs and Imports (#6167)
# ~/.xonshrc compiled on first load
import mymod # mymod.xsh compiled and cached
xontrib load gitinfo # xontrib gitinfo.xsh compiled and cachedNon-blocking Prompt (#6183)
Syntax highlighting is now non-blocking — typing, completion and navigating through history feel instant regardless of $PATH size. Especially noticeable on Windows with slow directories. Slow $PATH directories can be cached using $XONSH_COMMANDS_CACHE_READ_DIR_ONCE.
Regex glob m with match groups and chain processing (#6235)
for parent, file in m`src/(.*)/(.*\.png)`: # return match groups
print(parent, file)
m`src/.*`.files().paths() # chain processing
m`src/(.*)/(.*\.py)`.select(1).unique().sorted() # group chain processingHelp and Superhelp for Environment Variables and Aliases (#6222, #6263)
$PATH? # shows variable description
my-ls? # shows alias, resolved alias and executable path
my-callable-alias?? # + shows source code and file location of callable aliasInstant Click CLI for Callable Aliases (#6265)
@aliases.register_click_command
@aliases.click.option('--name', default='World')
def _hello(ctx, name):
"""Greet someone."""
print(f'Hello {name}!', file=ctx.stdout)
print(f'Callable alias args like stdout are available in ctx.', file=ctx.stdout)
ctx.click.echo('And click too.')
hello --name Snail # Hello Snail
hello --help # shows usage, options, description
hello?? # shows source code and file location if it was importedCommand Decorators List Extended (#6212)
Added @path, @paths, @error_ignore, @error_raise.
$(@path echo '/bin') # Path('/bin')
echo 1 && @error_ignore ls nonono # no exception that stopped the script executionTake a look at the documentation if you want to create your own.
Emoji and Symbols (#6246)
Activate completer:
$XONSH_COMPLETER_EMOJI_PREFIX = "::" # disabled by default
$XONSH_COMPLETER_SYMBOLS_PREFIX = ":::" # disabled by default
::<Tab> # shows emoji picker: 🌓✨
::cat<Tab> # shows 🐈 related emoji
::<Tab> # shows symbols picker: ⚝
:::arr<Tab> # shows arr symbols: →, ↔, ↗.Take a look at the documentation if you want to add random emoji to prompt.
Prompt: Tab/Shift-Tab indent and Shift+Enter newline (#6213)
IDE-like experience in the prompt: select lines of a multiline command with Shift+Arrow, then Tab/Shift-Tab to indent/dedent the selection. Shift+Enter inserts a newline without submitting.
Cursor Position for Next Command (#6244)
$XONSH_PROMPT_NEXT_CMD = 'echo My name is @(<edit>)'Windows Script Execution (#6180)
$PATHEXT = ['.xsh', '.py']
./myscript.xsh # runs in xonsh
./myscript.py # runs in python
./myscript # resolved by PATHEXTXonsh Activator in virtualenv
Support for the xonsh activator will be restored in virtualenv soon.
Xonsh Packaging for Nix (#6288)
Now we have Nix Flake that builds xonsh from git source (thanks @SamLukeYes!):
nix build 'github:xonsh/xonsh'Xonsh Installer for Windows
Experimental. Now we have Xonsh installers for Windows 8.1+.
Xonsh Nightly Build
We introduced continuous nightly build that has Xonsh AppImage, Windows Installers and experimental Flatpak and Linux Nuitka Binary.
Xonsh Documentation
Now xonsh documentation has much more information, examples and code.
Xonsh Merch
Our friends at HELLOTUX have created an awesome collection for us — including bags, backpacks, T-shirts, and hoodies. Check it out - https://www.hellotux.com/xonsh
Release Notes
Important changes
- Error Handling: Raising exceptions for subprocess chains is enabled by default. Logical operations (
||,&&) are handled correctly.$RAISE_SUBPROC_ERRORdeprecated in favor of$XONSH_SUBPROC_CMD_RAISE_ERROR(#6267) - Processes: Major improvements to core logic for threads, pipes, file descriptors, and process output management across all platforms (#6159)
- Parser: First version with support of PEP 701 f-strings (#6202)
- Completer: Order completions by both prefix and substring matches, sort by substring position. Remove
$CASE_SENSITIVE_COMPLETIONS(#6125) - Glob:
$DOTGLOBnow controls all forms of globbing uniformly (normal, regex) with a dedicated documentation page (#6234) - Performance: Compile xsh xontribs and imports (#6167)
- ...
Nightly build
xonsh 7b0d1a8 (2026-06-09 06:33:40 UTC)
