A lightweight, cross-platform text editor inspired by Notepad++, written in Rust. Notepad++ feel, AI features optional, no bloat.
Status: v0.1.0 effectively complete + Beyond section 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++-style tab right-click context menu.
- 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
- 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)
- 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 (24 languages). Filename detection (Rakefile, Gemfile) and shebang fallback. Kotlin and Dockerfile not yet supported (grammar incompatibilities).
- 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
{,[,( - 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; rebind any action, conflict detection, persisted to<config>/Notepad Studio/shortcuts.toml
- 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
- 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.
