Help us shape the future of Go! Take the 2026 Go Developer Survey

fude

module
v0.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 19, 2026 License: MIT

README

fude

A modal text editor with Vim's grammar, and the Go libraries it is built from.

Use it as your editor, with language servers, tree-sitter, a finder, git, a debugger and editing with others built in. Or take its kernel, its Vim grammar, its syntax or its LSP and DAP clients into a Go program of your own.

License Status Sponsor

Runs on macOS, Linux and Windows.

Why · Principles · Install · Tour · Built in · Together · Libraries · Compare


fude (筆) is a writing brush. It is one codebase you can use two ways.

  • An editor. A terminal editor for people who already know Vim's keys. ciw, dap, 3j, ., q, "a, :s and <C-w>v do what they do in Neovim. One TOML file sets it up, and it has no scripting language to learn.
  • A set of libraries. The editor is built from Go modules with small public APIs: a text kernel with a branching history, Vim's grammar as a state machine, tree-sitter syntax, LSP and DAP clients, a sandboxed plugin host and a client for a running fude. The kernel, the grammar, the syntax and the protocol clients work without the rest, and the editor uses every part through the same API you would.

Why fude exists

Neovim is the editor whose behaviour fude copies, and it carries four costs.

  • Thirty years of compatibility. Vimscript, Ex mode, Select mode, modelines, swap files and hundreds of option names stay so that old scripts keep working.
  • Plugins run inside the editor. A Lua plugin runs on the same thread as your typing. One slow autocommand or a loop in a status line plugin freezes every keystroke, and finding which plugin did it takes a profiler.
  • A config that never stops growing. Language servers, completion, a finder, git signs, formatting and key hints each come from a plugin you choose, wire up and keep updated. The config is code, and it runs on every event.
  • Its parts come only as the whole program. To use Neovim's editing in another program, you run Neovim as a process and talk to it over RPC. You cannot import its grammar, its undo tree or its LSP client as a library.

Helix and Kakoune are lean because they started over, and they changed the grammar too, so you select first and act second. A Vim user has to relearn every edit. fude keeps Vim's grammar exactly and rebuilds everything under it as separate Go modules.

What fude believes

Neovim is the reference. Where fude's spec says nothing, a key does what it does in Neovim. fude departs only where the departure is better, and each departure is written down with its reason in prd/decisions.md.

Every layer is a library. The kernel, the grammar, the syntax and the protocol clients are Go modules of their own, and their go.mod files enforce the edges. The kernel imports only the standard library and cannot reach the terminal. The grammar never sees the kernel. A built-in feature cannot reach into the editor. The compiler checks these edges on every build, so no layer takes on another's work. That is how the kernel stays under 900 lines, and why each part has tests with no editor around it.

Configuration is data. config.toml holds settings, keymaps and per-language tables. A keymap maps keys to keys, an ex line or a plugin's function. Nothing in the config runs later, because a config that registers callbacks is a plugin without a sandbox or a time limit, and that is the problem fude exists to avoid.

Extensions run in a sandbox. A plugin is WebAssembly, run by wazero, with the capabilities its config table grants and a time budget on every call. fude stops and unloads a plugin that loops forever, and you keep typing. fude's own operators, text objects, commands and status line use the same API a plugin gets, so a plugin can do anything the editor does. A plugin that adds a gs sort operator gets gsip, gsaf and gs3j with no more code.

Every edit goes through one grammar. A typed key, a macro, a plugin's key and a remote client's command all become keys the vim machine runs. That is why . repeats a plugin's edit, a macro can hold :w, and a client's edit undoes like a typed one.

Nothing you typed is lost. Text lives in a persistent rope, so every edit is a cheap snapshot on a branching timeline. Undo never throws a branch away, :timeline diffs any two states, and :earlier 10m goes back by time. fude appends the timeline to disk as you type, which replaces both swap files and undo files. A crash loses no edit, :recover brings back what was unsaved, and closing a file keeps the newest megabyte of its history for next time.

The editor is a server. The editor runs without a terminal. The terminal is one client, other people and programs attach over a socket, and the tests drive it with no terminal at all. That one design gives fude editing together, scripting from a shell and a safe way for an AI agent to edit your code.

Speed is tested. Each speed promise below is a test, and just check fails when one regresses. Nothing on the input path waits for a language server, a grammar build or a plugin.

Standards before inventions. Language servers speak LSP, debuggers speak DAP, highlighting uses each tree-sitter grammar's own queries, snippets are VS Code's snippet files, and themes are base16 schemes. So the servers, adapters, grammars, snippet files and themes that exist today work in fude.

