Ehwaz is a native code editor built in Rust with Slint. https://github.com/rdenadai/ehwaz
Find a file
2026-03-19 20:12:06 +00:00
.cargo feat: improve editor, search, themes, and terminal UX 2026-02-17 00:52:50 -03:00
benches Implement second-pass CODE_REVIEW improvements 2026-02-20 00:52:50 -03:00
queries feat: improve LSP UX and cursor ligature handling 2026-02-18 18:56:49 -03:00
src Expand Copilot integration and editor polish 2026-03-19 11:09:14 -03:00
static Expand Copilot integration and editor polish 2026-03-19 11:09:14 -03:00
tests feat: Improvements-v0.0.5 2026-03-10 14:51:56 -03:00
ui Expand Copilot integration and editor polish 2026-03-19 11:09:14 -03:00
vendor/tree-sitter-toml Add syntax highlighting for more formats 2026-02-07 11:37:22 -03:00
.gitignore chore: expand tests and update docs 2026-02-24 20:56:13 -03:00
build.rs feat: Improvements for intaller 2026-03-06 08:56:50 -03:00
Cargo.lock refactor: Introduce static theme registry 2026-03-11 08:36:33 -03:00
Cargo.toml refactor: Introduce static theme registry 2026-03-11 08:36:33 -03:00
installer.sh feat: Improvements on highlight 2026-02-25 08:12:09 -03:00
LICENCE feat: Improvements-v0.0.5 2026-03-10 14:51:56 -03:00
MISSING-FEATURES.md Enhance LSP UX and project-aware tooling 2026-03-11 20:09:49 -03:00
README.md Expand Copilot integration and editor polish 2026-03-19 11:09:14 -03:00
RULES.md Expand Copilot integration and editor polish 2026-03-19 11:09:14 -03:00

Ehwaz Logo

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 main entrypoint
  • 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 .ml files with a let () = entrypoint

First-time usage flow

  1. Open Ehwaz with cargo run.
  2. Open a project folder (Alt+F).
  3. Open files in the explorer.
  4. Open command palette (Ctrl+P) and test:
    • file search
    • @symbol navigation in the active file
    • #query workspace symbol search
    • :line navigation
    • ~new_name rename at cursor
    • LSP actions such as definition, implementation, references, signature help, rename, and workspace symbols on saved files
  5. Open search (Ctrl+F) or replace (Ctrl+H).
  6. Split tabs with View -> Split Left or View -> Split Right.
  7. Open tools panel from the View menu to manage themes, formatters, and LSPs.
  8. Open a runnable file and use the play/stop bar to run it in the integrated terminal.
  9. 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

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:

  • @name to jump to symbols in the active file
  • #name to search workspace symbols and open clickable results in the output tab
  • :120 to jump to line 120
  • ~new_name to rename the symbol at the current cursor through LSP
  • theme to quickly switch color themes
  • lsp / formatter to find tool actions quickly

Current LSP editor actions from the command palette include:

  • LSP: Hover at Cursor
  • LSP: Rename Symbol (~new_name)
  • LSP: Go to Definition
  • LSP: Go to Implementation
  • LSP: Find References (opens the output tab with clickable results)
  • LSP: Signature Help
  • LSP: 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 Copilot menu 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:

  1. Install the GitHub Copilot CLI so the copilot command is available.
  2. Authenticate the Copilot CLI with your GitHub account.
  3. Enable Copilot chat in Copilot -> Settings.
  4. 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 --help works 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_size in settings.json.
  • If syntax highlighting looks stale after heavy edits, save and reopen the file to force a clean refresh.

License

MIT — https://git.rdenadai.dev/rdenadai/ehwaz