This is a Modula-2, Pascal and Oberon IDE built on Eclipse Theia (modula2-ide/).
All three languages get the same depth: syntax highlighting, snippets,
auto-uppercasing, outline / hover / go-to-definition / references / rename,
formatting, Build-Run tasks, GDB debug, and project wizards.
| Language | Files | Validators | Compiler | Debug type | Project file |
|---|---|---|---|---|---|
| Modula-2 | .mod/.def |
Coco/R gm2 grammar |
gm2 |
modula2 |
modula2.json |
| Pascal | .pas/.pp/.p |
8 Coco/R dialects | fpc, Blaise |
pascal |
pascal.json |
| Oberon | .Mod/.mod/.om (.def/.od) |
O07, Oberon-2, Ulm | voc, ulmo |
oberon |
oberon.json |
node --version # >=24
yarn --version # 1.x Classic
gm2 --version
fpc -iV
voc # prints its banner; ulmo likewise
gdb --version
Debian/Ubuntu: sudo apt install gm2 gdb binutils fp-compiler.
voc/ulmo come from their own distributions. Editing features
(hover, outline, rename, formatting) work without any compiler.
cd modula2-ide
yarn
yarn build
yarn start:browser # http://localhost:3000
# or
yarn start:electron
Standalone editor plugins (VS Code-compatible) ship as versioned zips:
modula2-language-*.zip, pascal-language-*.zip,
oberon-language-*.zip.
| Example | Project file | Main file |
|---|---|---|
examples/hello/ |
modula2.json |
src/Main.mod |
examples/hello-pascal/ |
pascal.json |
src/Main.pas |
examples/hello-oberon/ |
oberon.json |
src/Main.Mod |
pascal.json:
{
"name": "Hello",
"compiler": {"type": "fpc", "path": "fpc", "options": []},
"sourceDirectories": ["src"],
"main": "src/Main.pas"
}
oberon.json has the same shape with "type": "voc" (or "ulm")
and "main": "src/Main.Mod".
begin -> BEGIN, but beginning is left
alone). Oberon matching stays case-sensitive; Pascal is
case-insensitive.F12 go-to-definition, Shift+F12 references, F2
rename, Ctrl+Shift+O outline, Shift+Alt+F format.USES (Pascal), IMPORT (Oberon,
alias-aware) and IMPORT/FROM (Modula-2 .def files).mod/proc/if/defmod, Pascal
program/unit/proc/func, Oberon module/proc/func.Commands (via F1 / Ctrl+Shift+P):
Pascal: New Pascal Project / New Unit, Oberon: New Oberon Project / New Module,
Modula-2: New Modula-2 Project / New Module / New Definition ModulePascal / Oberon / Modula-2: Validate Project, About, theme commandsEach language has its own Project explorer view (right-click for
New Unit/Module Here, Build, Refresh).
With the project folder open in the workspace:
F1 > Pascal: Build — builds bin/<name> (fpc -M<dialect>,
dialect from modula2.pascal.dialect, default Free Pascal)Oberon: Build — runs voc (or ulmo) frontend check on the main moduleModula-2: Build — gm2 -fiso -gfpc -o bin/Hello src/Main.pas, voc src/Main.Mod,
gm2 -o bin/Hello src/Main.modBuild errors appear in Problems panel, click to jump to source.
-g/-gl).Run > Start Debugging, type pascal, oberon or modula2.
program defaults to bin/<name>.The example launch.json files set "preLaunchTask": "<Lang>: Build",
so debugging always builds first. You get: continue/step over/into/out,
call stack, Locals + Module scopes, hover/evaluate.
plugins/<lang>-language/ was synced
by yarn build:language.modula2.pascal.validators /
modula2.oberon.validators to the pilot binaries built by each
grammars/*/build.sh. Unconfigured dialects stay silent by design.fpc/voc not found: set "compiler": {"path": ...} in
pascal.json / oberon.json (or the *.compiler.path preference).program not found: run <Lang>: Build first.