Expand description
Renderer-agnostic options. M.2.0b migrates these from the
pre-typed-keys imperative Option::builder() form to the
macro-driven declarative form (Design B + D from the
mode-architecture.md discussion).
Each option is a unique Rust type emitted by crate::options!.
The macro generates the crate::OptionDecl / crate::HasGroup
impls, a build_spec() helper that constructs the runtime
Option<T> via the existing builder, and a linkme
self-registration thunk submitted to crate::OPTION_DECLS.
At App boot the registry’s crate::ConfigRegistry::init_from_linkme
walks the slice and registers every option without a central
register_core_options body.
For backwards compatibility during the transitional M.2.0b/c
window, register_core_options runs init_from_linkme and
returns a CoreOptions struct populated with the typed
handles. Existing callers (config.get(core.tabstop))
continue to work unchanged. M.2.0c migrates the callers to
config.get_typed::<Tabstop>() and retires CoreOptions.
Structs§
- AiLog
- Enables capture of AI-agent output into the per-process log
rings.
:set ai.log=falsedisables capture. - AiLog
Level - Default minimum log level for AI-agent log records.
Accepted values:
error/warn/info/debug/trace. - Auto
Wrap Option - Whether typing past
textwidthbreaks the line:off,comments(the default – a long comment wraps, a long string literal does not), orall. - Autoread
- When
true(the default), a file-backed buffer refreshes when its on-disk content changes out from under the editor (vim’sautoread): an unmodified buffer reloads silently; a buffer with unsaved edits opens a diff resolver rather than clobbering either side.falsedisables external-change watching for the buffer. Non-file buffers (oil, help, synthetic) are never watched regardless. Seedocs/dev/architecture/autoread.md. - Clipboard
Enabled - When
true(default), an explicit yank (y,yy, Visualy) also copies to the system clipboard, and paste of the unnamed register reads it — the clipboard is the default yank target. Delete / change /xstay in registers and never touch the clipboard (the yank-only rule — no incidental clobber).false= pure registers; only the explicit"+/"*registers reach the clipboard. - Command
Line Expand Height - MB.2e: how tall the
:command line grows when expanded into its full-modal mini-buffer band (<C-x><C-e>).half(default) claims half the frame;fullgrows as tall as the frame allows (one pane row kept); a bare integer pins a fixed row count. Pure render policy — both peers resolve it against the live frame height viaExpandHeight::rows. - Completion
Auto Insert Single - When the completion pipeline returns exactly one candidate
at popup-open time, insert it directly instead of showing a
one-row popup. Only fires at popup-open; narrowing an
already-open popup to one candidate while typing does not
auto-insert. Disable with
:set nocompletion.auto_insert_singleto always require an explicit confirm. - Completion
Extra Commit Chars - Editor-side commit characters unioned with each LSP
server’s per-item
commitCharacters. When the insert-completion popup is open and the user types one of these characters, the focused candidate is accepted before the character is inserted. Default empty – only LSP-supplied commit chars fire. Set to e.g.".,;"to accept on any of those keys globally. - Completion
Ghost Text - Render the top-ranked candidate’s suffix as a dimmed inline overlay after the cursor while the popup is open (Phase 4.2.g.7 polish). Off by default to keep the live buffer visually quiet; turn on for a vscode-style preview of the most likely completion. Only fires when the cursor sits at end-of-line and the top candidate is a case-insensitive prefix of the typed query.
- Completion
Source Buffer Words Priority - Priority bucket for the
gen:buffer-wordsinsert-mode source. Default 100 – baseline; LSP and snippets both outrank it at tied matcher score. - Completion
Source LspPriority - Priority bucket for the
gen:lsp-completioninsert-mode completion source. Higher numbers float that source’s items above ties from lower-priority sources (docs/dev/architecture/insert-completion.md§3.4 / §3.6). Default 200; LSP-driven IDE completions usually want to win against local buffer words and snippets at tied score. - Completion
Source Path Priority - Priority bucket for the
gen:pathinsert-mode source – filesystem entries surfaced when the cursor sits inside a string literal. Default 90 per spec §3.4: below buffer-words 100 (which often matches partial paths too) and above tree-sitter 80. - Completion
Source Snippet Priority - Priority bucket for the
gen:snippetinsert-mode source. DefaultCOMPLETION_SOURCE_SNIPPET_DEFAULT_PRIORITY(150) – above buffer-words, below LSP. Per-language overrides land in 4.2.g.5 (3/3); today the value is global. - Completion
Source Tree Sitter Priority - Priority bucket for the
gen:tree-sitter-symbolinsert-mode source – definition-position identifiers pulled from the buffer’s syntax tree. Default 80, below buffer-words: when LSP is attached for the language, the LSP source has the same names with richer metadata. - Cursor
Line - Highlight the cursor’s current line with a different
background style. Vim’s
:set cursorline. Backing option forcurrent-line-highlight-mode(M.7.2). The renderer’s current-line-highlight pipeline lands in M.7.3. - Diagnostics
Inline Option - Where the inline (end-of-line virtual-text) diagnostic summary
renders:
off,cursor-line(the default — cursor line only, idle-gated, Insert-suppressed), orall(every viewport line). - Diagnostics
MinSeverity Option - Least-severe diagnostic level included in the inline summary:
error,warning,info, orhint(the default — include everything). A diagnostic shows when it is as-or-more severe. - Electric
Indent - Re-indent the current line when a closing token is typed
(
},),end,else). Honoured from IN.6. - Emacs
Keys - Enable the
emacs-keys<C-x>leader tribute. Default on.:set noemacs-keysrebuilds the leader layer empty (live), reclaiming<C-x>for vanilla Normal-mode resolution. Seedocs/dev/architecture/emacs-keys.md. - Emacs
Keys Prefix - The
emacs-keysleader prefix — the chord that opens the<C-x>tribute map (docs/dev/architecture/emacs-keys.md). Default<C-x>. Each binding isprefix + suffix, parsed viaparse_chord_sequence; a malformed value degrades to an empty tribute (warn, no panic). Live::set emacs-keys-prefix=…re-pushes the layer. - Expand
Tab - Render indentation as spaces rather than tab bytes.
- Fold
Enable - When false (
:set nofoldenable,zi), every fold renders as open regardless of its closed flag. Closed-state is preserved – toggling back restores the previous distribution. - Fold
Level - Folds nested deeper than this level are closed; the rest are
open. The outermost fold is level 1, so
foldlevel=0closes everything andfoldlevel=1shows only the top level’s structure. In a multibuffer view that means0gives one row per file and1gives one row per excerpt. - Fold
Method Option - How folds are produced:
manual(zf only),indent(auto from indentation),markdown(ATX heading nesting), orsyntax(tree-sitter cascade – markdown for.md, indent otherwise). - Format
Indent Chain - Who reindents a range for
=– an ordered chain, first available rung wins. Defaults to the tree-sitter engine. - Format
OnSave - Run the
:formatcascade before:w. A formatter that fails, exits non-zero, or times out never blocks the write – the buffer is saved unformatted. Honoured from IN.9. - Format
Prg - External formatter for
:format(vim’sformatprg). Empty (the default) falls back to the built-in per-language table. Honoured from IN.9. - Format
Reflow Chain - Who reflows a range for
gq/gw. Defaults to the built-intextwidthengine. - Format
Reformat Chain - Who reformats a range for
:format,g=and format-on-save. Defaults to the attached language server, then the built-in per-language formatter table – the exact cascade:formatcarried in Rust before RF.5, now as data. - Help
Apropos Display - Where
:apropos <pattern>opens. - Help
Describe Display - Where
:describe-command/:describe-buffer/:describe-key/:describe-option/:describe-eventopen. - Help
List Display - Where state-listing help views open (
:ls,:keymap,:options,:describe-events, …). - Help
Topic Display - Where
:help <topic>opens. - Hover
Display - Where the hover popup (
K) renders. Defaultfloating-cursor(popup floats on the doc; the doc keeps focus); user can flip topopup-cursor(focused popup) oractive-pane. - Ignore
Case - Ignore case in search patterns.
- Indent
Guides - Draw a vertical rule at each level of indentation.
- Indent
Guides Active - Draw the block enclosing the cursor in the
indent.guide.activestyle rather thanindent.guide. Off leaves every guide uniform. - Indent
Guides Char - Glyph the TUI substitutes into the guide column. The GPU peer paints a one-pixel rule instead and ignores this – a terminal cell cannot hold a hairline, so the two peers approximate the same rule with the means they have. Empty string ⇒ no guides in the TUI.
- Indent
Method Option - Where a newly created line’s indent comes from:
none(column 0),keep(copy the previous line – vim’sautoindent), orsyntax(tree-sitterindents.scm, falling back tokeep). A cascade with a named floor, so a language with no query degrades to documented vim behaviour rather than to a silent wrong answer. - Keymap
Leader - OM.2b: what
<leader>expands to in a binding string. Default<Space>— vim’s historical\\is an artifact of which keys happened to be free in 1991, and the modern vim world maps leader to space (nvim-orgmode’s documented bindings assume it). - LspDiagnostics
ToError List - EP.4 (2026-08-10): does the language server feed the core error list?
- LspLog
Capacity - Per-server log ring capacity at boot. Each LSP server
gets its own bounded ring; smaller values shed older
records sooner.
0is allowed (drops every record at the ring boundary – useful for tests / sandboxed runs) but typically users keep the 10k default. - LspLog
Display - Where
:lsp-log/:lsp-trace-logopen. Defaultactive-pane(live-tailed log buffers want to live in a real pane). - LspLog
Level - Default LSP log-record minimum level at startup.
Accepted values:
error/warn/info/debug/trace. The runtime:lsp-log-levelcommand adjusts this live; this option sets the boot value. - LspReferences
ToError List - EP.6 (2026-08-11): do references queries also populate the core error list?
- LspStatus
Display - Where
:lsp-statusopens. - Messages
Display - Where
:messagesopens. Defaultactive-pane(a transcript that streams new entries lives best in a pane the user can split / scroll independently). - Messages
Filter tracing-subscriber::EnvFilterdirective controlling whichtracing::*events the boot-installedMessagesLayercaptures into*messages*. Accepts:- Modeline
Center - Center-zone element layout (centered in the gap between Left and
Right).
auto(default) is descriptor-driven; built-ins place nothing here, so the effective default is empty. Custom / plugin elements live here. - Modeline
Left - Left-zone element layout — ordered element ids assigned to the
left (flush-left) zone, e.g.
["core.mode", "core.path"].auto(the default) uses each registered element’s own descriptor placement. An explicit list shows exactly those ids, in order; unknown ids are skipped + logged. An empty list ([]) is an explicitly-blank zone. - Modeline
Padding - Columns of blank margin at the start (before the Left zone) and
end (after the Right zone) of the modeline row — the row’s
left/right breathing room. Default 1;
0flushes content to the pane edges. - Modeline
Right - Right-zone element layout (the block is right-aligned, ids in
left→right order), e.g.
["lsp", "core.position", "core.lang"].auto(default) is descriptor-driven. - Modeline
Separator - Separator inserted between elements within a zone. A non-blank
value is auto-padded with a space on each side at render time
(so
:set ui.modeline.separator=|shows|— you give the glyph, the renderer owns the spacing). Blank (the default) ⇒ a single space between elements. - Mouse
Enabled - Whether the editor captures mouse events from the terminal.
- NoFile
- Whether the buffer is NOT backed by an on-disk file the
editor can save and should track for unsaved changes.
false(the default) means:qwarns on dirty,:wwrites to disk, and the modeline shows[+]for modified state.true(vim’s&buftype = nofile) means the buffer is a transcript / log / overlay whose content is owned by a subsystem; the dirty guard skips it and:wis a no-op.customizable = false— modes contribute the override (messages-mode,lsp-log-mode,help-mode,terminal-modesetNoFile = true); users don’t:setit directly. - Number
- Show absolute line numbers in the gutter.
- Path
Relative - Show buffer-relative paths (modeline, LSP references, etc.)
instead of absolute paths. Requires
:cdto set the base directory; falls back to absolute when no base is set. - Picker
Display - Where the picker UI is drawn.
"minibuffer"renders vertico-style: prompt sits on the cmdline row and the candidate list fans above it (TUI) / above the status line (GPUI), keeping the buffer fully visible."popup"renders a centred overlay floating over the buffer area (terminal-friendly when narrow, common in IDE-style editors). Behaviour is identical between the TUI and GPUI peers so users carry the same muscle memory across them. Future variants ("split","sidebar") may be added without breaking this key. - Picker
Grep Backend - Backend binary
:picker grepshells out to."auto"picks the first available ofrg,ag,grepin PATH at invocation time. Explicit names ("rg","ag","grep") force a specific binary and surface an error if it’s not on PATH. Future plugin-shipped backends can register additional names; the matching logic lives inlattice_picker::picker_sources::grep. - Picker
Grep MaxHits - Maximum number of grep hits to surface in one
:picker grepinvocation. Bounds memory + render time on huge codebases; users hit this rarely (typical pattern matches hundreds of lines, not thousands). - Picker
MruCap PerNamespace - Maximum number of MRU entries per (source_id) namespace. On insert past this cap the lowest-frecency entry in the namespace is evicted (prescient-style). Larger values keep long-tail usage history; smaller values keep the cache lean.
- Picker
MruEnabled - Whether picker MRU (frecency) scoring fires at all.
falsedisables both the bonus snapshot on picker-open and the record-on-accept path – pickers rank by pure match score, ignore prior usage. Persistence keeps working independently (picker.mru.persist); flipping enabled back on resumes ranking using whatever’s still in the cache. - Picker
MruPersist - Whether the MRU index persists to disk between runs.
falsekeeps MRU in-memory only; helpful for ephemeral sessions or for users who deliberately want a clean slate each launch. Defaulttruepreserves vertico- style “yesterday’s picks still float.” - Picker
MruRecency Half Life Days - Recency half-life for the frecency formula, in
days. Stored as
i64so:set picker.mru.recency-half-life-days=14Just Works through the parse-int path; the picker’sDurationmachinery converts. Smaller values bias strongly toward “today’s choices”; larger values keep historical usage relevant. - Picker
Orderless - Whether a picker query is read as a set of whitespace-
separated components (
true, the default) or as one literal token (false, the pre-orderless behaviour). - Picker
Result Display - Where the selected buffer / location lands after a
picker accept (
:diagnostics,:references,:symbol,:Files,:buffers,:lsp-server-log). Defaultactive-pane;split-h/split-vopen the pick in a new sibling pane. - Picker
Send Opens Problems - Whether sending a picker’s filtered rows to the error list with
<C-q>also opens the*problems*view over the result. - Project
Root Markers - Filenames or directory names whose presence marks a project root, in priority order. The walk starts at the buffer’s own directory and stops at the first directory containing any of these, so a crate inside a Cargo workspace is its own project.
- Read
Only - Whether the buffer is read-only (mutating operators
reject;
:wstill permits explicit writes if a path exists).customizable = falsebecause this is mode-driven, not a user-typed config: major modes likehelp-mode,file-tree-mode, and the LSP log modes contributeReadOnly = trueviaMode::options()(permode-architecture.md§6.5.3 read-only-mode pattern). Users who want to flip it on / off for a particular buffer use:enable read-only-mode, not:set read-only=true. That minor exists — it is declared inlattice_mode::modes::displayand registered with the other foundation modes; the parenthetical here used to read “when that minor mode lands in M.7” long after it had, which is enough to send a reader off to build a second one. - Relative
Number - Gutter shows distance from the cursor; the cursor’s line shows its absolute number.
- Scroll
- Lines
<C-d>/<C-u>scroll.0(vim’s default) means half the window, recomputed as the window resizes. - Scrollbind
- Synchronise scrolling across all panes that have
scrollbind=true. The option-change handler rebuilds the singleton identity-mapperPaneGroupto contain exactly the current panes withscrollbind=true. Vim’s:set scrollbind/scb. D.0b. - Scrolloff
- Minimum visual lines kept above and below the cursor when scrolling.
- Shiftwidth
- Columns added or removed per indent level – by
>/<,<C-t>/<C-d>,=, and auto-indent. Distinct fromtabstop, which is the display width of a literal tab byte: conflating them makes “change my indent size” silently reflow every file containing a hard tab. - Sidescroll
- Columns to scroll horizontally when the cursor moves off the
edge with
wrapoff.0(vim default) jumps so the cursor lands in the middle of the window; a positive value scrolls that many columns at a time. No effect whenwrapis on. - Sidescrolloff
- Minimum columns kept to the left and right of the cursor when
the view scrolls horizontally (
wrapoff). Horizontal analog ofscrolloff. Clamped to half the body width at use. - Sign
Column Option - Whether the renderer reserves the gutter sign columns
(diagnostics severity + diff sign).
yes(default) always reserves them so layout never shifts when a sign appears;nohides them. Help / synthetic buffers setnofor clean gutterless rendering — the renderer derives the column layout from this option alone, never from buffer kind / popup / pane. - Signature
Display - Where signature help renders. Same default-shape as hover (cursor-anchored floating).
- Start
OfLine - Whether
H/M/Lland on the first non-blank of their line (vim’s default) or keep the cursor’s column (nostartofline). - Tabline
Show Option - When to paint the tabline at the top of the screen.
- Tabstop
- Number of columns a hard tab character renders as. The
cells builder expands each
\tto the next multiple of this width (W.4.t). Default 4 (Lattice’s house style; vim’s historical default is 8). - Terminal
EscExits - When
true, pressing<Esc>inside Terminal-Insert exits back to Normal-in-terminal (so:q, motions, and the rest of the vim grammar are reachable without the<C-\><C-n>chord). Whenfalse,<Esc>encodes to\x1band goes to the PTY — nested programs (vim, htop, less) keep their own Esc semantics. - Terminal
Scrollback Lines - Maximum scrollback ring size (lines). Set to
0to disable scrollback entirely (saves RAM on long-running terminals with chatty output). Default10000matches the user-facingdocs/user/terminal-mode.mdtable and what most modern terminal emulators ship with. - Text
Width - Target column for reflow (
gq/gw) and for wrapping while typing. One measure for both, so the two can never disagree about where the margin is. - Transient
MaxRows - MG.41b: how many rows a transient menu may claim before it scrolls.
- Whitespace
- Show whitespace glyphs (trailing spaces, tabs, leading
indentation) as visible markers. Vim’s
:set list. Backing option forwhitespace-show-mode(M.7.2). The renderer’s whitespace-painting plumbing lands in M.7.3 – today this option is read by the cascade and the mode machinery, but the renderer doesn’t yet emit decorations. - Whitespace
Eol - Glyph at end-of-line (vim’s
eollistchar). Default empty;¬is the conventional choice. - Whitespace
Leading - Glyph for leading whitespace – non-tab indentation
at the start of a line. Mirrors emacs
whitespace-mode’sindentationhighlight. Default·. - Whitespace
Space - Glyph for plain spaces in the middle of text
(between non-whitespace characters). Most users find
this loud; default empty. Set to
·to mirror emacs’sspace-mark. - Whitespace
Tab - Glyph rendered in place of the tab character when
whitespace decoration is active. Followed by a
space-pad to the next tabstop column. Empty string ⇒
tabs render bare. Default
→. - Whitespace
Trailing - Glyph for trailing whitespace (spaces or tabs at
end-of-line). Rendered with a
trailingstyle (red by default; theme-driven). Empty ⇒ no decoration. Default·. - Wrap
- Wrap long lines visually instead of horizontal scrolling.
- Yank
Ring Size - How many entries the yank ring holds. Every yank and every delete pushes one.
Constants§
- COMPLETION_
SOURCE_ SNIPPET_ DEFAULT_ PRIORITY - SN.3g: single source for the
gen:snippetsource default priority, shared bycompletion.source.snippet.priority’s default (below) andlattice-snippet’sSnippetCompletionModecontribution, so the two can’t drift. Above buffer-words, below LSP.