A lightweight, cross-platform text editor inspired by Notepad++, written in Rust. Notepad++ feel, AI features optional, no bloat.
Status: v0.0.5. The core editor and Beyond section have shipped. Word wrap
- horizontal scrollbar, show whitespace, full-screen (F11), bracket matching, auto-indent, syntax-aware comment toggle (24 langs), drop-to-open, recent files, tab drag-reorder, per-window placement persistence, multi-click selection (word/line/all), per-buffer EOL + encoding toggles, Replace All single-undo, user-customisable Shortcut Mapper, in-window right-click context menu, column/multi-cursor edit, macro record / replay, plugin host, session restore, and large-file streaming reads have all landed. Currently in flight: Notepad++ behavior parity and correctness audit, including remaining completion and IME edge cases, focus bugs, large-edit performance, search macro replay, and menu gaps. Regex capture replacement has landed with bounded background planning; see its documented syntax and limits. Manual large line indentation and its Undo/Redo also prepare in the background, with Escape cancellation and one Undo per completed edit. This includes costly annotations and a few very long selected lines. Post-edit and streamed-file completion syntax highlighting run in background workers, with per-tab coalescing and bounded output. Syntax size limits use the Rope byte count before allocating a full text copy. Restored-session syntax parsing starts after the window mounts, prioritizes the active document, and refills a bounded background queue. Session file reads, decoding, rich-document imports and history restoration run in the startup background request before editor registration. Session metadata loading still runs in foreground. Recovery identities use the same worker; recovered documents keep independent backup IDs and closed-tab history. Reload also reads and parses in background, keeping the original document editable and rejecting results after intervening edits or cancellation. Find All in the current Doc View captures live formatted text incrementally, matches in background and rejects stale result navigation. Large captures yield between bounded turns and stop feeding when the worker queue is full. Native completion latency and broader search performance still need testing. Local English spelling and grammar checking now marks Normal Text and Markdown Source View with wavy underlines and right-click corrections. Links and code are excluded; see scope and limits. Save All now includes modified untitled documents with sequential Save As dialogs and an Always Yes confirmation option. Save and close prompts reject replies after the requesting tab is restored or its window accepts closure.
Optional API completion definitions supply language names for Function Completion and signatures for parameter hints, including the active argument and overload navigation.
- Lightweight — small binary, fast cold start, low memory.
- Cross-platform — macOS, Linux, Windows.
- Familiar — Notepad++-style UX: tabs, find/replace, encoding/EOL toggles, syntax highlighting, plugin-friendly.
- Open source — Apache-2.0.
gpui— the GPU-accelerated UI framework from Zed Industries (Apache-2.0). Notepad Studio uses gpui as a UI library; all editor logic, layout, buffer handling, file I/O, and UX are original to this project.ropey— rope data structure for the text buffer.rfd— native file dialogs.regex— find/replace engine (literal escape, whole-word\b, and full regex modes).dirs— platform-correct config / log paths.serde+toml— settings persistence.
| Platform | Status | Notes |
|---|---|---|
| macOS | tested daily | Native menu bar, dock-icon reopen, traffic-light position. Default line ending: LF. |
| Linux | builds | X11 / Wayland via gpui's defaults. Default line ending: LF. Last-window-close exits the app. |
| Windows | builds | Default line ending: CRLF. Last-window-close exits the app. File ▸ Exit and Alt+F4 both work. |
Keybindings register Cmd-* and Ctrl-* variants together so the same source builds
across all three platforms — only the active modifier fires per OS. Word-jump
also accepts Alt-arrow (macOS convention) alongside Ctrl-arrow (Notepad++).
Crash reports land in ~/Library/Logs/Notepad Studio/panic.log (macOS),
$XDG_STATE_HOME/Notepad Studio/panic.log (Linux), or
%LOCALAPPDATA%\Notepad Studio\Logs\panic.log (Windows).
Download a prebuilt binary from the Releases page. Each release ships one artifact per platform:
| Platform | Artifact | Contents |
|---|---|---|
| macOS (Apple Silicon) | Notepad-Studio-macos-arm64.zip |
Notepad Studio.app |
| macOS (Intel) | Notepad-Studio-macos-x86_64.zip |
Notepad Studio.app |
| Linux x86_64 | Notepad-Studio-linux-x86_64.tar.gz |
notepad-studio binary |
| Windows x86_64 | Notepad-Studio-windows-x86_64.zip |
notepad-studio.exe |
All assets (icons, themes) are embedded in the binary, so the Linux and Windows artifacts are just the standalone executable — no extra files to keep alongside it.
macOS Gatekeeper note: the
.appis not signed or notarized yet, so the first launch is blocked by Gatekeeper. Either right-click the app → Open (then confirm once), or clear the quarantine flag after moving it to/Applications:xattr -dr com.apple.quarantine "/Applications/Notepad Studio.app"
cargo build # debug build
cargo run # build + run (debug)
cargo build --release # optimised build
cargo run --release # build + run (optimised)
cargo check # type-check only, no binarygpui is vendored in-repo under vendor/gpui, so the project is
fully self-contained — nothing is fetched or downloaded for it. The first build
compiles the vendored gpui from source (a few minutes); subsequent builds are
fast.
Release builds (cargo bundle) carry the app icon automatically. Regenerating
icons from new source art → docs/icons.md.
- Window opens, native menu bar, dark theme, status bar
- Stubbed actions (File / Edit / View / Help)
- Rope-backed read-only buffer renders line-by-line with gutter
- Custom
EditorElementwith shaped lines and selection paint - Click + drag to select; shift-click to extend selection
-
Cmd/Ctrl-Aselect all,Cmd/Ctrl-Ccopy via system clipboard -
FocusHandle, key context, IBeam cursor over the editor - Light + Dark theme with
View ▸ Toggle Theme(Cmd/Ctrl-Shift-T)
-
EntityInputHandler— OS / IME text routes into the rope buffer - Backspace, Delete, Enter, Tab (4 spaces, configurable)
- Arrow keys, Home/End, Cmd+Home/End, Cmd+Up/Down for doc bounds
- Alt+Left/Right and Ctrl+Left/Right for word boundaries
- Shift-extend variants on every movement
- Sticky desired column for vertical movement
- Caret blinks every 500ms via
gpui::Timertask; resets on activity - Cut (Cmd+X), Paste (Cmd+V) wired to system clipboard
- Linear undo / redo stacks (Cmd+Z, Cmd+Shift+Z, Ctrl+Y)
- Dirty bit reflected in the title bar (● prefix)
- Mouse drag keeps selecting when the cursor leaves the window
-
File ▸ New Window(Cmd/Ctrl+Shift+N) and macOS dock-icon reopen - Ctrl- variants for every Cmd- chord; Linux/Windows-friendly defaults
-
QuitMode::Default— macOS stays alive on last window close, Linux/Windows exit -
File ▸ Exitmenu entry alongside the macOSQuit - OS-aware line endings — CRLF default on Windows, LF elsewhere
- Panic hook writes timestamped reports to a platform-correct log dir
- Window placement persisted to
<config>/Notepad Studio/window.toml
- Multi-tab buffers — switchable buffers in one window with a top tab strip
-
Cmd/Ctrl-Nopens a new empty tab;Cmd/Ctrl-Wcloses the active tab -
Ctrl-Tab/Ctrl-Shift-Tabcycle tabs (MRU order, MRU tracking deferred) -
Ctrl-PageDown/Ctrl-PageUpcycle tabs in visual order -
Cmd/Ctrl-1..Cmd/Ctrl-9jump directly to tab N -
Cmd/Ctrl-Shift-Wcloses every tab; one fresh blank tab is left behind -
Cmd/Ctrl-Shift-Trestores the most recently closed tab (last 20) - Closing the last tab in a window closes the window
- Theme toggle moved to menu only (free for Notepad++ parity)
- File ▸ Open via
rfd— loads into the active empty tab or a new tab, detects LF / CRLF / CR - File ▸ Save (
Cmd/Ctrl-S) and Save As (Cmd-Shift-Smac,Ctrl-Alt-SLinux/Win) - File ▸ Save All (
Cmd-Opt-Smac,Ctrl-Shift-SLinux/Win) - Dirty-prompt on close-tab and Close All — Save / Don't Save / Cancel
- Window title and tab strip sync to active tab's file path and dirty bit
- Drop-to-open: drag a file onto the window (opens a new tab)
- File ▸ Recent Files (persistent MRU, capped at 10,
<config>/Notepad Studio/recent.toml) - Per-window placement persistence (replaces the v0.0.3 single-slot file)
- Tab drag-reorder
- View ▸ Tab — numbered/first/last/next/previous selection, reordering and colors; rebindable commands
- Find bar with incremental search (
Cmd/Ctrl-F) - Find Next / Find Previous (
F3/Shift+F3, alsoEnter/Shift+Enterin the find input) - Match-case, whole-word, and regex toggles (powered by
regex::RegexBuilder) - Match counter chip — "X of Y" / "No matches" / "Invalid regex"
- All-match highlighting in the editor; current match gets a stronger tint
- Replace bar with Replace / Replace All (
Ctrl-H, orCmd-Opt-Fon macOS) - Go to Line (
Ctrl-G, orCmd-Lon macOS to leaveCmd-Gfree for Find Next convention) - Find in Files (
Cmd/Ctrl+Shift+F) —walkdir-backed traversal, async off-main search, scrollable results panel, click-to-jump into the file - "Extended" search mode —
\n\r\t\0\b\\\xHH\dDDD\oOOOescape interpretation in non-regex find/replace (Find / Replace / FIF / Mark) - Mark / Bookmark —
F2toggle,Ctrl+F2next,Shift+F2previous,Cmd/Ctrl+Shift+F2clear all; gutter glyph + buffer-local set - Replace All as a single undo step (edit-group primitive)
- Regex capture replacement — numbered/named captures, optional groups, zero-length matches, guarded background planning, and explicit unsupported-template errors
- Line endings toggle (CRLF / LF / CR) — click the EOL chip in the status bar to cycle
- Encoding toggle (UTF-8 / UTF-8 BOM / UTF-16 LE/BE / Latin-1) — BOM-aware load, click the encoding chip to cycle
- Scrollable vertical viewport — only visible lines shape & paint
- Vertical scrollbar — drag thumb to scroll, click track to page-step
- Mouse wheel / trackpad scroll (pixel and line-mode deltas)
- PageUp / PageDown nav (with Shift- variants for selection)
- Cursor auto-scrolls into view on every move (typing, arrows, find, goto, …)
- Drag-select past the viewport edge auto-scrolls
- Async file / message dialogs — fixes a hard crash on dirty-tab close
(sync rfd dialogs ran the AppKit run loop and re-entered the gpui
AppCellborrow held by the outerentity.update, panicking on the next caret-blink tick). Open / Save / Save As / Close-prompt all userfd::AsyncFileDialog/AsyncMessageDialogdriven throughcx.spawn_in. - Word wrap toggle —
View ▸ Word Wrap; visual-row layout pass with wrap cache - Horizontal scrollbar (visible when wrap is off)
- Right-click context menu — in-window overlay layer; Undo/Redo, Cut/Copy/Paste/Delete, Select All, Toggle Bookmark, Go to Line, Find
- Show whitespace —
View ▸ Show Whitespace(· for spaces, → for tabs) - Zoom in/out —
Cmd/Ctrl +/-/0(VS Code style; scales chrome, gutter, and editor; persisted via<config>/Notepad Studio/window.toml) - Full-screen toggle (
F11)
- Duplicate Line / Selection —
Cmd/Ctrl+D - Move Line Up / Down —
Ctrl+Shift+Up/Down(Linux/Win),Alt+Shift+Up/Down(mac) - Delete Line —
Cmd/Ctrl+Shift+L - UPPERCASE —
Cmd/Ctrl+Shift+U - lowercase —
Cmd/Ctrl+U - Toggle Block Comment —
Cmd+/(mac),Ctrl+Q(Linux/Win) - Toggle Stream Comment —
Cmd+Shift+/(mac),Ctrl+Shift+Q(Linux/Win) - Insert Blank Line Above / Below —
Cmd/Ctrl+Alt+Enter/Cmd/Ctrl+Shift+Enter - Trim Trailing Whitespace — Edit menu only
- Syntax-aware comment chars — per-language tokens for all 24 grammars
- Replace All as a single undo step (edit-group primitive)
- Tree-sitter syntax highlighting — Rust, Python, C, C#, JS/TS/TSX, JSON, Markdown, Bash/Sh/Zsh/Ksh, PowerShell, Go, Java, Swift, Ruby, PHP, C++, Lua, HTML, CSS, SCSS, YAML, TOML, XML, SQL (25 modes). Filename detection (Rakefile, Gemfile) and shebang fallback. Kotlin and Dockerfile not yet supported (grammar incompatibilities).
- Language menu — select any of the 25 installed syntax modes or None (Normal Text), with per-tab checkmarks, session persistence and rebindable actions. Highlighting runs in the background.
- Bracket matching — depth-aware pair lookup, skips brackets inside strings/comments via tree-sitter span filter; falls back to dumb scan when no language
- Auto-indent — Enter inherits leading whitespace; extra indent after
{,[,( - Line indentation - Edit menu commands prepare larger or annotation-costly selections in the background; Escape cancels and Undo/Redo preserve text, marks and bookmarks. Large macro batches and block selections remain open.
- Comment toggle (syntax-aware) — per-language tokens for all 24 grammars (HTML/XML/Markdown wrap line ranges in
<!-- -->; JSON no-op)
- Shortcut Mapper —
Settings ▸ Shortcut Mapper; 252 actions including every fixed installed menu command, conflict detection, persisted to<config>/Notepad Studio/shortcuts.toml. Per-entry shortcuts for named Run commands, saved macros and plugin commands remain open.
- Multi-click selection — double-click a word, triple-click a line, quad+-click select-all
- Drop-to-open — drag any file onto the window to open it as a new tab
- Notepad++-style icon toolbar above the tab strip — File / Edit / Search / View / Macro / Plugins groups, monochrome SVGs tinted from the active theme, hover + pressed states, disabled state for unavailable actions
- Run dialog —
F5orRun ▸ Run...; Browse, document/app variables, literal argument launching and recent commands inrun.toml. Save named commands to the Run menu; select them in the dialog to edit, rename, copy or delete. Command and name fields have their own undo/redo. Named-command keyboard shortcuts remain open. - Column-mode selection + multi-edit — alt-drag a rectangle, virtual columns extend past EOL, typing/Backspace/Delete/Cut/Copy/Paste all operate rectangularly in a single undo step, sentinel-tagged clipboard so Notepad Studio→Notepad Studio block paste lands as column paste;
Cmd/Ctrl+Alt+Shift+Arrowextends the block by keyboard. Word-wrap + block paint together, and the Column Editor numeric-series dialog, deferred - Macro record / replay —
Cmd/Ctrl+Shift+Rtoggle recording,Cmd/Ctrl+Shift+Pplayback,Cmd/Ctrl+Shift+Mopens an inline "Run N times" prompt; Save Currently Recorded prompts for a name, persists to<config>/Notepad Studio/macros.toml, and the saved entries appear under theMacromenu for one-click replay - Plugin host — native cdylib plugins drop into
<config>/Notepad Studio/plugins/and load at startup vialibloading; thenotepad-studio-plugincrate defines the C-ABI (PluginInfo/HostApi) and ships a safePlugintrait +declare_plugin!macro for authors. The Plugins menu lists every loaded plugin with one submenu per plugin and one menu item per command. See the Plugins section below - Large-file streaming reads — files >10 MB stream in 1 MB chunks on the bg executor with status-bar progress + Cancel; >2 GB shows a confirm-open dialog; syntax highlighting skipped above 50 MB
- Session restore — open tabs, scroll positions, selections, and per-window placement persist across restarts; saved on autosave tick, on window close, and on app quit (
0cd40088b6327bd8ba325)
Notepad Studio loads native cdylib plugins from the editor's per-user plugins directory:
| Platform | Path |
|---|---|
| macOS | ~/Library/Application Support/Notepad Studio/plugins/ |
| Linux | $XDG_CONFIG_HOME/Notepad Studio/plugins/ (defaults to ~/.config/Notepad Studio/plugins/) |
| Windows | %APPDATA%\Notepad Studio\plugins\ |
The directory is auto-created on first launch. To install a plugin, drop
its .dylib (mac) / .so (linux) / .dll (windows) in there and restart
Notepad Studio. The Plugins menu shows one submenu per loaded plugin with each
exposed command as a menu item; "Plugins ▸ Open Plugins Folder" reveals
the directory in the OS file manager.
A sample plugin (Uppercase Selection + Show Hello) lives under
crates/sample-uppercase-plugin — build
with cargo build -p sample-uppercase-plugin --release and copy
target/release/libsample_uppercase_plugin.{dylib,so,dll} into the
plugins directory.
The plugin ABI is defined by the notepad-studio-plugin
crate. v1 exposes buffer read/write, selection read/write, and a status
bar message. ABI is versioned (PLUGIN_API_VERSION = 1); plugins built
against a different version are skipped at load time with a stderr log.
Trust: plugins run as native code with full process privileges. A hostile plugin can read every file the editor can read and execute any code your user account can. Only install plugins you trust. A capability sandbox (wasmtime) is on the v2 roadmap.
Apache-2.0 — see LICENSE.
