Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Configuration

This page is the complete reference for user configuration. It lists every setting accepted by config.toml and languages.toml; the linked chapters explain the larger features and show more examples.

Configuration files and precedence

The user configuration directory is:

  • Linux and macOS: ~/.config/mitos
  • Windows: %AppData%\mitos

The main file is config.toml. Open it from Mitos with :config-open, then apply changes with :config-reload. On Unix, sending USR1 to the Mitos process also reloads it, for example with pkill -USR1 ms.

Pass -c <path> or --config <path> to use another config.toml:

ms --config path/to/custom-config.toml

A project may override both files with .mitos/config.toml and .mitos/languages.toml. Project values are merged over user values, which are merged over built-in defaults. Project files are loaded only after the workspace is trusted; see Workspace trust.

Important

[editor.workspace-trust] is always read from the user config.toml. A project cannot weaken the trust policy that decides whether its own files may be loaded.

Unknown config.toml editor keys are rejected. This makes misspelled settings fail visibly instead of being silently ignored.

Structure and compatibility

Settings are grouped by feature. For example, use editor.lsp.messages.enable and editor.completion.trigger-delay. Feature tables can be written explicitly or with TOML dotted keys. Editor durations are milliseconds; language-server request timeouts are seconds.

Legacy paths remain accepted, including editor.lsp.display-messages, editor.auto-format, and the old boolean or string feature shorthands. Each file is normalized before layering, so a project override wins regardless of which spelling is used. Defining the same logical setting with both spellings in one file is an error. Tables merge recursively and ordinary arrays replace the earlier value, including an explicit empty array.

Runtime commands use editor-relative paths, for example :toggle lsp.inlay-hints.enable and :set completion.trigger-delay 100. Terminal settings use terminal.*, such as :toggle terminal.true-color. Legacy command paths remain accepted; completions show canonical paths.

Configuration migration

Mitos accepts known legacy settings and converts them in memory before merging configuration layers. Startup and :config-reload leave configuration files unchanged, including files managed by Home Manager or other dotfile managers.

To update a file to the current feature sections, run:

  • :config-migrate for your user config.toml, or the file selected with -c or --config for this session.
  • :config-migrate-workspace for the current trusted project’s .mitos/config.toml.

Each command opens a confirmation dialog naming the file. Cancel is selected initially; choose Migrate to rewrite it. Escape also cancels. User and workspace migration are separate actions. Project migration changes the project’s working tree. Untrusted, stale, or excluded project configuration cannot be migrated.

Migration preserves values, comments, keybindings, and custom commands. All loaded configuration layers must validate before any rewrite. Each changed file receives an adjacent backup named config.toml.bak; existing backups are preserved with numbered suffixes such as config.toml.bak.1. Replacements are atomic and preserve file permissions and symlinks. For symlinks, the target file is updated and the backup is placed beside that target. The dialog shows the target, and a status message reports the updated file and backup path. Save or discard unsaved edits to an open configuration buffer before migrating.

Already migrated files are left unchanged, and missing files are not created. Read-only files are not rewritten. If a backup or rewrite fails, the loaded settings remain usable through compatibility aliases.

For generated or read-only configuration, export the migrated TOML:

ms --migrate-config ~/.config/mitos/config.toml --stdout > /tmp/mitos-config.toml

This command reads only the specified file, prints its migrated contents (or the original contents if no migration is needed), and creates no backups. Inspect the output and update the source managed by Home Manager or your dotfile manager. Export to a different file; redirecting stdout to the input file would truncate it.

An existing explicit workspace trust grant is updated only when the migration and its backup explain every change to the trusted configuration fingerprint. Other changes still require review and renewed trust; migration never grants trust to an untrusted project. languages.toml is unchanged.

config.toml reference

config.toml accepts five top-level entries:

