It helps others discover the project and motivates continued development.
A console-based .NET IDE built on SharpConsoleUI.
Edit. Build. Ship.
Sometimes you just want to stay in the terminal. Install it as a dotnet tool, and you get C# IntelliSense, git, build, test, and a shell — zero config, works anywhere you have a console.
- LSP IntelliSense — completions, go to definition, rename, code actions, diagnostics
- Multi-tab editor — syntax highlighting for C#, JSON, XML, YAML, JS/TS, Razor, and more
- Built-in terminal — full PTY shell in tabs, bottom panel, or side panel
- Git integration — stage, commit, push, pull, diff, blame, branch management
- Build & test — one-key build/run/test with click-to-navigate errors
- Zero config — just
dotnet tool installand go
For the full feature list, see Features below.
dotnet tool install --global LazyDotIDE
lazydotide /path/to/your/projectOr from source:
git clone https://github.com/nickprotop/lazydotide.git
cd lazydotide
dotnet run -- /path/to/your/projectRun without arguments to open in the current directory.
- Multi-tab editing with dirty tracking and unsaved-changes prompts
- Syntax highlighting for 12+ languages (C#, JSON, XML, YAML, Markdown, HTML, CSS, JavaScript/TypeScript, Razor, Dockerfile, Solution files, Diff)
- Manual syntax override via menu
- Find and replace (
Ctrl+F/Ctrl+H) - Word wrap modes (no wrap, word wrap, char wrap)
- Binary file detection (shown as non-editable)
- External file change detection with reload prompt
- Auto-completions triggered on
.,(,,, and after typing (alsoCtrl+Space) - Go to definition (
F12), go to implementation (Ctrl+F12), find all references (Shift+F12) - Rename symbol across files (
Ctrl+F2) - Code actions (
Ctrl+.) - Format document (
Alt+Shift+F) - Hover / type info (
Ctrl+K) - Signature help (
F2, auto-triggers on(and,) - Real-time diagnostics (errors/warnings in status bar and problems panel)
- Document symbols in side panel (
Alt+O) - Navigation history with navigate back (
Alt+Left)
- Stage, unstage, commit, push, pull, stash (with message), stash pop
- Branch listing, create branch, switch branch
- Diff (working directory, staged, full)
- Blame (per-line: SHA, author, date)
- Repository log and per-file log with commit detail view
- Gutter diff markers in editor (green/yellow/red for added/modified/deleted)
- Real-time status bar (branch, ahead/behind, M/A/D counts)
- Explorer badges per file (
M,A,D,U,R,!,I) - Gitignore support (add/remove paths, dimmed display in explorer)
- Discard changes
- Source control side panel with interactive staged/unstaged file list
- Build (
F6), test (F7), clean, run (F5) with colorized output - Stop running process (
F4) - Problems panel with click-to-navigate on build errors/warnings
- Auto-detects
.csproj,.fsproj,.slnbuild targets
- Bottom shell in output panel (
F8) - Editor tab shell (via menu)
- Side panel shell (
Shift+F8) - Full PTY support for interactive programs
- Multiple concurrent shell instances
- Tree view with expand/collapse
- Git status badges and directory change indicators
- Gitignore dimming for ignored files
- Context menus (new file/folder, rename, delete, git operations)
- File watcher for automatic refresh on external changes
- LazyNuGet integration (
F9) when installed - Built-in add package dialog as fallback
Saved to .lazydotide.workspace in the project root on exit, restored on startup:
- Open files with cursor positions
- Panel visibility and column widths
- Split ratios and word wrap mode
- Explorer expanded nodes and selected path
Configure external tools in config.json — each tool appears in the Tools menu and command palette with options to open in a tab, bottom shell, or side panel.
Ctrl+P opens a searchable palette of all commands, organized by category (File, Edit, Build, Run, View, Git, LSP, Terminal, NuGet, Tools, Help). Custom tools are included dynamically.
| Key | Action |
|---|---|
Ctrl+S |
Save current file |
Ctrl+W |
Close current tab |
Ctrl+N |
New file |
Ctrl+Shift+N |
New folder |
F2 |
Rename (explorer focused) |
Delete |
Delete (explorer focused) |
Alt+Shift+R |
Reload file from disk |
Alt+F4 |
Exit |
| Key | Action |
|---|---|
F5 |
Run project |
F6 |
Build |
F7 |
Run tests |
F4 |
Stop |
| Key | Action |
|---|---|
Ctrl+B |
Toggle file explorer |
Ctrl+J |
Toggle output panel |
Alt+; |
Toggle side panel |
Ctrl+P |
Command palette |
| Key | Action |
|---|---|
Ctrl+F |
Find / Replace |
Ctrl+H |
Find / Replace |
| Key | Action |
|---|---|
Ctrl+Space |
Show completions |
F12 |
Go to definition |
Ctrl+F12 |
Go to implementation |
Shift+F12 |
Find all references |
Ctrl+F2 |
Rename symbol |
Ctrl+. |
Code actions |
Ctrl+K |
Hover / type info |
F2 |
Signature help |
Alt+Shift+F |
Format document |
Alt+O |
Document symbols |
Alt+Left |
Navigate back |
| Key | Action |
|---|---|
Alt+G |
Source control panel |
Ctrl+Enter |
Commit |
| Key | Action |
|---|---|
F8 |
Shell in output panel |
Shift+F8 |
Shell in side panel |
F9 |
LazyNuGet (or NuGet dialog) |
| Language | Extensions |
|---|---|
| C# | .cs |
| JSON | .json |
| XML | .xml, .csproj, .fsproj, .vbproj, .props, .targets |
| YAML | .yml, .yaml |
| Markdown | .md |
| HTML | .html, .htm |
| CSS | .css |
| JavaScript / TypeScript | .js, .jsx, .mjs, .cjs, .ts, .tsx, .mts, .cts |
| Razor | .razor, .cshtml |
| Dockerfile | Dockerfile, Dockerfile.* |
| Solution | .sln |
| Diff | (used in git diff views) |
Syntax can be manually overridden via the Edit menu.
Config file location:
- Linux/macOS:
~/.config/lazydotide/config.json - Windows:
%APPDATA%\lazydotide\config.json
A default config is created on first run. Edit it via Tools > Edit Config — changes reload automatically on save.
{
"lsp": null,
"tools": [
{
"name": "htop",
"command": "htop",
"args": null,
"workingDir": null
},
{
"name": "Lazygit",
"command": "lazygit",
"args": null,
"workingDir": null
},
{
"name": "Git Log",
"command": "bash",
"args": ["-c", "git log --oneline --graph --all --color=always; exec bash"],
"workingDir": null
}
]
}Each tool entry has:
name— display name in menus and command palettecommand— executable to runargs— optional argument arrayworkingDir— optional working directory (null = project root)
Set the lsp field to use a specific language server:
{
"lsp": {
"command": "csharp-ls",
"args": []
}
}LazyDotIDE auto-detects a C# language server in this order:
lspfield inconfig.jsonDOTNET_IDE_LSPenvironment variablecsharp-lsin PATH- OmniSharp in known locations (
~/.omnisharp/,/opt/omnisharp/) OmniSharpin PATH
Recommended: install csharp-ls:
dotnet tool install --global csharp-ls- .NET 10.0
- A terminal that supports ANSI escape codes
- Optional:
xclip,xsel, orwl-copy/wl-pastefor clipboard support on Linux
LazyDotIDE is in active early development. It works and is used daily, but expect rough edges. Contributions, feedback, and bug reports are welcome.
SharpConsoleUI — a console windowing and UI framework for .NET.
