Skip to content

Repository files navigation

Aether

Aether

A modal text editor with a client–server architecture for Linux and macOS. Native, terminal and web clients connect to a shared server process.

screenshot

Features

  • Selection-first motions, sneak, surround, transforms, motion undo/redo
  • Tree-sitter integration (highlighting, indentation, selection expand/contract)
  • LSP support (diagnostics, hover, go-to-definition, references, document/workspace symbols, formatting)
  • Git integration (gutter, inline diff, blame, hunk staging)
  • Markdown rendering
  • Fuzzy pickers (files, buffers, symbols, diagnostics, git changes), workspace grep
  • File explorer, cross-file jump history, workspace switching
  • Native, terminal and web clients with consistent keymaps and behaviour

Install

Prebuilt binaries for Linux and macOS (Apple Silicon) are attached to each release.

  • aether-<version>-<target>.tar.gz — the GUI build. Unpack it and put ae on your PATH; needs a graphical environment at runtime.
  • aether-<version>-<target>-no-gui.tar.gz — as above, but terminal/web only.
  • aether-<version>-x86_64.AppImage (Linux) — the GUI build as one self-contained executable: chmod +x and run, nothing to unpack. Symlink it onto your PATH (ln -s /path/to/aether-<version>-x86_64.AppImage ~/.local/bin/ae) and every ae command works through it; an AppImage integration tool can add the app-menu entry and icon.
  • aether-<version>-<target>.dmg (macOS) — the GUI build as a drag-install Aether.app. For the command line, symlink the binary it wraps (ln -s /Applications/Aether.app/Contents/MacOS/ae /usr/local/bin/ae).

macOS: downloads are unsigned, so clear the quarantine flag once — xattr -d com.apple.quarantine ./ae for a .tar.gz binary, xattr -dr com.apple.quarantine /Applications/Aether.app for the app bundle.

Keybindings

Type Space / for the in-app searchable list. Holding the Shift key extends the selection (e.g. Shift-w); a leading count repeats a motion (e.g. 3w). Space is the leader for app/file/git/code commands, and Tab reveals hover info at the cursor.

Motions (normal mode)