KeyTypeDefaultDescription
themestring or table{ light = "modus_operandi", dark = "modus_vivendi" }Theme name, or { light = "...", dark = "...", fallback = "..." }. fallback is optional and defaults to dark. See Themes.
editortableSee belowShared editor behavior and UI settings.
terminaltableSee belowTerminal capabilities, keyboard protocol, and external launcher.
keystableBuilt-in keymapPer-mode key bindings under [keys.normal], [keys.insert], and [keys.select]. Entries are merged with the built-in keymap. See Key remapping.
commandstable{}User-defined command-mode commands. See Custom commands.

Example:

theme = "onedark"

[editor]
line-number = "relative"
mouse.enable = false
icons = true # Requires a Nerd Font.

[editor.cursor.shape]
insert = "bar"
normal = "block"
select = "underline"

[keys.normal]
C-s = ":write"

[commands]
":wq" = [":write", ":quit"]

[editor]

For examples and behavioral details, see the Editor chapter.

KeyType / accepted valuesDefaultDescription
welcome-screenbooleantrueShow the welcome screen when Mitos starts without a file.
shellarray of stringsUnix: ["sh", "-c"]; Windows: ["cmd", "/C"]Command prefix used to execute shell commands.
line-number"absolute" or "relative""absolute"Line-number display mode. Relative numbers become absolute in insert mode and when the view is unfocused.
guttersarray or table["diagnostics", "spacer", "line-numbers", "spacer", "diff"]Gutter layout and options. See [editor.gutters].
auto-pairstable{ enable = true }Insert matching delimiters. See [editor.auto-pairs].
spellingtableDisabledDictionaries, accepted words, and token filters. See [editor.spelling].
text-widthinteger80Width used by :reflow and optionally soft wrapping.
idle-timeoutmilliseconds250Idle delay used by editor UI timers.
continue-commentsbooleantrueContinue a line comment when Enter creates a new line inside it.
auto-infobooleantrueDisplay contextual information popups.
iconsbooleanfalseShow UI icons. The glyphs require a Nerd Font.
file-pickertableSee belowFile-picker and global-search traversal. See [editor.file-picker].
file-explorertableSee belowFile-explorer traversal. See [editor.file-explorer].
buffer-pickertableSee belowInitial selection in the buffer picker. See [editor.buffer-picker].
statuslinetableSee belowStatusline layout and labels. See [editor.statusline].
searchtableSee belowSearch matching and wrap behavior. See [editor.search].
lsptableSee belowGlobal LSP behavior. See [editor.lsp].
rulersarray of integers[]Columns at which to draw rulers; a language may override this.
whitespacetableSee belowVisible whitespace rendering. See [editor.whitespace].
breadcrumbtableSee belowBreadcrumb navigation bar. See [editor.breadcrumb].
indent-guidestableSee belowVertical indentation guides. See [editor.indent-guides].
soft-wraptableSee belowSoft wrapping. See [editor.soft-wrap].
jump-label-alphabetstring of unique characters"abcdefghijklmnopqrstuvwxyz"Alphabet used to generate two-character jump labels. Earlier characters are used first.
inline-blametableSee belowGit blame rendered at the end of buffer lines. See [editor.inline-blame].
workspace-trusttableSee belowImplicit workspace trust policy. See [editor.workspace-trust].
bufferlinetableSee belowSee [editor.bufferline].
clipboardtableSee belowSee [editor.clipboard].
completiontableSee belowSee [editor.completion].
cursortableSee belowSee [editor.cursor].
diagnosticstableSee belowSee [editor.diagnostics].
filestableSee belowSee [editor.files].
formattableSee belowSee [editor.format].
indenttableSee belowSee [editor.indent].
inline-completiontableSee belowSee [editor.inline-completion].
mousetableSee belowSee [editor.mouse].
rainbow-bracketstableSee belowSee [editor.rainbow-brackets].
scrolltableSee belowSee [editor.scroll].

[editor.scroll]

KeyType / accepted valuesDefaultDescription
paddinginteger5Minimum screen lines kept above and below the cursor when possible.
wheel-linesinteger3Lines moved by one scroll-wheel step.

[editor.mouse]

KeyType / accepted valuesDefaultDescription
enablebooleantrueEnable mouse input.
yank-registercharacter"*"Register used for selections made with the mouse.
middle-click-pastebooleantruePaste the primary selection on middle click.