Who fude is for

If you edit. fude fits if you think in Vim's grammar, want language servers, a finder, git and a debugger without assembling them from plugins, and want one config file with no code in it. It does not fit if you depend on Neovim's Lua plugins, which fude will never run, or need a mouse or a GUI, which fude does not have.

If you build. fude fits if you are writing a Go program that edits text, highlights code, talks to a language server or wants Vim keys, and you would rather import tested parts than write them. Build on fude lists each part, what it is for and what it needs.

Either way, read Status before you trust it with work.


Install

With oku, one line builds the newest commit of main and installs fude with its man pages:

oku add github:y3owk1n/fude

oku update fude moves to the newest commit.

From source

Needs Go 1.26 or later and a C compiler, as fude's tree-sitter binding uses cgo. On Windows that is llvm-mingw's gcc, which the repository's oku.toml installs. Windows also needs Git for Windows.

git clone https://github.com/y3owk1n/fude
cd fude
go build -o bin/fude ./cmd/fude

Put bin/fude on your PATH. go install works from the first release on. Until then the repository's modules point at each other through local paths, which go install refuses.

What fude uses when it is on PATH
Tool For
git and the tree-sitter CLI, or on Windows git and gcc Building each language's grammar
rg :pick grep, which falls back to git grep
pbcopy, wl-copy or xclip, none on Windows The system clipboard
TinyGo Building plugins
A nerd font Icons, which are off by default

fude needs a terminal with true colour.

A first session

fude main.go

The first frame shows in under 5ms, with no config file and nothing asking for one.

  • Edit as you always have. ciw, dap, 3j, . and u do what you expect. With the cursor in a function, daf deletes it and cia changes the argument under the cursor, in every language fude has a grammar for.
  • Find things. :pick files opens a fuzzy finder and :pick grep a live grep, each with a preview. :pick buffers and :pick recent find open and recent files. <C-q> sends the matches to a list.
  • Go back in time. After twenty minutes of refactoring, :timeline lists every state of the file. [ and ] scrub through them, d diffs one against now, and <CR> restores it as a new state, so even the restore can be undone.
  • Ask. Type the start of a command and wait, and a panel shows every key that may follow. :h guide-start opens the written guide.

Each language's grammar builds in the background the first time you open one of its files, and its colours appear when the build ends. fude tail in another terminal prints what a running fude does, as it happens.


What's built in

Area What you get
Editing s to jump anywhere in view by a label, <C-n> to edit every match of a word at once, zc and za to fold by indent, ys, ds and cs to surround, counts on both sides of an operator, registers and the clipboard, macros as editable text, :s with a live preview, :g, :normal, :! and :r !
Timeline u and <C-r> along a branch, g- and g+ across every state, :earlier 10m, :timeline to diff and restore, :recover after a crash
Syntax tree-sitter with 49 grammars, each built on first use, code inside markdown coloured, daf, cic and dia, the enclosing function pinned at the top
Language servers Several per file, merged diagnostics, hover, definitions, references, code actions with a preview of their edits, signature help, inlay hints, a :lsp panel
Completion From language servers, snippets, paths and the buffer, with VS Code snippet files
Formatting Formatters by name, run in turn or the first that applies, with the language server as the fallback
Debugging Debug adapters over DAP, launch settings in .fude/launch.toml, breakpoints that stay on their line as you edit, stepping, a panel of frames, variables and output, :debug eval
Finder :pick for files, grep, buffers, recent files, diagnostics, symbols, help and keymaps, with a preview, <C-g> to search ignored files, <C-q> to a list, and :pin for up to 9 files a key away
Folders Edit an explorer and :w to rename, delete and create files
Git Signs, ]h and [h between hunks, a hunk preview, gh to stage a hunk and gH to put one back as the index has it, :gitdiff, :blame for the cursor's line
Together fude attach for a second session, fude share and fude join over TLS, everyone's cursor in their own colour, :follow, proposals from agents
Terminal :terminal in a split, and <Esc><Esc> to move through its output in normal mode
Tasks :pick tasks and :task run config.toml's tasks, just recipes, make targets and npm scripts in a split or in the background, and ]q walks their errors
Discovery Key hints for a half-typed command, :h with a written guide and a full reference, man pages
Typing Autopairs, spelling with ]s and z=, and #hex, rgb() and hsl() text shown on the colour it names
Sessions A start screen with your recent files and the last session in the directory, :restart reloads config and plugins and keeps every window, cursor and unsaved change
Look Dark and light themes in true colour, any base16 scheme such as stylix's palette.json, markdown drawn as it reads, images in kitty, Ghostty, WezTerm and iTerm2, :center for prose
Where it differs from Neovim