KeyAction
h/lCharacter left/right
j/Alt-jLogical/visual line down
k/Alt-kLogical/visual line up
w/Alt-wSelect small/big word
b/Alt-bSmall/big word backward
e/Alt-eSmall/big word end
0, HomeLogical line start
Alt-l, EndLogical line end
Alt-hFirst non-blank of line
f/Alt-fFind character forward/backward (next key is the target)
t/Alt-tTill character forward/backward
s/Alt-sSneak to small/big word (type a prefix, then the label on the word you want)
m/Alt-mMatching bracket/inner matching bracket
o/Alt-oNext/previous symbol
p/Alt-pFirst non-blank of next/previous line
g/Alt-gGo to line (count, default 1)/from end (default last)
v/Alt-vCursor down/up half a page
Backspace/Alt-BackspaceJump back/forward (cross-file history)
]/[Next/previous jumplist entry
}/{Next/previous jumplist entry in this file

Selection & history (normal mode)

KeyAction
,Collapse selection
r/Alt-rReverse selection (swap cursor and anchor) / orient it forward
%Select whole buffer
q/Alt-qExpand/contract selection to syntax node
x/Alt-xSelect line downward/upward
z/Alt-zUndo/redo cursor motion
.Repeat last motion
;/Alt-;Cursor near top/bottom of window

Search (normal mode)

KeyAction
/Search
?Search, selecting from the cursor to the match
Alt-/Search for current selection
n/Alt-nNext/previous match
EscClear the active search

Alt-c/Alt-w/Alt-e toggle case sensitivity, whole-word and regex matching from the prompt. Up/Down recall earlier queries — here and in every other overlay input (grep, globs, paths).

Editing (Ctrl — shared by normal and insert)

Every Ctrl edit works in both modes. The clipboard/edit keys are selection-scoped in normal and line-scoped in insert (since insert has no selection), on the same key; the rest are identical in both.

KeyNormalInsert
Ctrl-eChange selectionChange line
Ctrl-dDelete selectionDelete line
Ctrl-cCopy selectionCopy line
Ctrl-xCut selectionCut line
Ctrl-Alt-xCut selection and insert
Ctrl-vPaste before selectionPaste at cursor
Ctrl-Alt-vReplace selection with clipboardReplace line with clipboard
Ctrl-sSurround selection (next key = delimiter)Surround line
Ctrl-Alt-sUnsurround selectionUnsurround line
Ctrl-rTransform selection (next key = transform: case styles, invert, reverse, randomise)Transform identifier under cursor
Ctrl-z/Ctrl-Alt-zUndo/redoUndo/redo
Ctrl-l/Ctrl-hIndent/dedentIndent/dedent
Ctrl-j/Ctrl-kMove line(s) down/upMove line(s) down/up
Ctrl-gJoin linesJoin lines
Ctrl-Alt-gUn-join lines (cursor stays before the break)Line break at caret, caret stays
Ctrl-a/Ctrl-Alt-aIncrement/decrement numberIncrement/decrement number
Ctrl-y/Ctrl-Alt-yToggle line/block commentToggle line/block comment
Ctrl-fFormat documentFormat document
Ctrl-o/Ctrl-Alt-oOpen line below/aboveOpen line below/above

In insert mode, Tab indents to the next tab stop and Backspace steps back to the previous one, both following the file's own indent style.

Mode transitions

KeyAction
i/aInsert at selection start/end
Alt-i/Alt-aInsert at first non-blank of line/last line end
EscLeave insert mode

Markdown reading view

Space v renders the current Markdown buffer — headings, tables, images, links and highlighted code fences — as a read-only view with its own keys. The reading position is the cursor, so toggling back lands where you were reading.

KeyAction
Space vToggle the reading view
j/kFocus next/previous element
l/hFocus next/previous link in the block
o/Alt-oNext/previous heading
g/Alt-gFirst/last element
EnterFollow the link, open the image, jump to the footnote, or toggle a task's checkbox
Ctrl-EnterFollow a relative link in a new window
TabShow the link's or image's target
x/Alt-x, Shift-j/Shift-kSelect blocks — as in the editor, plain x walks and Shift extends
r/Alt-rReverse the selection / orient it forward
Ctrl-cCopy the selection, the link URL, or the element's Markdown source
Ctrl-z/Ctrl-Alt-zUndo / redo
i/aEdit: insert at block/selection start / end
Ctrl-eEdit: rewrite the selected block(s)
Ctrl-o/Ctrl-Alt-oEdit: open a new block below / above — a list item inside a list, a paragraph elsewhere
Ctrl-j/Ctrl-kMove block(s) down / up (Ctrl-Alt-j/k moves paragraphs in the editor)
Ctrl-x, Ctrl-v/Ctrl-Alt-vCut block(s); paste as block / replace selection
Ctrl-dDelete block(s) (no clipboard)
Ctrl-l/Ctrl-hDeepen/flatten: heading level, list nesting, or blockquote level

Search, jump history and the scroll/placement keys behave as they do in normal mode.

Application

ChordAction
Space f/Space Alt-fFind files / in buffer's directory
Space b/Space Alt-bSwitch buffer / new scratch buffer
Space g/Space Alt-gGrep workspace / for current selection
Space e/Space Alt-eFile explorer / at workspace root
Space w/Space Alt-wSwitch workspace / open file by absolute path
Space jJumplist (Ctrl-j in any picker captures its results into it)
Space p/Space Alt-pCopy relative/absolute path
Space s/Space Alt-sSave / save as
Space k/Space Alt-kKeep buffer (toggle transient) / reload from disk
Space x/Space Alt-xClose buffer / save and close it
Space zOpen another window
Space ,Workspace settings (roots, projects)
Space .Application settings (soft wrap, font sizes, …)
Space h/Space Alt-hDismiss the current hint / turn hints off
Space q/Space Alt-qQuit / save current buffer and quit
Space //Space ?Show keyboard shortcuts / about this build

Git

ChordAction
c/Alt-cNext/previous change (hunk)
Space c/Space Alt-cGit changes in current file / across the workspace (hunks)
Space a/Space Alt-aStage-unstage / revert the change under the cursor (or selected lines)
Space iToggle inline diff
Space mBlame commit details for the cursor line

Code / LSP

ChordAction
TabHover (type & docs)
EnterGo to definition
Space rGo to references
d/Alt-dNext/previous diagnostic
Space nDiagnostic at cursor
Space d/Space Alt-dDiagnostics: current buffer / workspace
Space o/Space Alt-oDocument / workspace symbols
Space lLSP servers (status, restart)
Ctrl-fFormat document

Building

Aether is a standard Cargo workspace.

cargo build --release

This produces a single binary:

  • ae — runs the server daemon, the terminal client, and (when built with the gui feature, on by default) the native GUI client. The build that ships the GUI is the default; dropping it with cargo build --release -p aether-ae --no-default-features (so iced/winit/wgpu never enter the dependency graph) is exactly the -no-gui release artifact, for a box with no display libraries.

Running

Just run ae — it opens a client and, if no server is already running, auto-starts one in the background:

ae # open the workspace picker
ae src/main.rs # open a file (workspace inferred from its path)
ae src/ # open the file explorer at a directory
ae -w aether # open the "aether" workspace
ae -w aether src/main.rs # open a file in a named workspace

The first client launches a background server and connects to it; later clients reuse it, and the server idle-reaps itself once nothing has been connected for a while. To run a persistent server yourself (e.g. to watch its logs), use ae server, and stop it with ae server stop.

With no --gui/--tui flag, ae picks a client automatically: a terminal on stdout means the terminal client; no terminal but a display set (a desktop launcher) means the GUI. Pass --gui or --tui to force one.

A path is resolved against the current working directory; if it falls outside every configured workspace it opens as a standalone file. A directory opens the file browser there.

Opening a file that way — ae file, with no -wtethers the client to that buffer: closing it (Space x, or Space Alt-x to save first) exits the client, so ae works as an $EDITOR for git and anything else that waits for the process to finish.

Workspaces are created and managed from the workspace picker (Space w); running ae with no arguments opens it.

Web client

The web client is served by the same server process: with a server running, open http://127.0.0.1:2384. There's no token to copy — the daemon is loopback-only and authorizes by Host/Origin, so a browser on the same machine just connects.

Building from source needs its bundle built once (web/, TypeScript):

cd web
npm install # first time only
npm run build # tsc (typecheck + compile), then Vite bundles to web/dist

Release builds embed web/dist in the binary, so a released ae is self-contained; debug builds read it from disk, so a rebuilt bundle is served without restarting the server.

License

MIT

About

Modal text editor for Linux and macOS with native, terminal and web clients

Topics

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages