micro-editor/micro · error
Unsupported operating system
Error message
Unsupported operating system
What it means
Constant-shaped error returned by RunTermEmulator in internal/action/terminal_unsupported.go, a file only compiled for plan9, nacl or windows (//go:build tag). The integrated terminal emulator requires a unix pty layer, so on these platforms the stub unconditionally returns this error for any attempt to run a terminal command. It is a build-time capability gate, not a runtime failure.
Source
Thrown at internal/action/terminal_unsupported.go:12
//go:build plan9 || nacl || windows
package action
import "errors"
// TermEmuSupported is a constant that marks if the terminal emulator is supported
const TermEmuSupported = false
// RunTermEmulator returns an error for unsupported systems (non-unix systems
func RunTermEmulator(input string, wait bool, getOutput bool, callback func(out string, userargs []any), userargs []any) error {
return errors.New("Unsupported operating system")
}
View on GitHub (pinned to 1c8b82b32e)
Solutions
- Before calling, branch on the exported constant action.TermEmuSupported (false exactly on these platforms) and skip or substitute
- On Windows, use the regular shell integration instead: ':shell'-style external shells or run commands via the sucmd/os layer rather than the internal emulator
- Run micro under WSL if the embedded terminal is a hard requirement
Example fix
// before
action.RunTermEmulator("ls -la", false, false, nil, nil) // panics UX on windows
// after
if !action.TermEmuSupported {
// fall back to non-interactive command execution
return errors.New("terminal emulator unavailable")
}
action.RunTermEmulator("ls -la", false, false, nil, nil) Defensive patterns
Strategy: type-guard
Validate before calling
// Capability check exported by the package
if !action.TermEmuSupported {
return errors.New("terminal emulator not available on this platform")
}
err := action.RunTermEmulator(cmd, false, false, cb, nil) Type guard
// Platform capability guard (constant is false on windows/plan9 builds)
func canRunTermEmulator() bool {
return action.TermEmuSupported
}
// Use it to narrow behavior:
if canRunTermEmulator() { runEmbedded() } else { runExternalShell() } Try / catch
err := action.RunTermEmulator(input, wait, getOut, cb, args)
if err != nil {
if err.Error() == "Unsupported operating system" {
// permanent for this build: disable the feature, don't retry
disableTermFeature()
return nil
}
return err
} Prevention
- Always branch on TermEmuSupported before any term-emulator code path
- Feature-detect once at plugin init and cache the result
- Remember this is compile-time determined: no runtime update fixes it, only a different platform
When it happens
Trigger: On Windows (or plan9), executing > term, running the 'term' command from a plugin/lua (RunTermEmulator is documented in runtime/help/plugins.md), or any code path that shells out through micro's built-in terminal pane.
Common situations: Cross-platform Lua plugins that call the term emulator without checking action.TermEmuSupported; users switching from Linux and expecting the same > term workflow; CI running micro on windows containers.
Related errors
AI-assisted analysis of micro-editor/micro@1c8b82b32e (2026-08-15).
Data as JSON: /api/errors/f8c107e0a9547885.
Report an issue: GitHub.