A few of the departures, each with its reason in prd/decisions.md:

  • No vimscript, no Lua, no Ex mode, no Select mode, no modelines and no swap files. The timeline does what swap files did, and more.
  • Search uses Vim's pattern syntax on Go's linear-time engine. No pattern can hang the editor on a large file. fude refuses the few atoms that need backtracking, such as backreferences in a pattern, with a message naming them.
  • Options have fude's own names, such as relative_number and scroll_off, since there are no old scripts to keep working.
  • Splits open below and right, and the leader is space, as most Neovim configs set them.
  • :restart keeps unsaved changes instead of refusing, because the timeline already holds them.
  • No mouse. fude is for the keyboard.

Editing together

One fude holds the buffers, and any number of sessions edit them. Each session has its own windows, cursor, mode, name and undo.

ana shares a file and lets ben in, they edit it at once, ben's u undoes only his edit, and ben follows ana down the file

fude attach               # a second session of the fude running here
fude share                # let someone in over TLS, the share string goes to the clipboard
fude join <string>        # on their machine
  • Attach. fude attach opens another session of the running fude in a second terminal or pane. Its :q leaves, and the editor and the other sessions go on.
  • Share. fude share shows a share string that names each of the host's addresses, the certificate's fingerprint and a secret that works once. fude join dials every address at once, so a guest on the same network or on a VPN such as Tailscale joins with the same string. The host answers y or n to the guest, who is named by $USER. When the guest cannot reach the host, fude share --relay host has both sides dial out to a fude relay instead. The TLS still runs end to end, so the relay copies only ciphertext.
  • Guests have less power. A guest opens and writes files under the project only, runs no program of its choosing, and changes nothing every session shares, such as the theme, git's index or the language servers. fude join --read-only watches without editing. A guest brings their own keymaps, leader and theme.
  • You see each other. Each session has a colour. Its cursor and selection show in that colour on any window of the same buffer, and the status line names who is there. :follow name keeps your windows on what theirs show, :who lists the guests and :kick name ends one.
  • Undo is yours. u reverts only your own change, moved through what others typed since.
  • Agents propose. A program attaches over the socket the same way. It can send its edit as a proposal, which shows as ghost text, follows your edits and changes nothing until you :accept it or :reject it. Accepting is one step you can undo. From a shell, fude open, fude keys and fude state open files, type keys and read the state of a running fude.

The host's fude must be running, since it holds the text. There is no peer to peer mode and no offline merge. A test fails when an attached session takes more than 5ms to draw a key, as Performance shows.


Configuration

fude reads ~/.config/fude/config.toml, or $XDG_CONFIG_HOME/fude/config.toml. On Windows it is %APPDATA%\fude\config.toml. Every setting is optional, fude never writes the file, and :restart loads a change.

theme = "dark"
relative_number = true
scroll_off = 8
format_on_save = true

[keymap.normal]
"<Leader><Leader>" = ":pick files<CR>"
"<Leader>sg" = ":pick grep<CR>"

[keymap.groups]
"<Leader>s" = "search"           # the name key hints show

[filetype.go]
lsp = ["gopls"]
format = ["goimports", "gofumpt"]

[lsp.gopls]
root = ["go.work", "go.mod", ".git"]

:h settings explains every setting. :h guide-config, :h guide-lsp and :h guide-format walk through config, language servers and formatters.

Plugins

You write a plugin in Go with fude's sdk and build it into a .wasm file with TinyGo. There is no plugin manager. A plugin is a file and a table in config.toml.

fude plugin new upper && cd upper && fude plugin build
func init() {
	sdk.Operator("zu", "upper-cases the text a motion covers", func(r sdk.Range) {
		text, err := sdk.Text(r.Start, r.End)
		if err != nil {
			sdk.Log(err.Error())
			return
		}
		sdk.Edit(r.Start, r.End, strings.ToUpper(text))
	})
}
[[plugin]]
path = "plugins/upper.wasm"
capabilities = ["buffer.read", "buffer.write"]

zu now works with every motion and text object, with counts, in macros and with .. A plugin gets only the capabilities its table names: buffer.read, buffer.write, ui, fs.read, process, net, lsp and keys, process and net limited to the programs and hosts listed. fude logs a call outside them and returns an error to the plugin. plugin/testdata holds small examples, plugintest runs a plugin in go test, and :h guide-plugins covers the rest.