[editor.clipboard]

KeyType / accepted valuesDefaultDescription
default-yank-registercharacter"\""Register used by yank and paste commands when none is selected explicitly.
providerprovider name or custom tableAuto-detectedClipboard integration. See [editor.clipboard.provider].

[editor.cursor]

KeyType / accepted valuesDefaultDescription
highlight-linebooleanfalseHighlight every line containing a cursor.
highlight-columnbooleanfalseHighlight every column containing a cursor.
shapetableAll modes "block"Cursor shape by mode. See [editor.cursor.shape].

[editor.completion]

KeyType / accepted valuesDefaultDescription
auto-triggerbooleantrueShow completion automatically.
wordtable{ enable = true, trigger-length = 7 }Complete words from open buffers. See [editor.completion.word].
trigger-delaymilliseconds250Delay after typing a word character before completion is shown; use 5 for effectively immediate completion.
preview-insertbooleantrueTemporarily insert the selected completion item while browsing the menu.
trigger-lengthinteger2Minimum word length that triggers automatic completion.
replacebooleanfalseAsk LSP completions to replace the whole word instead of only the text before the cursor.

Path completion is configured by path.enable (default true); word completion has its own [editor.completion.word] table.

[editor.completion.path]

KeyType / accepted valuesDefaultDescription
enablebooleantrueComplete filesystem paths recognized at the cursor.

[editor.format]

KeyType / accepted valuesDefaultDescription
on-savebooleantrueFormat on save when the current language also enables auto-format.

[editor.files]

KeyType / accepted valuesDefaultDescription
auto-savetableDisabledSave on focus loss and/or after a delay. See [editor.files.auto-save].
reloadtableSee belowReload buffers when files change externally. See [editor.files.reload].
watchtableSee belowNative file watching, traversal, and Git refreshes. See [editor.files.watch].
default-line-ending"native", "lf", "crlf", "ff", "cr", or "nel""native"Line ending for new documents. The last three values require the unicode-lines build feature.
editor-configbooleantrueApply supported settings from .editorconfig files.

Saving, autosave, reloads, and native watching are configured in the save, auto-save, reload, and watch subsections.

[editor.inline-completion]

KeyType / accepted valuesDefaultDescription
trigger-delaymilliseconds150Delay after editing before requesting LSP ghost text.
auto-triggerbooleantrueRequest LSP ghost text automatically in insert mode.

[editor.bufferline]

KeyType / accepted valuesDefaultDescription
show"never", "always", or "multiple""never"When to show open buffers at the top of the editor.

[editor.files.save]

KeyType / accepted valuesDefaultDescription
insert-final-newlinebooleantrueAdd a final line ending on write when missing.
atomicbooleantrueWrite through a temporary file and replace the original. Safer against interruption, but may confuse file watchers.
trim-final-newlinesbooleanfalseRemove line endings after the final line ending on write.
trim-trailing-whitespacebooleanfalseRemove whitespace before line endings on write.

[editor.indent]

The smart-tab subsection controls syntax-aware Tab behavior.

KeyType / accepted valuesDefaultDescription
smart-tabtableSee belowSyntax-aware Tab behavior. See [editor.indent.smart-tab].
heuristic"simple", "tree-sitter", or "hybrid""hybrid"Indentation strategy. Unavailable strategies fall back from hybrid to tree-sitter to simple.

[editor.diagnostics]

KeyType / accepted valuesDefaultDescription
inlinetableSee belowDiagnostics rendered within buffer text. See [editor.diagnostics.inline].
end-of-linetable{ severity = "hint" }End-of-line diagnostic severity.

[editor.diagnostics.end-of-line]

KeyType / accepted valuesDefaultDescription
severity"disable", "hint", "info", "warning", or "error""hint"Minimum severity shown at the end of a line.

[editor.rainbow-brackets]

KeyType / accepted valuesDefaultDescription
enablebooleanfalseColor matching bracket levels. The language needs a rainbows.scm query.

[editor.breadcrumb]

