Releases: mitchpaulus/mshell
Releases · mitchpaulus/mshell
v0.13.0
v0.13.0 - 2026-04-07
Added
match ... endpattern matching syntax with value matching, type matching,_wildcard, maybe destructuring (just v/none), list destructuring ([a b ...rest]), and dict destructuring ({ 'key': v })mapon dictionaries (maps over values, preserving keys)- Functions
filterbuiltin now supports dictionaries, filtering by value while preserving keyscdhcdpfromUnixTimeMicrofromUnixTimeMillifromUnixTimeNanoprompttoUnixTimeMicrotoUnixTimeMillitoUnixTimeNanotoSvgPathStrunlinesCrLfscaleLinear
- Explicit version syntax (example:
VER "v0.13.0") and execution. You can now specify the exact version a script should run with and this will force the execution to use that interpreter and corresponding standard library. - Multiple cut/copy selections in file manager.
Fixed
- CLI interactive command execution now switches to a fresh output line before parsing/evaluation, so lexer/parser errors do not render on the prompt line.
- Lexer
ERRORtokens now stop parsing immediately (including simple CLI parsing), preventing fall through to evaluation errors like unimplementedERRORtoken handling.
Changed
- Startup now loads both
std.mshandinit.mshfrom version directories (msh/<version>/...), keepsinit.mshoptional for implicit current-version startup unlessMSHINITis set, requires it forVERscripts, re-execsVERscripts withmsh-<version>when needed, and ignoresMSHSTDLIB/MSHINITforVERscripts. cartesiantype signature changed. Now is[[a]] [a] -- [[a]]. This make it easy to chain more than one Cartesian product. Usually start the chain off with empty[[]]as an identity element.
What's Changed
- Add multiple cut/copy selections at once by @mitchpaulus in #161
- Feat/cdh builtin by @mitchpaulus in #162
- Improve lexer error handling by @mitchpaulus in #163
- Don't complete defs in binary CLI mode by @mitchpaulus in #164
- Fix quoting prefix ending with whitespace by @mitchpaulus in #165
- Add prompt built in by @mitchpaulus in #166
- Change prompt function signature by @mitchpaulus in #167
- Add some SVG utils by @mitchpaulus in #168
- Async preview pane by @mitchpaulus in #169
- Fix modal input in file manager by @mitchpaulus in #170
- Add other Unix time variations by @mitchpaulus in #171
- First pass at pattern matching by @mitchpaulus in #175
- Add unlinesCrLf by @mitchpaulus in #176
- Add mapping over dictionaries by @mitchpaulus in #177
- Clean up file manager architecture by @mitchpaulus in #178
- Improve logging by @mitchpaulus in #179
- More attempts at file manager fixes by @mitchpaulus in #180
- Versioning by @mitchpaulus in #172
- Init file loading by @mitchpaulus in #181
- Startup versioning rework by @mitchpaulus in #182
- Try fix CI by @mitchpaulus in #183
- Fix interactive completions by @mitchpaulus in #184
- Change Cartesian definition by @mitchpaulus in #185
- Parallel execution work by @mitchpaulus in #186
- Make filter built in work on dicts by @mitchpaulus in #188
Full Changelog: v0.12.0...v0.13.0
v0.12.0
Version bump for release (#160)
v0.11.0
0.11.0 - 2026-02-18
Added
completionDefsbuiltin: pushes a dictionary of completion definitions, keyed by command name with quotation valuesmshFileManagerbuiltin: pops a starting directory from the stack, opens the file manager, and cds to the final directory on exitmsh fmnow accepts an optional starting directory argument- Built-in file manager via
msh fmsubcommand and Ctrl-O in interactive mode- Dual-pane layout with directory listing and file/directory preview
- Vim-style navigation (
j/k,h/l,gg/G, Ctrl-u/Ctrl-d) - Search with
/, case-insensitive match highlighting,n/Nto cycle matches - Rename with
r, cursor positioned before extension, Ctrl-W word delete - Bookmarks with
m+ char to set,;+ char to jump - Editor integration with
e(uses$EDITOR) - Directory change on quit (Ctrl-O returns to shell in new directory)
- Version-sorted entries, directories first and colored blue
- Binary file detection for preview
- Preview caching for fast scrolling
- Cut/copy/paste buffer (
dcut,yycopy,ppaste,cclear) shared across instances - Delete to trash (
x) with confirmation, using platform-native trash msh fmprints final directory to stdout forcd "$(msh fm)"usage
What's Changed
- Add first version of file manager by @mitchpaulus in #154
- Add cut/copy/paste to file manager by @mitchpaulus in #155
- Add mshFileManager builtin by @mitchpaulus in #156
- Add completionDefs built in by @mitchpaulus in #157
- Add sudo and systemd related completions by @mitchpaulus in #158
Full Changelog: v0.10.0...v0.11.0
v0.10.0
0.10.0 - 2026-02-13
Added
- Tail-call optimization (TCO) for recursive definitions in tail position.
- Functions
sincostanarctanlnln2ln10powrandomrandomFixedrandomNormsqrtrandomTritempFileExt
- CLI Alt-D inserts the current date as
YYYY-MM-DD
Fixed
- Windows CMD.EXE /C quoting now handles quoted commands with extra arguments (e.g., npm.cmd paths with spaces).
Changed
- Builds/releases now are pure Go, built with
CGO_ENABLED=0.
What's Changed
- Fix segfault with missing variable in prefix quote by @mitchpaulus in #139
- Add new math functions by @mitchpaulus in #140
- Add more random distribution functions by @mitchpaulus in #141
- Add tempFileExt, improve temp file docs and handling by @mitchpaulus in #142
- Feature/binary complete after bracket by @mitchpaulus in #143
- Feature/tab completion columns by @mitchpaulus in #144
- Add arctan and pow by @mitchpaulus in #146
- Add ALT-d date mapping by @mitchpaulus in #147
- Attempt to fix cmd quoting with quotes inside on first arg by @mitchpaulus in #148
- Add vscode run current file by @mitchpaulus in #149
- Respect my original tab column layout algorithm by @mitchpaulus in #150
- Update docs by @mitchpaulus in #151
- Working TCO by @mitchpaulus in #152
- Include standard lib in releases, update release CI by @mitchpaulus in #153
Full Changelog: v0.9.0...v0.10.0
v0.9.0
0.9.0 - 2026-01-27
Added
- Prefix quote syntax (
functionName. ... end) as an alternative to(...) functionName <>operator for in-place file modification. Reads file to stdin, writes stdout back on success.
Example:[sort -u] `file.txt` <> !- Functions
chompcstToUtcfromOleDatetoOleDate__gitCompletion__sshCompletionstrCmpstrEscapereSplitlinearSearch
- Function definition metadata dictionaries in
defsignatures - Definition-based CLI completions via the
completemetadata key - CLI completions for:
mshgitfdrgssh
- CLI history prefix search on Ctrl-N/Ctrl-P (case-insensitive)
- Alt-. to cycle last argument from history in the CLI
- Bin map file and
msh binCLI commands for binary overrides msh completionssubcommand for bash, fish, nushell, and elvish- CLI syntax highlighting for environment variables
- GitHub Action for installing mshell in CI workflows
- Append stderr redirection with
2>> - Combined stdout/stderr redirection with
&>(truncate) and&>>(append) - Same-path detection when using
>and2>with identical paths (shares single file descriptor) - Full stderr redirection support for quotations (
2>,2>>,&>,&>>) - Null byte validation for redirection file paths and
cp/mvcommands
Fixed
- CLI binary mode now converts literal redirect targets (e.g.,
cmd > file.txtconvertsfile.txtto a string for stdout, path for stdin) - CTRL-C now only kills the running subprocess instead of both the subprocess and the shell
Changed
- Breaking change:
@namenow only reads mshell variables and no longer falls back to environment variables; use$NAMEfor environment access. w/wenow accept binary input and write raw bytes to stdout/stderr.- Renamed
.stostack,.deftodefs,.envtoenv - Removed
.b(usebinPathsinstead)
What's Changed
- Add CTRL-n/p history by @mitchpaulus in #89
- Implement tab cycling by @mitchpaulus in #90
- Clear tab completions on enter by @mitchpaulus in #91
- Implement ALT-. by @mitchpaulus in #92
- Add OLE date functions by @mitchpaulus in #93
- Add new binary mapping functionality by @mitchpaulus in #94
- Add first pass at completions by @mitchpaulus in #95
- Add env var CLI highlighting by @mitchpaulus in #96
- Feature/function def metadata by @mitchpaulus in #98
- Add first pass at custom binary completions by @mitchpaulus in #99
- Add git completion by @mitchpaulus in #100
- Add 'rg' and 'fd' completions by @mitchpaulus in #101
- Completions by @mitchpaulus in #97
- Tab complete on built ins and defs by @mitchpaulus in #102
- Add strEscape by @mitchpaulus in #103
- Improve git add completion by @mitchpaulus in #105
- Add if/else syntax by @mitchpaulus in #106
- Update completions to use new if/else syntax by @mitchpaulus in #107
- Stderr redirect append by @mitchpaulus in #108
- Refactor completion for testability by @mitchpaulus in #109
- Improve bin audit search by @mitchpaulus in #111
- CLI Pipeline by @mitchpaulus in #110
- Fix CLI redirection literals by @mitchpaulus in #112
- Add reSplit function by @mitchpaulus in #113
- Feature/combined stdout stderr redirect by @mitchpaulus in #115
- VS Code LSP support by @mitchpaulus in #114
- Vscode by @mitchpaulus in #116
- Update docs by @mitchpaulus in #117
- Add ssh completion by @mitchpaulus in #118
- Update variable retrieval, no environment fallback by @mitchpaulus in #120
- Add check on Agent files being the same by @mitchpaulus in #121
- Implement CTRL-space in CLI with no alias by @mitchpaulus in #122
- Add chomp function by @mitchpaulus in #123
- Add in-place edit operator <> by @mitchpaulus in #124
- Add strCmp function by @mitchpaulus in #126
- Update README by @mitchpaulus in #127
- Add linearSearch by @mitchpaulus in #128
- Add ability to write a binary to stdout/stderr by @mitchpaulus in #129
- Update completion ordering by @mitchpaulus in #130
- Add CTRL-c capability by @mitchpaulus in #131
- Add newline for prompt if not column 1 by @mitchpaulus in #132
- Add action.yml by @mitchpaulus in #133
- Prefix funcs WIP by @mitchpaulus in #134
- Add CST to UTC by @mitchpaulus in #135
- Prepare 0.9.0 release by @mitchpaulus in #136
- Action fix by @mitchpaulus in #137
- Another fix try by @mitchpaulus in #138
Full Changelog: v0.8.0...v0.9.0
v0.8.0
0.8.0 - 2025-12-29
Added
- Functions
2each2tuplefloatCmpceilfloorleftPadlastIndexOfnumFmtpreserveIntoption fornumFmtnowdatenullDeviceenumerateenumerateNtakeWhiledropWhile2unpack2applytitlezipDirInczipDirExczipDirzipPackzipListzipExtractzipExtractEntryzipReadchunkrepeatreturntoJsonbase64encodebase64decode:shorthand forget
timeoutoption forhttpGetandhttpPost- Support for comma-separated variable stores (e.g.
a!, b!, c!) - LSP completion suggestions for
@variable references - LSP rename support for variables scoped to definitions and globals
- Default CTRL-F binding matching fish shell behavior
- Execution operators for capturing stdout/stderr as strings or binary (
*b,^,^b)
Changed
- Breaking change: renamed the builtin that returns the current datetime from
datetonow;datenow truncates a datetime to its date-only component. parseJsonnow accepts binary input and decodes it as UTF-8 before parsing.fileExistsnow uses golang os.Lstat instead of os.Stat, meaning if you have a broken symlink in Linux,fileExistswill now returntrueinstead offalse.- Slice semantics are slightly different. You now get a new backing array guaranteed for slice. This would come up if you did a partial slice (
0:n), and then extended that in a loop or map. You could then be "extending" into the same backing array, causing previous items in the loop to be overwritten. mvwill now allow moving a file path into a directory path. Previously had to be file to file.skipandtakeno longer throw exception whennis greater than the length of the list.- Input redirection can now accept binary data directly and stream it to stdin without string conversion.
Fixed
- Fixed infinite loop in
versionSortCmpwhen non-digit after digit.
What's Changed
- docs: sync Evaluator built-ins by @mitchpaulus in #43
- Update function documentation by @mitchpaulus in #44
- Update navigation styling by @mitchpaulus in #45
- Update README by @mitchpaulus in #46
- Update help by @mitchpaulus in #47
- Test doc deploy by @mitchpaulus in #48
- Add parseLinkHeader by @mitchpaulus in #51
- Start of LSP by @mitchpaulus in #49
- Add Notepad++ user language definition for mshell by @mitchpaulus in #52
- Gopls by @mitchpaulus in #53
- Add leftPad by @mitchpaulus in #54
- Update sublime-syntax by @mitchpaulus in #55
- Update 'date' to strip time and add 'now' to put current time on stack by @mitchpaulus in #56
- New funcs by @mitchpaulus in #57
- Add LSP completion for variable references by @mitchpaulus in #58
- LSP Rename by @mitchpaulus in #59
- Add 2tuple by @mitchpaulus in #60
- Update parseJson to take a binary on the stack by @mitchpaulus in #61
- Add dictionary type items by @mitchpaulus in #62
- Add enumerate functions to standard lib by @mitchpaulus in #63
- Zip work by @mitchpaulus in #67
- Add floor and ceil functions by @mitchpaulus in #69
- Chunk by @mitchpaulus in #70
- repeat by @mitchpaulus in #71
- Add
lastIndexOfby @mitchpaulus in #72 - title function by @mitchpaulus in #73
- WIP by @mitchpaulus in #74
- toJson work by @mitchpaulus in #75
- Add return function by @mitchpaulus in #76
- Implement CTRL-f like fish by @mitchpaulus in #77
- Binary redirect test by @mitchpaulus in #79
- Add binary dump by @mitchpaulus in #80
- Change implementation for 'lines' by @mitchpaulus in #82
- Add base64encode and base64decode by @mitchpaulus in #83
- Getter by @mitchpaulus in #84
- Feature/docs functions toc by @mitchpaulus in #85
- Add a getting started page by @mitchpaulus in #86
- Pointer to Value receivers by @mitchpaulus in #87
- Update CI for doc building by @mitchpaulus in #88
Full Changelog: v0.7.0...v0.8.0
v0.7.0
0.7.0 - 2025-10-03
Added
- Basic tab completion for the CLI
- Basic HTML parsing
- Start of VS code extension
httpGetandhttpPostfor making web requests.- Functions
isNoneparseHtmlabsPathbindfindByTagconcatcartesiangroupByreFindreFindAllIndexmd5eachWhilermftakeskip
Fixed
- Handling of
.cmdand.bat - Now immediately close file when appending
mvmade more robust- Fixed broken line/columns in lexing
- Better handling of UTF-8 input
Changed
- Now return Maybes for conversions
- Removed
canParseDt getreturns Maybe- No escaping in path literals
- In JSON mappings, null now goes to
none, not 0. fileSizenow returns Maybe
What's Changed
- Moving to single 'Render' function for CLI by @mitchpaulus in #38
- Fix broken lexing lines and cols by @mitchpaulus in #42
Full Changelog: v0.6.0...v0.7.0
v0.6.0
v0.6.0 updates
v0.5.0
Bump version
v0.4.1
Add version sorting `sortV` and `sortVu`