Build on fude

Each layer of fude is a Go module or package with a small public API, tests through that API and a README of its own. The editor uses each layer through that API, as another program would. fude needs this shape for itself. The kernel holds no policy, so it stays small. The grammar's tests run against a small host in memory. The built-in features that are modules use the plugin API, which proves the API is enough. The same shape lets you take one part and leave the rest.

Part What it is What you can build with it Needs
core A text buffer with marks, transactions and a branching timeline, on a persistent rope Undo that never drops a branch, snapshots read on any goroutine, history saved through a Store you write, edits from several sources each undone on its own The standard library
vim Vim's grammar as a state machine over a Text and a Host you write Vim keys in a TUI text field, a REPL, a SQL shell or another editor, with your own operators and text objects that compose with every motion Two Unicode packages
syntax tree-sitter highlighting and syntax text objects, with grammars built on first use from their own repos Highlighting in a pager, a diff viewer or a code review tool, function and class bounds for a refactoring tool cgo, git and the tree-sitter CLI
protocol LSP and DAP clients that never block your loop A tool that asks a language server for hover, references or diagnostics, or one that drives a debugger The standard library
api What every built-in feature and plugin is written against A feature for fude as a Go module The standard library
plugin, sdk The wasm plugin host, with capabilities and time budgets, and the Go SDK plugins are written with Plugins for fude, tested in go test with plugintest, or fude's plugins run inside your own program wazero, and TinyGo to build a plugin
client A client of a running fude, with a copy of a buffer that converges with the server An agent or a script that edits a live buffer with Vim's grammar from another process fude's root module
editor, modules, ui/term The whole editor headless, its 40 built-in modules, and the terminal client A fude with the features you pick and your own beside them, or another client that draws the same frames fude's root module

core, vim, syntax, protocol and api import nothing else from fude, so they are the parts to depend on today:

go get github.com/y3owk1n/fude/core github.com/y3owk1n/fude/vim

fude has no release yet. go get takes the newest commit, and every API here can change until the first release.

Vim's keys over the kernel

A host embeds vim.Defaults for what it has no use for, such as jump lists, and writes the rest, about one line per method:

type host struct {
	vim.Defaults
	b      *kernel.Buffer
	cursor kernel.MarkID
	marks  map[rune]kernel.MarkID
}

func (h *host) Text() vim.Text    { return h.b.Snapshot() }
func (h *host) Cursor() int       { return h.b.Mark(h.cursor) }
func (h *host) SetCursor(pos int) { h.b.MoveMark(h.cursor, pos) }
func (h *host) BeginGroup()       { h.b.BeginGroup("me") }
func (h *host) EndGroup()         { h.b.EndGroup("me") }

func (h *host) Apply(edits []vim.Edit, label string) error {
	t := kernel.Transaction{Base: h.b.Snapshot().Version(), Origin: "me", Label: label, Time: time.Now()}
	for _, e := range edits {
		t.Edits = append(t.Edits, kernel.Edit(e))
	}
	return h.b.Apply(t)
}

func (h *host) Undo() (int, int, error) {
	start, ok := h.b.Undo()
	if !ok {
		return 0, 0, vim.ErrNoStep
	}
	return start, start, nil
}

Redo has the shape of Undo. SetMark and Mark keep each name's kernel.MarkID in marks, and Viewport and SetTop come from the program's own view. vim.New(&host{...}) then takes keys with Feed. The examples in each package's documentation run as tests.

A distribution of your own. fude's cmd/fude is a list of modules handed to editor.Use, and a built-in feature is a module like any other. A program can start the editor with the modules it wants, add its own, and run it under ui/term or a client of its own. editor/editortest drives that editor headless in go test, which is how each of fude's modules is tested.

How it works

clients   terminal | attached and shared sessions | agents
            | keys, commands                       ^ frames, state, edits
editor    one loop: config, windows, LSP, DAP, syntax, modules, plugins (wasm)
            | keys --> vim machine --> edits             (vim/, a library)
            | transactions               ^ changes
