Visual Studio Code support for the Mio programming language
Mio project ·
Language reference ·
Releases
Mio is a statically typed programming language with Japanese romaji keywords,
a Mochi bytecode toolchain, and the modular Bunko standard library. This
extension brings .mio files into VS Code with syntax highlighting, editor
conventions, snippets, MioCore language server diagnostics, and Mio CLI
commands.
The extension works without the Mio CLI for basic editing. CLI features are
enabled automatically when mio (or mio.exe) is available on PATH, or when
mio.executablePath points to a Mio executable.
Syntax preview
Dark theme:

Light theme:

These preview images are generated from the extension's TextMate scope palette.
See docs/images/README.md for how to replace them with
real editor screenshots.
Features
- TextMate syntax highlighting for the current Mio language version (V0.5,
as used by Mio
1.0.0-beta.1):
- keywords:
kaku, waza, moshi, sore, aida, kaesu, nukeru,
tsuzuku, yobu, kata, sentaku, awase, baai, koukai, teisu
hai, iie, and mu
- built-in types: fixed-width integers,
float32, float64, rune, bool,
string, unit, resource, Map, and the numeric constraints
Number, Integer, Signed, Float
- function declarations and calls, closures, parameters, struct fields, enum
variants, match arms, generic declarations and applications, imports,
arrays, numbers, strings, runes, comments, and operators
- keywords inside ordinary strings and comments are not highlighted
- Language configuration: auto-closing and surrounding pairs, bracket
matching,
// and /* ... */ comments, indentation rules, region markers,
a Mio-aware word pattern, and brace/comment folding.
- Snippets for variables, constants, functions, closures, generics,
conditionals,
aida loops, nukeru/tsuzuku, returns, imports, structs,
enums, exhaustive awase matches, arrays, Map, nullable values, and runes.
- Mio CLI commands:
Mio: Check Current File
Mio: Run Current File
Mio: Build Current File
Mio: Show Compiler Version
Mio: Open Output
- MioCore language server launched from the Mio CLI (
mio lsp) through
vscode-languageclient. It publishes compiler diagnostics for open buffers,
including unsaved text, with document versioning, incremental edits,
cancellation, and UTF-8 byte offset to VS Code UTF-16 position mapping.
- CLI fallback diagnostics from
mio check --format=json when the language
server is disabled, unavailable, or stopped. Only one diagnostic source is
active at a time.
- Safe process execution: every CLI call uses an argument array with
shell: false; paths containing spaces, Chinese, or Japanese are passed
through unchanged.
- Bilingual README and a 128×128 Marketplace icon derived from the project's
language logo.
Installation
From a VSIX (0.2.0)
code --install-extension mio-language-support-0.2.0.vsix
Then reload VS Code and open any .mio file.
From source
cd editors/vscode
npm ci
npm run compile
npx vsce package
code --install-extension mio-language-support-0.2.0.vsix
The extension is not published to the Visual Studio Marketplace yet. The
publisher field is a placeholder derived from the project's GitHub
organization; see PUBLISHING.md before publishing.
- macOS (Apple Silicon and Intel)
- Windows (x64 and ARM64)
- Linux (x64 and ARM64)
The extension itself is platform-neutral. The Mio CLI must match your platform.
Mio CLI configuration
Build the CLI from the Mio repository:
go build -o mio ./cmd/mio
./mio version
Put mio on PATH (or mio.exe on Windows), or configure an absolute path.
The extension does not scan the workspace for a Mio binary; it only uses the
configured path or PATH.
| Setting |
Default |
Description |
mio.executablePath |
"" |
Absolute path to the Mio CLI. Empty means search PATH for mio / mio.exe. ~ is expanded. |
mio.languageServer.enabled |
true |
Launch the MioCore language server with mio lsp. When false or unavailable, diagnostics fall back to mio check. |
mio.diagnostics.enabled |
true |
Show diagnostics. The language server provides them while it runs; otherwise mio check --format=json is used. |
mio.diagnostics.onSave |
true |
Fallback only: run mio check after saving a .mio file (350 ms debounce). |
mio.outputDirectory |
"" |
Output directory for mio build. Empty writes the .mochi file next to the source. Supports ${workspaceFolder}. |
mio.languageVersion is intentionally not exposed: the current Mio CLI has
no language-version flag. The grammar and snippets target the V0.5 keyword set
used by the current toolchain. See the version table below.
Bunko standard library
mio check and mio run need the Bunko root when a file imports kiso/....
The extension reuses the CLI's lookup rules:
MIO_BUNKO from the environment, if it points to a directory.
- The nearest
bunko/ directory above the source file.
If you keep Bunko outside the project, set MIO_BUNKO in the environment that
launches VS Code.
Commands
| Command |
Palette title |
Requires Mio CLI |
mio.checkCurrentFile |
Mio: Check Current File |
Fallback only |
mio.runCurrentFile |
Mio: Run Current File |
Yes |
mio.buildCurrentFile |
Mio: Build Current File |
Yes |
mio.showCompilerVersion |
Mio: Show Compiler Version |
Yes |
mio.openOutput |
Mio: Open Output |
No |
Run and build save a dirty .mio buffer first. Manual Check Current File
checks the in-memory text without forcing a save by copying the package's
.mio files to a temporary directory. While the language server is running,
diagnostics come from mio lsp, so the command reports that instead of
starting a duplicate CLI check.
If the CLI is missing, the extension shows a guidance message with Open
Settings and Installation Guide actions. Syntax highlighting and snippets
continue to work.
Mio language versions
Keyword gates are copied from internal/token/token.go; the current Mio CLI
loader uses token.V05 (internal/bunko/program.go).
| Version |
Added keywords / syntax |
| V0.1 |
kaku, waza, moshi, sore, kaesu, hai, iie, mu |
| V0.2 |
aida, nukeru, tsuzuku |
| V0.3 |
yobu |
| V0.4 |
kata, sentaku, awase, baai |
| V0.5 |
koukai, teisu |
The extension targets V0.5. It does not treat a V0.4-only keyword as valid in a
V0.1 program because the plugin has no per-file version switch; such a switch
would require a real CLI flag.
Current scope
- Syntax highlighting, language configuration, snippets, folding, the MioCore
language server, and the five CLI commands described above.
- Diagnostics come from
mio lsp. The server reuses Mio's Lexer, Parser,
Resolver, and TypeChecker, analyzes unsaved buffers through an in-memory
overlay, applies incremental edits, validates document versions, supports
$/cancelRequest, and maps compiler byte offsets to UTF-16 positions.
- The compiler pipeline stops at the first error, so each analysis publishes at
most one diagnostic. Package/import failures without a source position are
shown at the start of the file with an explicit note instead of a guessed
range.
- When the server is disabled, missing, or stops, the extension falls back to
mio check --format=json and clears the other diagnostic collection, so the
Problems panel never shows both sources at once.
- Semantic navigation (hover, go-to-definition, find references, document and
workspace symbols, rename, signature help, semantic tokens) is not
implemented yet; it is the next milestone. The extension does not register
regex-based fake providers. See docs/LSP_PLAN.md.
- No debugger, test explorer, formatter, or Marketplace publication.
Known limitations
- Both the language server and the CLI fallback stop at the first compiler
error; the Problems panel therefore shows at most one Mio diagnostic per
analysis.
- Semantic navigation (hover, definition, references, document symbols) is not
available yet.
- Import/package errors without a source position are shown at the start of the
current file and include the reported file path in the message.
- Windows
.cmd / .bat launchers are not executed. Configure the native
mio.exe instead; this keeps process execution shell-free.
mio.outputDirectory only affects mio build; mio run always runs the
source file.
- The Marketplace publisher ID is not finalized. See
PUBLISHING.md.
Development
npm ci
npm run compile
npm run lint
npm test
npx vsce package
npm run check:vsix
npm test first runs Node-based unit tests (manifest, grammar scopes,
diagnostics mapping, CLI resolution, process runner, language server launch
options), then launches a VS Code Extension Host through @vscode/test-electron
for activation, language ID, command registration, snippets, folding,
language-server diagnostics, CLI fallback, missing-CLI, and
space/Chinese/Japanese path tests.
The pretest step builds cmd/mio into editors/vscode/.test-tmp/ when Go is
available. If Go is not installed, real-CLI integration tests are skipped with
an explicit marker; the extension itself has no Go dependency.
License and artwork
The plugin code is MIT-licensed; see LICENSE. The icon is a 128×128
RGBA conversion of the JetBrains Marketplace icon
editors/jetbrains/src/main/resources/META-INF/pluginIcon.svg (using its
embedded PNG artwork), not the icons/mio.svg file-type mark. Other Mio/Mochi
character illustrations under assets/mascot/ are not bundled because
their license is separate from the MIT-licensed code. See
NOTICE.md.
Links
| |