Skip to content

Shells & Workspaces

The plugin enumerates every shell it can find on the machine and offers them in the shell picker. The list is refreshed on demand (it is cached for a minute), so a shell you install while the editor is open shows up without a restart. Nothing is configured by hand unless you want it to be.

Shell Where it looks
PowerShell One entry. PowerShell 7 (pwsh.exe) is preferred, probing Program Files\PowerShell\7, the x86 equivalent, the Microsoft Store WindowsApps path, ~\.dotnet\tools, Scoop, and PowerShell\7-preview. Windows PowerShell (System32\WindowsPowerShell\v1.0) is used only when no pwsh exists.
Command Prompt System32\cmd.exe
Git Bash Program Files\Git\bin, ProgramW6432, the x86 path, LocalAppData\Programs\Git (bin and usr\bin), and Scoop (git and git-with-openssh)
WSL distributions wsl.exe -l -q, one profile per distribution, labelled <Distro> (WSL). Requires Windows build 19041+. docker-desktop distributions are filtered out.
Cygwin %HOMEDRIVE%\cygwin64\bin\bash.exe, then cygwin
MSYS2 %HOMEDRIVE%\msys64\usr\bin\bash.exe

On POSIX platforms (retained in source for a future release) it detects $SHELL, /bin/bash, /bin/zsh and /usr/bin/fish.

Every external probe (wsl -l -q, the psmux and tmux checks) is guarded by a three-second deadline, so a hung tool cannot stall the editor.

Shell commands are normalised before launch so the shell stays open instead of exiting immediately:

  • PowerShell / pwsh get -NoLogo -NoExit appended if -NoExit is not already present, plus a small -Command that switches $PSStyle to ANSI output rendering — unless you supplied your own -Command, in which case yours wins.
  • cmd.exe gets /Q /K unless you already passed /K or /C.
  • Anything else is left exactly as you wrote it.

Paths are quoted and normalised to backslashes for CreateProcessW, so a setting written as C:/Tools/mybash.exe works fine.

The settings page shows a single Default Shell dropdown listing the detected shells; it stores the shell’s label (the factory default is PowerShell). The underlying DefaultShellWindows property also accepts an executable name or a full command line, arguments included, through SetTerminalSetting or the ini:

pwsh
C:\Program Files\Git\bin\bash.exe --login -i
"C:\Program Files\PowerShell\7\pwsh.exe" -NoLogo -NoExit

Matching is forgiving: a label, an exact command, a path with either slash style, a bare executable name, or a substring all resolve. If the value is empty, new sessions use Command Prompt. If the named shell fails to start, the plugin launches cmd.exe instead and prints a warning in the pane rather than failing the session.

New sessions start according to Working Directory Policy:

Policy Starts in
Project Root (default) Your .uproject directory
Engine Root The engine install directory
Custom The path in Custom Working Directory (relative paths are resolved to absolute)

If a custom path is missing or unreachable, the session quietly reverts to Project Root rather than failing to start.

Each session runs in one of three workspace modes, chosen from the shell picker: a plain shell row, or the same shell marked (PSMux) or (tmux).

One plain shell process per session. No multiplexer, nothing extra running, nothing to install.

When you close the editor the process ends. On restart, the plugin recreates the session record — same shell, same tab, same split layout — but the shell itself is freshly spawned, so anything that was running in it is gone.

This is the default and it is the right choice for most people.

psmux is a Windows-native, PowerShell-based multiplexer. In this mode the plugin wraps your shell in a named psmux workspace. Because psmux owns the process rather than the editor, the shell keeps running when the editor closes and re-attaches when you open it again — an agent mid-task survives an editor restart.

psmux transparently wraps any Windows child process, so it works with cmd, PowerShell, pwsh and Git Bash.

Workspaces are given a random railway-flavoured name — freight, whistle-stop, marshalling — unique across everything the plugin and psmux already know about. That name is the psmux session id, the label in the session picker, and the key the layout is persisted under; you can rename it.

Because psmux owns the layout inside a workspace, the split buttons are hidden for psmux sessions and you use psmux’s own prefix bindings (default Ctrl+B) instead. The ? button in the top bar shows a cheat sheet.

Workspaces you started outside the editor appear in the session picker under External PSMux Workspaces; pick one to attach to it.

For WSL profiles the multiplexer has to live inside the distribution, so those use tmux rather than psmux. The workspace is owned by the tmux server inside the distro, sessions survive editor restarts, and it behaves like an ordinary *nix tmux session in every other respect. New tmux sessions are sized to the pane and run the distro’s login shell, so your rc files apply.

The plugin never writes to your shell profile. Not .bashrc, not your PowerShell $PROFILE, not .zshrc — not even a transient, opt-in edit.

This is deliberate and it is not going to change. Nothing the plugin does persists on your machine in a way that would need uninstalling, and no shell-integration script can rot out from under you when your shell updates. The cost is that a few tricks other terminals do with shell hooks are not available here; the benefit is that removing the plugin removes the plugin.