kernel    buffers | marks | transactions | timeline      (core/, a library)
storage   persistent rope with structural sharing
  • One goroutine owns every change. Keys, the vim machine and edits run on one loop with no locks. Language servers, grammar builds and the finder work on snapshots of the text, which the persistent rope makes free, and post their results back. That is why nothing on the input path waits.
  • The vim machine never sees the kernel. It reads text through a small interface and returns edits. The editor applies them as transactions, which carry their origin, so each session's u undoes only its own edits.
  • The kernel is mechanism only. core/ has no goroutines, no I/O, no clock and no dependencies. It is under 900 lines, and just check fails if it grows past 10k. The editor gives it a store, and the store appends each change to the timeline log on disk.
  • Features are modules. Each of the 40 built-in modules imports only api/, protocol/ and fude's internal packages, never the editor, and just check enforces that.
  • Syntax comes from the grammars' own repos. fude builds each grammar on first use at a pinned commit, with the queries its repo ships, and :grammar update rebuilds the ones built at an older pin.
  • The spec comes first. prd/ holds what fude is for, how it works, why it is shaped this way, and every behaviour it promises, each numbered and each with a test.

How fude compares

Editor Editing model Built in Extended with Configured with
fude Vim's grammar LSP, DAP, tree-sitter, finder, grep, git hunks, folder editing, terminal, sharing Sandboxed wasm with a time budget TOML
Neovim Vim's grammar LSP client, tree-sitter, terminal Lua and vimscript, in process Lua
Helix Select first, as Kakoune LSP, tree-sitter, file and grep pickers A Scheme plugin system, in progress TOML

Performance

Measured on an Apple M-series Mac. just check fails when one of these regresses.

Promise Limit Measured
Cold start to the first frame 5ms about 3ms
A key read to its frame written, p99, on 10MB of real Go with syntax on 1ms about 0.75ms
The same in git and two windows, with a language server and a plugin 2ms about 1.1ms
The same through fude attach on the local socket 5ms about 0.8ms
A 1GB file's first frame 1s about 0.55s

Status

fude is alpha. It has no releases or version numbers yet, and the config format, the plugin ABI, the socket protocol, the timeline log on disk and every library's API may change between commits. Keep backups of work you care about.

Not here yet: releases, and GPU or web clients. Never here: vimscript, Lua, the mouse, and plugins without a sandbox.

Documentation

Inside fude
:h guide-start The written guide, from the first file onward
:h settings Every setting in config.toml
:h guide-plugins Writing, building and loading a plugin
:h guide-remote Attaching a client over the socket
fude help Every way to run fude from a shell
fude man fude(1), and with config or guide, fude-config(5) and fude-guide(7)

Contributing

oku installs the toolchain from oku.toml, and just runs the tasks.

oku sync && oku allow
just check    # formatting, vet, the tests with -race, the size and speed limits
just run      # build and open fude

A change starts from the spec: a behaviour in prd/behaviours.md, a test named after it, then the code. AGENTS.md holds the conventions.

Credits

fude follows Neovim and Vim as its reference for how an editor behaves, and owes its grammar to them.

Built on, and following

fude is built on:

Much of what fude builds in follows a plugin or project that did it first: oil.nvim for editing folders, fff.nvim for the finder and grep, which-key.nvim for key hints, gitsigns.nvim and mini.diff for git signs and hunks, mini.icons for icons, conform.nvim for formatting, undo-glow.nvim for the flash of a yank or undo, nvim-tmux-navigation for moving into tmux panes, fzy for fuzzy ranking, CodeMirror's collab module for rebasing a client's edits, base16 and Tinted Theming for schemes, stylix for palettes, and Helix and Zed for the look.

:pick grep runs ripgrep when it is installed, and just and oku run fude's development.

Support the project

One person builds fude in their spare time. If you use it, you can sponsor it.

Also by the same author: neru for hints and vim keys across the whole desktop, and mimi for macOS spaces and windows from the command line.

License

MIT. See LICENSE.


Made with ❤️ by y3owk1n

Directories