KeyType / accepted valuesDefaultDescription
enablebooleanfalseShow the breadcrumb bar.
path"full", "file", or "none""full"Include the full path, only the file name, or no path before symbols.

[editor.clipboard.provider]

Set provider to "pasteboard", "wayland", "x-clip", "x-sel", "win32-yank", "tmux", "windows", "termux", "termcode", or "none". Availability is platform- and build-dependent. Without an explicit value, Mitos selects a usable provider from the current platform and environment.

A custom provider uses this shape:

[editor.clipboard.provider.custom]
yank = { command = "copy-command", args = ["--clipboard"] }
paste = { command = "paste-command", args = ["--clipboard"] }
yank-primary = { command = "copy-command", args = ["--primary"] }   # optional
paste-primary = { command = "paste-command", args = ["--primary"] } # optional

yank and paste are required. Every command has a required command string and optional args array (default []). Mitos sends yanked text to stdin and reads pasted text from stdout. yank-primary and paste-primary are optional; they handle the primary selection where the platform has one.

[editor.statusline]

Each view has its own statusline by default. Set global = true to show a single statusline at the bottom of the editor for the focused view.

KeyTypeDefault
globalbooleanfalse
leftarray of element names["mode", "spinner", "branch", "file-name", "read-only-indicator", "file-modification-indicator"]
rightarray of element names["diagnostics", "selections", "register", "position", "file-encoding"]
separatorstring"│"
mode.colorbooleanfalse
mode.normalstring"NOR"
mode.insertstring"INS"
mode.selectstring"SEL"
diagnosticsseverity array["warning", "error"]
workspace-diagnosticsseverity array["warning", "error"]

Valid elements and their behavior are listed in the statusline section.

[editor.lsp]

KeyTypeDefaultDescription
enablebooleantrueEnable LSP integration globally.
workspace-rootsarray of paths[]Workspace-relative directories that stop LSP root discovery.
progress.enablebooleanfalseShow $/progress messages below the statusline.
messages.enablebooleantrueShow window/showMessage messages below the statusline.
signature-help.auto-triggerbooleantrueOpen signature help automatically.
signature-help.show-documentationbooleantrueShow documentation in signature help.
inlay-hints.enablebooleanfalseRender inlay hints. The server may also require configuration.
document-highlight.auto-triggerbooleantrueHighlight references to the symbol at the cursor.
inlay-hints.length-limitnon-zero integer or unsetUnsetTruncate displayed inlay hints to this length.
color-swatches.enablebooleantrueRender swatches beside document colors.
code-lenses.enablebooleantrueShow code lens labels at the end of each line, resolving visible lenses automatically. Labels use space left by diagnostics and are clipped without wrapping. Gutter indicators and Space+l provide access to the full commands.
completion.snippetsbooleantrueAdvertise and insert LSP snippet completions. A server restart is required after changing it.
references.include-declarationbooleantrueInclude a symbol’s declaration in reference results.

The dotted paths above are feature subsections. For example:

[editor.lsp.messages]
enable = true

[editor.lsp.signature-help]
auto-trigger = true
show-documentation = false

[editor.lsp.inlay-hints]
enable = true
length-limit = 40

[editor.cursor.shape]

normal, insert, and select each accept "block", "bar", "underline", or "hidden"; all default to "block". Terminals can change only the primary cursor’s shape.

[editor.files.reload]

Mitos reloads unmodified buffers when their files change externally, preserving undo history and updating selections in every split. If a buffer has unsaved changes, a prompt offers Enter to reload or Esc to keep the buffer. The same external change prompts only once. Deleted files keep their open buffers; recreating the file can trigger another reload.

KeyDefaultDescription
enabletrueAutomatically reload files changed on disk.
prompt-if-modifiedtruePrompt before reloading a buffer with unsaved changes. When disabled, show a warning instead.
poll.enabletruePeriodically check open files outside native watcher coverage and Git metadata.
poll.interval30000Polling interval in milliseconds, with a minimum of 100.

Files outside watched roots, hidden or ignored files, and files beyond the depth limit are checked when the terminal regains focus and by periodic polling. This also provides a fallback when a native watcher cannot start. Focus checks remain active when poll.enable is false. Git refreshes use the same polling schedule and can continue when buffer auto-reload is disabled.

[editor.files.reload]
enable = true
prompt-if-modified = true

[editor.files.reload.poll]
enable = true
interval = 30000

[editor.files.watch]

Native file events also notify language servers registered for file creation, changes, and deletion. Relative LSP patterns may add watch roots outside the current workspace. Recursive watching defaults to workspaces so starting Mitos in a home directory does not watch the entire home directory.

KeyDefaultDescription
enabletrueEnable native recursive file watching. Buffer polling and focus checks can still run when disabled.
watch-vcstrueRefresh branch names and diff gutters when Git HEAD or branch references change, including linked worktrees.
require-workspacetrueAutomatically watch the working directory only when a workspace is found. Explicit LSP roots are still allowed.
hiddentrueExclude hidden paths, apart from editor/build configuration and the Git metadata needed for refreshes.
ignoretrueRead .ignore files.
git-ignoretrueRead .gitignore files, including nested files.
git-globaltrueRead Git’s global ignore file.
max-depth10Maximum path depth below a watch root. Deeper open files use polling.

The global Mitos ignore file and .mitos/ignore also apply. For watcher-specific rules, use filesentryignore in the Mitos configuration directory or .mitos/filesentryignore in the workspace. These use gitignore syntax and take priority over the other filters. Changes to workspace ignore files refresh the watcher’s filters. Configuration reloads and :cd update watch coverage.

[editor.files.watch]
enable = true
watch-vcs = true
require-workspace = true
hidden = true
ignore = true
git-ignore = true
git-global = true
max-depth = 10

[editor.file-picker]

KeyTypeDefaultDescription
hiddenbooleantrueIgnore hidden files.
follow-symlinksbooleantrueFollow symbolic links.
deduplicate-linksbooleantrueHide links to files already present in results.
parentsbooleantrueRead ignore files from parent directories.
ignorebooleantrueRead .ignore files.
git-ignorebooleantrueRead .gitignore files.
git-globalbooleantrueRead Git’s global excludes file.
git-excludebooleantrueRead .git/info/exclude.
max-depthinteger or unsetUnsetMaximum directory recursion depth.

[editor.file-explorer]

KeyTypeDefaultDescription
hiddenbooleanfalseIgnore hidden files.
follow-symlinksbooleanfalseFollow symbolic links.
parentsbooleanfalseRead ignore files from parent directories.
ignorebooleanfalseRead .ignore files.
git-ignorebooleanfalseRead .gitignore files.
git-globalbooleanfalseRead Git’s global excludes file.
git-excludebooleanfalseRead .git/info/exclude.

[editor.buffer-picker]

KeyType / accepted valuesDefaultDescription
start-position"current" or "previous""current"Initially select the current buffer or the previously focused buffer.

[editor.auto-pairs]

enable defaults to true. Omit pairs to use the built-in delimiter pairs. A pairs table maps each single opening character to its closing character; an empty map enables no pairs. enable = false disables pairing while retaining any configured pairs.

[editor.auto-pairs]
enable = true
pairs = { '(' = ')', '[' = ']', '{' = '}', '"' = '"' }

Legacy booleans and direct character maps remain accepted.

[editor.files.auto-save]

KeyTypeDefaultDescription
focus-lostbooleanfalseSave when terminal focus moves away from Mitos.
after-delay.enablebooleanfalseSave after no edits occur for the configured delay.
after-delay.timeoutmilliseconds3000Delay used when after-delay.enable is true.

The legacy shorthand editor.auto-save = true enables only focus-lost; it does not enable delayed saving.

[editor.search]

KeyTypeDefaultDescription
smart-casebooleantrueSearch case-insensitively unless the pattern contains an uppercase character.
wrap-aroundbooleantrueContinue at the other end of the document after the last match.

[editor.whitespace]

KeyType / accepted valuesDefaultDescription
render"none", "all", or table"none"Render all whitespace uniformly, or configure kinds separately.
render.default"none" or "all""none"Fallback for omitted per-kind rendering values.
render.space"none" or "all"Inherits defaultRender ordinary spaces.
render.nbsp"none" or "all"Inherits defaultRender non-breaking spaces.
render.nnbsp"none" or "all"Inherits defaultRender narrow non-breaking spaces.
render.tab"none" or "all"Inherits defaultRender tabs.
render.newline"none" or "all"Inherits defaultRender line endings.
characters.spacecharacter"·"Glyph for a space.
characters.nbspcharacter"⍽"Glyph for a non-breaking space.
characters.nnbspcharacter"␣"Glyph for a narrow non-breaking space.
characters.tabcharacter"→"Glyph at the start of a tab.
characters.tabpadcharacter" "Glyph used to fill the rest of a tab.
characters.newlinecharacter"⏎"Glyph for a line ending.

[editor.indent-guides]

KeyTypeDefaultDescription
renderbooleanfalseRender vertical indent guides.
charactercharacter"│"Guide glyph.
skip-levelsinteger0Indentation levels to omit before drawing guides.

[editor.gutters]

KeyTypeDefaultDescription
layoutarray["diagnostics", "spacer", "line-numbers", "spacer", "diff"]Ordered gutter components. Accepted names are diagnostics, line-numbers, spacer, diff, and code-action-hint.
line-numbers.min-widthinteger3Minimum width of the line-number gutter.

diagnostics, diff, spacer, and code-action-hint currently have no component-specific settings.

[editor.soft-wrap]

KeyTypeDefaultDescription
enablebooleanfalseWrap lines wider than the view.
max-wrapinteger20Maximum free columns used to find a word boundary. Also limited to one quarter of the viewport.
max-indent-retaininteger40Maximum indentation carried onto wrapped lines. Also limited to one quarter of the viewport.
wrap-indicatorstring"↪ "Text shown before continuation lines.
wrap-at-text-widthbooleanfalseWrap at editor.text-width when it is narrower than the viewport.

[editor.indent.smart-tab]

KeyTypeDefaultDescription
enablebooleantrueMove to the end of the parent syntax node when non-whitespace precedes the cursor; otherwise insert indentation.
supersede-menubooleanfalseGive smart-tab precedence over completion-menu navigation.

[editor.inline-blame]

KeyTypeDefaultDescription
showstring"never"Display blame on "cursor-line", "all-lines", or hide it with "never".
formatstring"{author}, {time-ago} • {title} • {commit}"Blame message format. See inline blame formatting.

Press Space + B to toggle inline blame off and on, preserving your choice of "all-lines" or "cursor-line". If you have not chosen a display mode, turning it on uses "cursor-line". Blank lines and lines with uncommitted changes do not show inline blame.

[editor.diagnostics.inline]

Severity settings accept "disable", "hint", "info", "warning", or "error".

KeyTypeDefaultDescription
cursor-lineseverity"warning"Minimum severity rendered inline on the primary cursor line. Disabled in insert mode and delayed briefly after moving lines.
other-linesseverity"disable"Minimum severity rendered inline on other lines.
min-diagnostic-widthinteger40Minimum columns reserved for diagnostic text; inline diagnostics are hidden if the view cannot provide this plus the prefix.
prefix-leninteger1Horizontal bars rendered before diagnostic text.
max-wrapinteger20Maximum free columns used to wrap diagnostic text.
max-diagnosticsinteger10Maximum inline diagnostics rendered for one line.

[editor.spelling]

Global options for spell checking. See the Spell checking chapter for the full feature details.

KeyDescriptionDefault
languagesThe dictionaries to check every document against (e.g. ["en_US"]). Empty disables spell checking.[]
wordsExtra accepted words, matched case-insensitively, in addition to the dictionaries.[]
ignore-regexesTokens matching any of these regexes are not checked (for example "^[A-Z0-9_]+$" to skip CONSTANTS).[]
min-word-lengthTokens shorter than this are not checked.1

Per-language settings in languages.toml override these: languages and min-word-length replace the global value, while words and ignore-regexes are added to the global lists.

Example:

[editor.spelling]
languages = ["en_US"]
words = ["Mitos", "tokio"]
ignore-regexes = ["^[A-Z0-9_]+$"]

[editor.completion.word]

KeyTypeDefaultDescription
enablebooleantrueComplete words found in open buffers.
trigger-lengthnon-zero integer7Word length at which this completion source activates.

[terminal]

KeyType / accepted valuesDefaultDescription
true-colorbooleanfalseForce true-color support when detection produces a false negative.
undercurlbooleanfalseForce undercurl support when detection produces a false negative.
keyboard.kitty-protocol"auto", "enabled", or "disabled""auto"Policy for the Kitty enhanced keyboard protocol.
launchertableEnvironment-dependentExternal terminal or multiplexer command. See below.

[terminal.launcher]

KeyTypeDefaultDescription
commandstringEnvironment-dependentExternal terminal or multiplexer executable.
argsarray of strings[]Arguments placed before the command Mitos asks the terminal to run.

Mitos automatically uses a tmux split inside tmux, a WezTerm split when its Unix socket is available, Windows Terminal when found on Windows, or Conhost as the Windows fallback. On other terminals this setting is unset unless configured.

[editor.workspace-trust]

KeyType / accepted valuesDefaultDescription
level"none", "servers", or "insecure""servers"What may run without a per-workspace grant. servers permits LSP and DAP processes but still gates project config and repository-local Git configuration.
promptbooleantrueShow the trust modal. The restricted-workspace indicator is independent of this setting.
trustedarray of glob strings[]Trust matching workspace paths without a grant. This skips .mitos change detection and should be used cautiously.

This table is user-scope only. See Workspace trust for the security model and recommended configurations.

[keys]

[keys.normal], [keys.insert], and [keys.select] are maps whose keys are key names and whose values are a static command, a :typable-command, a key macro beginning with @, a sequence of commands, or another table forming a minor mode. There is no fixed list of entries: omitted bindings retain their built-in value. See Key remapping for key syntax and examples.

[commands]

Each key defines a command-mode command. Its value is one command string, an array of command strings, or a table with these settings:

KeyTypeDefaultDescription
commandsarray of stringsRequiredBuilt-in typable/static commands to execute in order. A key macro may be used only by itself.
descstring or unsetUnsetMarkdown description displayed in command help.
acceptsstring or unsetUnsetArgument placeholder shown in command help.
completerbuilt-in typable command or unsetUnsetReuse that command’s argument completion.

See Custom commands for argument expansion, visibility, and built-in-command shadowing.

languages.toml reference

languages.toml has three top-level entries: [[language]] definitions, [language-server.<name>] definitions, and [[grammar]] sources. The optional use-grammars selector affects grammar fetch/build commands. User and trusted project entries are merged over the built-in language definitions.

Defaults below are schema fallbacks for a newly defined language. A built-in language may already set a different effective value before user and project overrides are merged.

See Languages for file detection, root selection, LSP feature routing, formatters, and complete examples.

languages.toml retains its existing keys, including auto-format, path-completion, and word-completion. The feature-table restructuring applies to config.toml for now.

[[language]]

