vlsh is a fast, modern shell built for developers who want to read, modify, and extend their shell — not just use it.
Features
vlsh ships with the fundamentals done right, then gets out of your way.
Built with V, vlsh compiles to a lean native binary. Cold start is near-instant — no interpreter overhead on every keystroke.
Full pipeline support with | pipes, < / > / >> redirection, and && / || / ; command chaining. Glob expansion, tilde expansion, and $VAR substitution all work as expected.
Persistent command history across sessions (up to 5 000 entries). Press Ctrl+R for incremental search through every command you've run.
File and directory completion out of the box, including paths after a trailing / in subdirectories. Plugins can register custom completions for commands, flags, and any domain-specific vocabulary.
Fish-style ghost text appears as you type, sourced from command history. Press → or End to accept the suggestion. Includes path validation for cd candidates and a filesystem fallback.
Install community plugins from the remote repository with plugins install <name> and keep them up to date with plugins update. Plugins can add commands, decorate the prompt, run hooks, and provide completions.
Split panes horizontally or vertically with Ctrl+V prefix bindings. Mouse support and 1 000-line scrollback per pane — no tmux dependency needed.
Run .vsh V scripts directly without manually compiling them first. Great for automation that needs performance without the ceremony of a full build.
Configure prompt colors via RGB values in ~/.vlshrc. Manage aliases at runtime or persist them in your config — all without restarting the shell.
POSIX
vlsh is not a POSIX-conformant shell, but it supports the commonly-used subset of POSIX features so that everyday scripts and muscle memory just work.
| Operator | Behaviour |
|---|---|
&& | Run next command only on success |
|| | Run next command only on failure |
; | Run next command unconditionally |
< | Redirect stdin from a file |
> | Redirect stdout, overwriting the file |
>> | Redirect stdout, appending to the file |
| Builtin | Description |
|---|---|
export / unset | Set or remove environment variables |
source / . | Execute a script in the current shell context |
cd | Change directory; supports ~, $HOME, and cd - |
exit | Exit the shell with an optional status code |
$? | Expands to the exit status of the last command |
Installation
Pre-built packages for Linux, or build from source in seconds.
# Download the latest .deb package from the releases page wget https://github.com/vlshcc/vlsh/releases/latest/download/vlsh_linux_amd64.deb # Install sudo dpkg -i vlsh_linux_amd64.deb # Add to valid login shells and set as default (optional) echo "/usr/local/bin/vlsh" | sudo tee -a /etc/shells chsh -s /usr/local/bin/vlsh
# Download the standalone binary (64-bit Linux) wget https://github.com/vlshcc/vlsh/releases/latest/download/vlsh_linux_amd64 chmod +x vlsh_linux_amd64 sudo mv vlsh_linux_amd64 /usr/local/bin/vlsh # Add to valid login shells and set as default (optional) echo "/usr/local/bin/vlsh" | sudo tee -a /etc/shells chsh -s /usr/local/bin/vlsh
# Requires V — https://vlang.io git clone https://github.com/vlshcc/vlsh cd vlsh v . sudo mv vlsh /usr/local/bin/vlsh # Add to valid login shells and set as default (optional) echo "/usr/local/bin/vlsh" | sudo tee -a /etc/shells chsh -s /usr/local/bin/vlsh
Plugins
The plugin system is the heart of vlsh's hackability. Install community plugins from the remote repository with a single command — plugins are versioned and stored under ~/.vlsh/plugins/<name>/<version>/. Plugins can:
plugins install
// Plugins implement main() and respond to argument tokens module main import os fn main() { arg := if os.args.len > 1 { os.args[1] } else { '' } match arg { 'capabilities' { println('prompt') } 'prompt' { branch := os.execute('git branch --show-current') if branch.exit_code == 0 { print(' (' + branch.output.trim_space() + ')') } } else {} } }
Shows the current branch and short commit hash in your prompt with configurable RGB colours.
Tab-completes SSH hostnames from ~/.ssh/config and known_hosts.
Browse V standard library docs in the terminal, fetched live from modules.vlang.io.
Tracks your emotional state across git commits to see how mood correlates with code quality.
A minimal, commented template — the perfect starting point for writing your first plugin.
Browse the full catalogue and contribute at github.com/vlshcc/plugins
| Command | Description |
|---|---|
plugins list | Show all locally installed plugins with their installed version |
plugins remote | List plugins in the remote repository with version info and available updates |
plugins search <query> | Search available plugins by name or description |
plugins install <name> | Download and install the latest semver version of a plugin |
plugins update [name] | Update one plugin or all installed plugins to their latest version |
plugins reload | Recompile and reload all plugins (run after install or update) |
plugins enable / disable <name> | Activate or deactivate a plugin without deleting it |
plugins enable / disable all | Activate or deactivate all plugins at once |
plugins delete <name> | Remove an installed plugin and its entire directory |