Path Synopsis
api module
Package client talks to a running fude over its socket.
Package client talks to a running fude over its socket.
cmd
fude module
core module
Package editor hosts the kernel and the vim machine for a set of files shown in a layout of windows.
Package editor hosts the kernel and the vim machine for a set of files shown in a layout of windows.
editortest
Package editortest drives a headless editor in tests, for a module or any program that builds on the editor.
Package editortest drives a headless editor in tests, for a module or any program that builds on the editor.
frontend module
internal
clipboard
Package clipboard reads and writes the system clipboard: through pbcopy on macOS, wl-copy or xclip on Linux, and the clipboard's own calls on Windows.
Package clipboard reads and writes the system clipboard: through pbcopy on macOS, wl-copy or xclip on Linux, and the clipboard's own calls on Windows.
fsys
Package fsys opens and replaces files the way Unix does on every system: a file fude has open can still be renamed, and a write replaces a file whole.
Package fsys opens and replaces files the way Unix does on every system: a file fude has open can still be renamed, and a write replaces a file whole.
fuzzy
Package fuzzy ranks text by how well a query's letters match it, in order and ignoring case, as fzy and Vim's matchfuzzy() do (B129, B152).
Package fuzzy ranks text by how well a query's letters match it, in order and ignoring case, as fzy and Vim's matchfuzzy() do (B129, B152).
home
Package home expands the ~ that starts a path.
Package home expands the ~ that starts a path.
keep
Package keep is what fude keeps between runs, under the XDG directories: where they are, writing a file whole, the recent files and where a session and the pins are kept.
Package keep is what fude keeps between runs, under the XDG directories: where they are, writing a file whole, the recent files and where a session and the pins are kept.
paths
Package paths compares file paths as the system does: exactly, and on Windows ignoring case.
Package paths compares file paths as the system does: exactly, and on Windows ignoring case.
pty
Package pty runs a program in a pseudo-terminal, as :terminal does (B205).
Package pty runs a program in a pseudo-terminal, as :terminal does (B205).
relay
Package relay passes a share's connections between a host and its guests when neither can reach the other (D41).
Package relay passes a share's connections between a host and its guests when neither can reach the other (D41).
share
Package share is what a host and a guest agree on to share a fude over TLS: a self-signed certificate the share string names by fingerprint, the string itself, and where a host is reached (B248, B249).
Package share is what a host and a guest agree on to share a fude over TLS: a self-signed certificate the share string names by fingerprint, the string itself, and where a host is reached (B248, B249).
shell
Package shell finds the user's shell, which runs :! commands and :terminal.
Package shell finds the user's shell, which runs :! commands and :terminal.
timeline
Package timeline is a buffer's timeline log on disk.
Package timeline is a buffer's timeline log on disk.
tomlerr
Package tomlerr says where in a TOML file a decoding error is.
Package tomlerr says where in a TOML file a decoding error is.
trace
Package trace keeps what fude did, for fude tail (B174).
Package trace keeps what fude did, for fude tail (B174).
modules
autopairs
Package autopairs types the closing bracket or quote with an opening one typed in insert mode, steps over a closing one that comes next, and deletes an empty pair with <BS>, while autopairs is on (B202).
Package autopairs types the closing bracket or quote with an opening one typed in insert mode, steps over a closing one that comes next, and deletes an empty pair with <BS>, while autopairs is on (B202).
blame
Package blame shows, dim after the cursor's line, who changed it last, how long ago and the commit's summary (B220).
Package blame shows, dim after the cursor's line, who changed it last, how long ago and the commit's summary (B220).
bufferline
Package bufferline says what the top row lists: the open buffers that have files, each by its file's name, with its folder too when two names are the same, while buffer_line is on (B258).
Package bufferline says what the top row lists: the open buffers that have files, each by its file's name, with its folder too when two names are the same, while buffer_line is on (B258).
buffers
Package buffers shows, steps through, writes and closes buffers: :buffer, :bnext, :bprevious, :update, :bdelete and :enew (B89, B155).
Package buffers shows, steps through, writes and closes buffers: :buffer, :bnext, :bprevious, :update, :bdelete and :enew (B89, B155).
colours
Package colours shows text that names a colour on that colour, and the colours a language server reports (B208, B209).
Package colours shows text that names a colour on that colour, and the colours a language server reports (B208, B209).
comment
Package comment is gc, which comments the lines a motion or object covers, or uncomments them (B44).
Package comment is gc, which comments the lines a motion or object covers, or uncomments them (B44).
completion
Package completion offers insert mode completions from the words of the open buffers, the entries of a directory a path before the cursor names, and the user's snippets (B206, B207).
Package completion offers insert mode completions from the words of the open buffers, the entries of a directory a path before the cursor names, and the user's snippets (B206, B207).
debug
Package debug runs a program under a debug adapter: breakpoints, stepping, a panel of frames and variables, and evaluation (B261 to B265).
Package debug runs a program under a debug adapter: breakpoints, stepping, a panel of frames and variables, and evaluation (B261 to B265).
editorconfig
Package editorconfig sets a file's indentation from its .editorconfig files, as editorconfig.org's spec says (B238).
Package editorconfig sets a file's indentation from its .editorconfig files, as editorconfig.org's spec says (B238).
explorer
Package explorer is what an explorer of a directory does, as oil.nvim does: - lists the current file's directory, an explorer's keys open its entries, and editing it and :w renames, deletes and creates them.
Package explorer is what an explorer of a directory does, as oil.nvim does: - lists the current file's directory, an explorer's keys open its entries, and editing it and :w renames, deletes and creates them.
files
Package files is :pick files, the working directory's files read off the loop, and :pick buffers, the open buffers that have a file (B129, B213).
Package files is :pick files, the working directory's files read off the loop, and :pick buffers, the open buffers that have a file (B129, B213).
flash
Package flash shows text just yanked, put, undone or redone for flash_time milliseconds, as undo-glow.nvim does, and a change to the buffer clears it sooner (B139).
Package flash shows text just yanked, put, undone or redone for flash_time milliseconds, as undo-glow.nvim does, and a change to the buffer clears it sooner (B139).
fold
Package fold folds a buffer by indent, through zc, zo, za, zR and zM (B224, N34).
Package fold folds a buffer by indent, through zc, zo, za, zR and zM (B224, N34).
format
Package format formats a buffer through its filetype's formatters, or else its language server.
Package format formats a buffer through its filetype's formatters, or else its language server.
git
Package git shows how a file differs from git's index, as signs, hunks to jump to, reset and stage, a preview and :gitdiff, an explorer's entries' status and the branch on the status line (B123, B126, B138, B147, B221, B222).
Package git shows how a file differs from git's index, as signs, hunks to jump to, reset and stage, a preview and :gitdiff, an explorer's entries' status and the branch on the status line (B123, B126, B138, B147, B221, B222).
grammars
Package grammars is :grammar: it lists the grammars fude builds and whether each is built, builds one again, or builds again those built at an older pin (B165).
Package grammars is :grammar: it lists the grammars fude builds and whether each is built, builds one again, or builds again those built at an older pin (B165).
grep
Package grep is :pick grep, a live search of the working directory's files' lines (B134, B210).
Package grep is :pick grep, a live search of the working directory's files' lines (B134, B210).
help
Package help shows fude's help in its window, at the entry a name has, and goes to the entry of the name under the cursor there (B162).
Package help shows fude's help in its window, at the entry a name has, and goes to the entry of the name under the cursor there (B162).
hints
Package hints shows the keys that may follow the command being typed, once it waits key_hints milliseconds for its next key, as which-key.nvim does.
Package hints shows the keys that may follow the command being typed, once it waits key_hints milliseconds for its next key, as which-key.nvim does.
inlay
Package inlay shows a language server's inlay hints among a buffer's text, such as parameter names and types (B216).
Package inlay shows a language server's inlay hints among a buffer's text, such as parameter names and types (B216).
jump
Package jump moves the cursor to any text in view in a few keys.
Package jump moves the cursor to any text in view in a few keys.
links
Package links follows what is under the cursor: gx opens a link or a file with the system's opener, and gf opens a file in fude.
Package links follows what is under the cursor: gx opens a link or a file with the system's opener, and gf opens a file in fude.
lists
Package lists lists what the editor keeps: :buffers, :marks, :jumps, :changes, :registers and :messages (B157, B268).
Package lists lists what the editor keeps: :buffers, :marks, :jumps, :changes, :registers and :messages (B157, B268).
lsp
Package lsp is what a language server tells about the symbol under the cursor: hover, its definition, type definition, implementations and references, the file's symbols, the workspace's, and renaming it (B62, B66, B214).
Package lsp is what a language server tells about the symbol under the cursor: hover, its definition, type definition, implementations and references, the file's symbols, the workspace's, and renaming it (B62, B66, B214).
markdown
Package markdown draws a markdown file as it reads, with render on: headings on their level's ground without their #s, code blocks on a ground without their fences, bullets, checkboxes, quote bars and rules, and links and emphasis without their marks.
Package markdown draws a markdown file as it reads, with render on: headings on their level's ground without their #s, code blocks on a ground without their fences, bullets, checkboxes, quote bars and rules, and links and emphasis without their marks.
pick
Package pick is the :pick sources of fude's own registry: help opens help at a tag, keymaps lists every key and runs one picked, and commands lists every ex command and runs one picked (B215, B266).
Package pick is the :pick sources of fude's own registry: help opens help at a tag, keymaps lists every key and runs one picked, and commands lists every ex command and runs one picked (B215, B266).
pins
Package pins keeps a short list of files for each working directory, in the order the user chooses: :pin and <Leader>a pin the current file, <Leader>1 to <Leader>9 go to one, and :pin list shows them as lines :w writes.
Package pins keeps a short list of files for each working directory, in the order the user chooses: :pin and <Leader>a pin the current file, <Leader>1 to <Leader>9 go to one, and :pin list shows them as lines :w writes.
places
Package places shows the last list of places in a window, where <CR> goes to the place on the cursor's line, and steps through it: ]q, [q, [Q, ]Q, :cnext, :cprevious, :cfirst, :clast, :cc, :copen, :cclose, :cdo and :cfdo (B194, B257, B347).
Package places shows the last list of places in a window, where <CR> goes to the place on the cursor's line, and steps through it: ]q, [q, [Q, ]Q, :cnext, :cprevious, :cfirst, :clast, :cc, :copen, :cclose, :cdo and :cfdo (B194, B257, B347).
plug
Package plug is :plug, which runs <Plug>(name) as a key mapped to it does (B271).
Package plug is :plug, which runs <Plug>(name) as a key mapped to it does (B271).
recent
Package recent keeps the files windows show, newest first, in fude's state directory, and lists them for :pick recent, those under the working directory first (B213).
Package recent keeps the files windows show, newest first, in fude's state directory, and lists them for :pick recent, those under the working directory first (B213).
session
Package session keeps the working directory's session as fude quits: its windows on files, each with its cursor, top line and options, and which is current.
Package session keeps the working directory's session as fude quits: its windows on files, each with its cursor, top line and options, and which is current.
sessions
Package sessions lists the sessions sharing this fude and acts on them: :who lists the guests, :kick ends a guest's session and :follow keeps the windows on what another session shows (B250, B256).
Package sessions lists the sessions sharing this fude and acts on them: :who lists the guests, :kick ends a guest's session and :follow keeps the windows on what another session shows (B250, B256).
shell
Package shell runs commands in the user's shell: :!cmd shows what one writes, :{range}!cmd puts the range's lines through it, and :r !cmd puts what it writes below the line, as :r file puts a file's text (B156).
Package shell runs commands in the user's shell: :!cmd shows what one writes, :{range}!cmd puts the range's lines through it, and :r !cmd puts what it writes below the line, as :r file puts a file's text (B156).
spell
Package spell underlines the words its word list lacks, and goes to, fixes and adds them (B259, B260).
Package spell underlines the words its word list lacks, and goes to, fixes and adds them (B259, B260).
start
Package start shows the start screen of fude started with no file: what each key does, the recent files, and the working directory's session when it has one (B225, B226).
Package start shows the start screen of fude started with no file: what each key does, the recent files, and the working directory's session when it has one (B225, B226).
surround
Package surround puts brackets or quotes around text, as vim-surround does: ys{motion}{char}, yss{char} and S{char} in visual mode add them, ds{char} deletes them and cs{old}{new} changes them (B219).
Package surround puts brackets or quotes around text, as vim-surround does: ys{motion}{char}, yss{char} and S{char} in visual mode add them, ds{char} deletes them and cs{old}{new} changes them (B219).
task
Package task runs a project's tasks in a terminal window: config.toml's [task.<name>] tables and .fude/tasks.toml's, the justfile's recipes, the Makefile's targets and package.json's scripts (B228, B230, B231, B233).
Package task runs a project's tasks in a terminal window: config.toml's [task.<name>] tables and .fude/tasks.toml's, the justfile's recipes, the Makefile's targets and package.json's scripts (B228, B230, B231, B233).
terminal
Package terminal is :terminal, which runs a command, or the shell, in a terminal window below (B205).
Package terminal is :terminal, which runs a command, or the shell, in a terminal window below (B205).
theme
Package theme switches the colours every client draws in, with :theme, and centers the windows on a wide screen, with :center and <Plug>(theme.center) (B158, B199).
Package theme switches the colours every client draws in, with :theme, and centers the windows on a wide screen, with :center and <Plug>(theme.center) (B158, B199).
timeline
Package timeline is what lists, moves through and restores the states of a buffer's text: :timeline and its window's keys, :earlier, :later, :restore, :diff and :recover (B31, B32, B34, B35).
Package timeline is what lists, moves through and restores the states of a buffer's text: :timeline and its window's keys, :earlier, :later, :restore, :diff and :recover (B31, B32, B34, B35).
window
Package window moves to the window that way, or inside tmux, with no window that way, to tmux's pane there, as nvim-tmux-navigation does (B140).
Package window moves to the window that way, or inside tmux, with no window that way, to tmux's pane there, as nvim-tmux-navigation does (B140).
plugin module
protocol module
sdk module
syntax module
ui
term
Package term is the terminal client.
Package term is the terminal client.
vim module
Package wire is what fude and its clients send each other over the socket (D47).
Package wire is what fude and its clients send each other over the socket (D47).

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL