|
|
||
|---|---|---|
| .cargo | ||
| benches | ||
| queries | ||
| src | ||
| static | ||
| tests | ||
| ui | ||
| vendor/tree-sitter-toml | ||
| .gitignore | ||
| build.rs | ||
| Cargo.lock | ||
| Cargo.toml | ||
| installer.sh | ||
| LICENCE | ||
| MISSING-FEATURES.md | ||
| README.md | ||
| RULES.md | ||
Ehwaz
Ehwaz is a native code editor built in Rust with Slint. It focuses on speed, split-pane editing, strong keyboard workflows, and local-first tooling.
Current version: 0.0.5
Quick start
1) Prerequisites
- Rust stable toolchain (install with rustup)
- Optional:
ffplay(from FFmpeg) for Markdown audio/video playback
Install FFmpeg:
- Debian/Ubuntu:
sudo apt install ffmpeg - Fedora:
sudo dnf install ffmpeg - Arch:
sudo pacman -S ffmpeg - macOS (Homebrew):
brew install ffmpeg
2) Build and run
cargo build
cargo run
3) Install locally on Linux (optional)
cargo build --release
./installer.sh install
To update an existing local install:
cargo build --release
./installer.sh update
If the launcher icon was cached by your desktop, run ./installer.sh update again to rewrite the desktop entry with the full icon path.
Useful development commands:
cargo test
cargo test --test buffer
cargo test --test parser
cargo test --test markdown
cargo bench --no-run
Integration tests are grouped by domain under tests/ (buffer, parser, markdown).
Private implementation-focused unit tests may still remain colocated in src/ modules.
What you can do in Ehwaz
- Edit multiple files with tab reordering and close actions.
- Track unsaved tabs with an orange dot that clears automatically when the buffer matches the last saved state again.
- Split the editor into left/right panes and drag tabs across panes.
- Reorder explorer roots and move files/folders inside the explorer with drag and drop.
- Use project/file search and replace with optional regex mode and grouped project results.
- Select a whole word to highlight other exact matches in the active file.
- Work with Markdown preview (including tables, code blocks, and media links).
- Run directly runnable files from a draggable play/stop bar that opens the integrated terminal when a run starts.
- Use command palette actions for navigation, snippets, theme switching, tool setup, and richer LSP workflows.
- Use GitHub Copilot for multiline inline ghost-text completions, an inline chooser when LSP and Copilot disagree, and a right-side chat panel backed by the official Copilot CLI ACP server.
- Install and update LSP servers and formatters into local Ehwaz tool directories.
- Use syntax highlighting, code folding, bracket matching, indentation highlights, and ruler support.
Supported languages
Ehwaz currently includes syntax support and language tooling flows for:
- Rust
- Python
- JavaScript / TypeScript
- Vue
- HTML / CSS
- JSON / YAML / XML / TOML
- Dockerfile
- Bash
- Markdown
- OCaml
Runnable files
Ehwaz shows a small play/stop bar above the editor when the active file looks directly runnable. Starting a run opens the integrated terminal automatically, and the same bar can stop the running process.
Current runnable-file detection covers:
- Rust files with a
mainentrypoint - Python files with an
if __name__ == "__main__"entrypoint - JavaScript and TypeScript files with common Node-style entrypoint patterns
- Shell scripts (
.sh,.bash,.zsh, or matching shebangs) - OCaml
.mlfiles with alet () =entrypoint
First-time usage flow
- Open Ehwaz with
cargo run. - Open a project folder (
Alt+F). - Open files in the explorer.
- Open command palette (
Ctrl+P) and test:- file search
@symbolnavigation in the active file#queryworkspace symbol search:linenavigation~new_namerename at cursor- LSP actions such as definition, implementation, references, signature help, rename, and workspace symbols on saved files
- Open search (
Ctrl+F) or replace (Ctrl+H). - Split tabs with View -> Split Left or View -> Split Right.
- Open tools panel from the View menu to manage themes, formatters, and LSPs.
- Open a runnable file and use the play/stop bar to run it in the integrated terminal.
- Open Copilot -> Settings to enable Copilot chat/inline features, choose chat and inline models if needed, then use the command palette action GitHub Copilot: Open Chat.
Keyboard shortcuts
File and UI
| Shortcut | Action |
|---|---|
Ctrl+N |
New file |
Alt+O |
Open file |
Alt+F |
Open folder |
Ctrl+S |
Save file |
Ctrl+W |
Close active tab |
Ctrl+T |
Toggle terminal panel |
Ctrl+K |
Open configuration file |
Ctrl++ / Ctrl+= |
Increase UI/editor font size |
Ctrl+- |
Decrease UI/editor font size |
Editing
| Shortcut | Action |
|---|---|
Ctrl+Z |
Undo |
Ctrl+Shift+Z / Ctrl+Y |
Redo |
Ctrl+X |
Cut (selection, or current line if no selection) |
Ctrl+C |
Copy (selection, or current line if no selection) |
Ctrl+V |
Paste |
Tab |
Accept visible inline completion (or the selected inline chooser option), otherwise indent by tab size |
Enter |
Accept the selected inline chooser option |
Up / Down |
Switch inline chooser options when it is open |
Shift+Tab |
Outdent current line by tab size |
Esc |
Dismiss visible inline completion or chooser |
Ctrl+A |
Select all |
Ctrl+D |
Duplicate line |
Ctrl+Shift+K |
Delete line |
Ctrl+Enter |
Insert line below |
Ctrl+Shift+Enter |
Insert line above |
Ctrl+] |
Indent |
Ctrl+[ |
Outdent |
Ctrl+/ |
Toggle line comment |
Alt+Shift+R |
Format document (external formatter) |
Navigation and tools
| Shortcut | Action |
|---|---|
Ctrl+P |
Open command palette |
Ctrl+P, then @query |
Symbol navigation in active file |
Alt+G, then :<line> |
Go to line |
Ctrl+F |
Open search panel |
Ctrl+H |
Open replace panel |
Alt+Shift+H |
LSP hover |
Alt+Shift+C |
LSP completion hints |
Alt+Shift+D |
LSP go-to-definition |
Configuration
Ehwaz creates settings.json on first launch.
Missing fields fall back to defaults.
Settings file location
| OS | Path |
|---|---|
| Linux | ~/.config/ehwaz/settings.json |
| macOS | ~/Library/Application Support/ehwaz/settings.json |
| Windows | %APPDATA%\ehwaz\settings.json |
Common settings
{
"font_family": "monospace",
"font_size": 14.0,
"line_height": 22.0,
"letter_spacing": 0.0,
"cursor_width": "thin",
"tab_size": 4,
"max_column": 120,
"ruler_color": "#3a3a3a",
"ruler_width": 1.0,
"theme": "One Dark Pro",
"format_on_save": false,
"bracket_matching_highlight": true,
"indentation_rainbow_highlight": true,
"window_width": 1200,
"window_height": 800
}
Persistent UI/session data
Ehwaz stores recent files, explorer roots, expanded folders, and split-pane tab state in storage.json in the same config directory:
- Linux:
~/.config/ehwaz/storage.json - macOS:
~/Library/Application Support/ehwaz/storage.json - Windows:
%APPDATA%\ehwaz\storage.json
Recommended first-run settings
If you are starting from defaults, these are usually the most useful values to review first:
| Setting | Why it matters |
|---|---|
font_size |
Controls editor and panel readability |
line_height |
Improves text scanning comfort |
tab_size |
Keeps indentation style consistent across files |
max_column |
Enables a visual line-length guide |
theme |
Improves contrast and visual comfort |
format_on_save |
Automates formatting on save when tools are installed |
Themes
Built-in themes (22):
- One Dark Pro
- Dracula
- Monokai Pro
- Tokyo Night
- Ayu Dark
- GitHub Dark
- Night Owl
- Cobalt2
- Hagalaz
- Nauthiz
- Eihwaz
- Algiz
- Catppuccin Mocha
- Catppuccin Macchiato
- Catppuccin Frappe
- Catppuccin Latte
- One Light
- Solarized Light
- Sowilo
- Dagaz
- Berkano
- Ingwaz
LSP and formatter management
Ehwaz can install/update tools through command palette and tools panel actions. Installed tools live inside Ehwaz-owned local directories:
- LSP:
~/.config/ehwaz/lsp(Linux) - Formatters:
~/.config/ehwaz/formatters(Linux)
Install logs are written under each toolchain's logs/ directory.
Examples from command palette:
LSP: Install/Update rust-analyzer (Rust)LSP: Install/Update pyright (Python)Formatter: Install/Update rustfmt (Rust)Formatter: Install/Update prettier (TypeScript)
Formatter runs now start from a detected project/config root instead of the editor process cwd. That lets project-level formatter config files be picked up more reliably, including Python pyproject.toml, ruff.toml, rustfmt.toml, .prettierrc, taplo.toml, .editorconfig, and .ocamlformat when they exist for the current file.
Useful command palette queries:
@nameto jump to symbols in the active file#nameto search workspace symbols and open clickable results in the output tab:120to jump to line 120~new_nameto rename the symbol at the current cursor through LSPthemeto quickly switch color themeslsp/formatterto find tool actions quickly
Current LSP editor actions from the command palette include:
LSP: Hover at CursorLSP: Rename Symbol (~new_name)LSP: Go to DefinitionLSP: Go to ImplementationLSP: Find References(opens the output tab with clickable results)LSP: Signature HelpLSP: Completion Hints
Rename applies the returned workspace edit to affected files, refreshes clean open tabs, and refuses to overwrite unrelated dirty tabs.
Inline LSP completion ghost text is shown only when the cursor is at the end of the current identifier, which avoids overlaying suggestions on already-complete words.
On saved files with LSP support, holding Ctrl over a symbol that actually resolves through the active LSP now shows a small themed definition preview card, switches the cursor to a pointing hand, and keeps Ctrl + left-click wired to jump directly to that symbol definition.
LSP servers now start from a detected workspace root instead of the current file's parent directory, which improves cross-file resolution for registered servers like rust-analyzer, pyright, basedpyright, pylsp, and the JS/TS/Vue language servers. For Python workspaces, Ehwaz also auto-detects a local .venv and passes its interpreter path to the LSP when available.
GitHub Copilot integration
Ehwaz now includes a real Copilot integration slice:
- a top-level
Copilotmenu entry - a themed Copilot settings modal
- separate chat and inline model pickers in settings
- a command-palette action to open chat quickly
- inline Copilot ghost-text completions in the editor, including multiline suggestions
- a small chooser when LSP and Copilot return different inline completions
- a dedicated right-side Copilot chat panel
- live Copilot diagnostics in the settings modal and behind the status-bar GitHub/Copilot icon hover
The chat panel is backed by the official GitHub Copilot CLI ACP server. By default, Ehwaz starts:
copilot --acp --stdio
on the first chat prompt, then keeps that session alive for follow-up turns until you clear the panel.
To use it:
- Install the GitHub Copilot CLI so the
copilotcommand is available. - Authenticate the Copilot CLI with your GitHub account.
- Enable Copilot chat in Copilot -> Settings.
- Open GitHub Copilot: Open Chat from the command palette, or open it from the Copilot menu flow.
The command and argument fields in the Copilot settings modal are overrides. Leave them empty to use the official default launch command above. Chat and inline models are stored separately and each selector applies the Copilot CLI --model flag only for that feature. Leaving either selector at Use Copilot CLI default avoids adding --model for that path. If you edit settings.json directly, the current keys are copilot_chat_model and copilot_inline_model; older single-model configs migrate into the chat-model setting on load.
When Copilot completions are enabled, Ehwaz asks Copilot for a continuation at eligible cursor positions and renders it through the inline ghost-text overlay. Suggestions can span multiple lines. If Copilot and LSP both have inline suggestions and they differ, Ehwaz shows a small chooser near the cursor; use Up / Down to switch options, Tab or Enter to accept, and Esc to dismiss. If Copilot is unavailable for that moment, Ehwaz falls back to the existing local/LSP completion behavior when possible.
For safety, Ehwaz currently treats Copilot chat as a read-oriented assistant surface:
- tool and permission requests are denied by default
- transport or auth problems are surfaced in the panel status
- clearing the panel resets the local Copilot chat session
The bottom status bar also includes a GitHub/Copilot indicator with a hover card that summarizes chat/inline health, selected models, launch commands, resolved working roots, and the last reported issue.
Project structure (high level)
src/
main.rs app startup and wiring
app.rs core AppState and editor model
config.rs settings and storage management
command_palette.rs command palette logic
lsp_sync.rs LSP sync and UI updates
formatting.rs formatter integration
tools_panel.rs tools panel actions and data
ui/handlers/ keyboard/mouse/file/tab/explorer handlers
ui/
main.slint window composition
editor.slint editor component
search_panel.slint search/replace UI
tools_panel.slint themes/formatter/LSP panel UI
terminal_pane.slint terminal and output panel UI
tests/
buffer.rs buffer domain integration suite entrypoint
parser.rs parser domain integration suite entrypoint
markdown.rs markdown domain integration suite entrypoint
Troubleshooting
- If media controls fail in Markdown preview, check
ffplay -version. - If LSP/formatter install fails, inspect logs in:
~/.config/ehwaz/lsp/logs/~/.config/ehwaz/formatters/logs/
- If Copilot chat or inline completions stay unavailable, verify that
copilot --helpworks in your shell and that the Copilot CLI is already authenticated. Then hover the GitHub/Copilot status-bar icon to inspect the separate chat/inline launch details and the last reported issue. - If UI font size becomes too large/small, edit
font_sizeinsettings.json. - If syntax highlighting looks stale after heavy edits, save and reopen the file to force a clean refresh.