KeyType / defaultDescription
namestring; requiredLanguage name and merge key.
language-idstring; defaults to nameLanguage identifier sent to language servers.
scopestring; required for a new languageTextMate-style scope such as source.rust.
file-typesarray; required for a new languageFile extensions or { glob = "..." } matchers.
shebangsstring array; []Interpreter names recognized in shebangs.
rootsglob array; []Markers used to choose an LSP working directory.
comment-tokensstring or string array; unsetLine-comment tokens. comment-token is accepted as a compatibility alias.
block-comment-tokenstable or table array; unset{ start = "...", end = "..." } pairs for block comments.
text-widthinteger; inherits editorLanguage override for editor.text-width.
soft-wraptable; inherits editorLanguage override using the same keys as editor.soft-wrap.
auto-formatboolean; inherits editorPermit formatting this language on save. Global editor.format.on-save must also be enabled.
code-actions-on-savestring array; unsetLSP code-action kinds run in order on save.
formattertable; unsetExternal formatter. command is required; args defaults to [].
path-completionboolean; inherits editorOverride editor.completion.path.enable.
spellingtable; inherits editorlanguages and min-word-length replace global values; words and ignore-regexes extend them. See spell checking.
word-completiontable; inherits editorOverride enable and/or trigger-length from editor.completion.word.
diagnostic-severity"hint", "info", "warning", or "error"; "hint"Minimum accepted diagnostic severity.
grammarstring; defaults to nameTree-sitter grammar name.
injection-regexregex string; unsetMatch this language at tree-sitter injection sites.
language-serversarray; []Server names or { name = "...", only-features = [...], except-features = [...] } entries.
indenttable; unsetRequires tab-width from 1 through 16 and unit, the inserted indentation string.
debuggertable; unsetDebug adapter definition. See below.
auto-pairsboolean or character map; inherits editorLanguage-specific delimiter pairs.
rulersinteger array; inherits editorLanguage-specific ruler columns.
workspace-lsp-rootspath array; inherits editorLanguage-specific workspace-relative LSP search ceilings.
persistent-diagnostic-sourcesstring array; []Diagnostic sources whose unchanged diagnostics Mitos may track across edits.
rainbow-bracketsboolean; inherits editorLanguage override for rainbow brackets.

[language.debugger]

See Debugging (DAP) for setup, launch templates, and debugging commands.

KeyType / defaultDescription
namestring; requiredAdapter name.
transport"stdio" or "tcp"; requiredHow Mitos communicates with the adapter.
commandstring; ""Adapter executable.
argsstring array; []Adapter arguments.
port-argstring; unsetFor TCP, an argument template whose {} is replaced with an ephemeral local port.
templatesarray; requiredLaunch/attach templates exposed by Mitos.
quirks.absolute_pathsboolean; falseTreat paths received from the adapter as absolute. This key retains its underscore spelling.

Each [[language.debugger.templates]] has required name, request, and adapter-specific args values. Optional completion entries are either a string or { name = "...", completion = "...", default = "..." }; all three fields in that detailed form are optional.

[language-server.<name>]

KeyType / defaultDescription
commandstring; requiredServer executable. It must be available on PATH unless an absolute path is used.
argsstring array; []Server arguments.
environmentstring map; {}Environment variables supplied to the server.
configtable; unsetServer-specific initialization/settings object.
timeoutseconds; 20Maximum request duration.
required-root-patternsglob array; unsetStart the server only if at least one pattern exists in the selected LSP root. This validates a root; it does not select one.

[[grammar]] and use-grammars

KeyTypeDescription
use-grammars.onlystring arrayFetch/build only the named grammars. Mutually exclusive with except.
use-grammars.exceptstring arrayFetch/build every grammar except those named. Mutually exclusive with only.
grammar.namestringGrammar name.
grammar.source.gitURLGit repository containing the grammar.
grammar.source.revstringCommit or tag to fetch. Required with git.
grammar.source.subpathpathOptional subdirectory within a multi-grammar repository.
grammar.source.pathpathLocal grammar directory, as an alternative to the Git source keys.

use-grammars must appear before the array-of-table declarations in TOML. When omitted, every configured grammar is fetched and built.

Inline completions

Language servers supporting textDocument/inlineCompletion can suggest ghost text in insert mode. Mitos uses the first configured server with the inline-completion feature. Suggestions leave the document unchanged until accepted and disappear when you edit, move the cursor, leave insert mode, or switch documents. Requests pause while the completion popup is previewing an item.

Add bindings to config.toml to accept, dismiss, request, or cycle suggestions:

[keys.insert]
C-y = "inline_completion_accept"
C-e = "inline_completion_dismiss"
C-g = "inline_completion_trigger"
A-n = "inline_completion_next"
A-p = "inline_completion_prev"

There are no default bindings. Set editor.inline-completion-auto-trigger = false to request suggestions only with inline_completion_trigger. Plain text suggestions can span multiple lines; snippet suggestions and multiple cursors are not supported. Ghost text uses the ui.virtual.inline-completion theme scope, falling back to ui.virtual.inlay-hint.