Lua API
These are the type definitions riptide --lua-types prints for lua-language-server. They document everything config.lua can use: the c settings proxy and the rt.* functions. Lua explains how to use them.
---@meta
---@diagnostic disable: missing-fields
-- Type definitions for riptide's config.lua, for lua-language-server.
-- Generated by `riptide --lua-types`; do not edit.
---@alias rt.Mode "normal"|"insert"|"command"|"passthrough"|"hint"|"prompt"|"yesno"|"set_mark"|"jump_mark"|"record_macro"|"run_macro"|"caret"
---@alias rt.SettingName "aliases"|"auto_save.interval"|"auto_save.session"|"bindings.key_mappings"|"changelog_after_upgrade"|"colors.completion.category.bg"|"colors.completion.category.fg"|"colors.completion.description.fg"|"colors.completion.fg"|"colors.completion.item.selected.bg"|"colors.completion.item.selected.fg"|"colors.completion.match.fg"|"colors.completion.odd.bg"|"colors.hints.bg"|"colors.hints.border"|"colors.hints.fg"|"colors.hints.match.fg"|"colors.keyhint.suffix.fg"|"colors.messages.error.bg"|"colors.messages.error.fg"|"colors.messages.warning.bg"|"colors.messages.warning.fg"|"colors.prompts.bg"|"colors.prompts.border"|"colors.prompts.fg"|"colors.prompts.key.bg"|"colors.statusbar.insert.bg"|"colors.statusbar.insert.fg"|"colors.statusbar.normal.bg"|"colors.statusbar.normal.fg"|"colors.statusbar.passthrough.bg"|"colors.statusbar.passthrough.fg"|"colors.statusbar.private.bg"|"colors.statusbar.private.fg"|"colors.statusbar.url.error.fg"|"colors.statusbar.url.success.http.fg"|"colors.statusbar.url.success.https.fg"|"colors.tabs.bar.bg"|"colors.tabs.even.bg"|"colors.tabs.indicator.error"|"colors.tabs.indicator.start"|"colors.tabs.odd.bg"|"colors.tabs.odd.fg"|"colors.tabs.pinned.odd.bg"|"colors.tabs.pinned.odd.fg"|"colors.tabs.selected.accent"|"colors.tabs.selected.odd.bg"|"colors.tabs.selected.odd.fg"|"colors.webpage.bg"|"colors.webpage.darkmode.enabled"|"colors.webpage.preferred_color_scheme"|"completion.cmd_history_max_items"|"completion.delay"|"completion.height"|"completion.min_chars"|"completion.open_categories"|"completion.quick"|"completion.show"|"completion.shrink"|"completion.timestamp_format"|"completion.use_best_match"|"completion.web_history.exclude"|"completion.web_history.max_items"|"confirm_quit"|"content.autoplay"|"content.blocking.adblock.lists"|"content.blocking.adblock.rules"|"content.blocking.enabled"|"content.blocking.whitelist"|"content.cache.size"|"content.call_mute_keys"|"content.call_sites"|"content.canvas_reading"|"content.cookies.accept"|"content.cookies.store"|"content.desktop_capture"|"content.dns_prefetch"|"content.geolocation"|"content.headers.accept_language"|"content.headers.custom"|"content.headers.do_not_track"|"content.headers.referer"|"content.headers.user_agent"|"content.images"|"content.javascript.can_close_tabs"|"content.javascript.can_open_tabs_automatically"|"content.javascript.clipboard"|"content.javascript.enabled"|"content.javascript.log_message.levels"|"content.local_content_can_access_file_urls"|"content.media.audio_capture"|"content.media.video_capture"|"content.mouse_lock"|"content.mute"|"content.notifications.app_name"|"content.notifications.enabled"|"content.notifications.presenter"|"content.notifications.show_origin"|"content.notifications.site_icon"|"content.notifications.timeout"|"content.notifications.urgency"|"content.pdf_viewer"|"content.prefers_reduced_motion"|"content.proxy"|"content.register_protocol_handler"|"content.tls.certificate_errors"|"content.unknown_url_scheme_policy"|"content.user_stylesheets"|"content.webgl"|"content.webrtc_ip_handling_policy"|"content.widevine"|"crash_report.email"|"downloads.location.directory"|"downloads.location.prompt"|"downloads.location.remember"|"downloads.location.suggestion"|"downloads.open_dispatcher"|"downloads.remove_finished"|"editor.command"|"editor.remove_file"|"extensions.load"|"fileselect.folder.command"|"fileselect.handler"|"fileselect.multiple_files.command"|"fileselect.single_file.command"|"fonts.completion.category"|"fonts.completion.entry"|"fonts.default_family"|"fonts.default_size"|"fonts.hints"|"fonts.keyhint"|"fonts.prompts"|"fonts.statusbar"|"fonts.tabs.selected"|"fonts.tabs.unselected"|"fonts.web.family.fixed"|"fonts.web.family.sans_serif"|"fonts.web.family.serif"|"fonts.web.family.standard"|"fonts.web.size.default"|"fonts.web.size.default_fixed"|"fonts.web.size.minimum"|"hints.auto_follow"|"hints.auto_follow_timeout"|"hints.chars"|"hints.dictionary"|"hints.hide_unmatched_rapid_hints"|"hints.leave_on_load"|"hints.min_chars"|"hints.mode"|"hints.next_regexes"|"hints.padding"|"hints.prev_regexes"|"hints.radius"|"hints.scatter"|"hints.selectors"|"hints.uppercase"|"input.forward_unbound_keys"|"input.insert_mode.auto_enter"|"input.insert_mode.auto_leave"|"input.insert_mode.auto_load"|"input.insert_mode.leave_on_load"|"input.match_counts"|"input.media_keys"|"input.mode_override"|"input.mouse.rocker_gestures"|"input.partial_timeout"|"input.spatial_navigation"|"keyhint.blacklist"|"keyhint.delay"|"messages.timeout"|"new_instance_open_target"|"new_instance_open_target_window"|"plugins.catalog"|"plugins.check_interval"|"prompt.position"|"prompt.width"|"scrolling.bar"|"scrolling.smooth"|"search.ignore_case"|"search.incremental"|"search.wrap"|"search.wrap_messages"|"session.default_name"|"session.lazy_restore"|"spellcheck.languages"|"statusbar.padding"|"statusbar.position"|"statusbar.show"|"statusbar.widgets"|"tabs.close_mouse_button"|"tabs.close_mouse_button_on_bar"|"tabs.favicons.show"|"tabs.indicator.width"|"tabs.last_close"|"tabs.max_width"|"tabs.min_width"|"tabs.mode_on_change"|"tabs.mousewheel_switching"|"tabs.new_position.related"|"tabs.new_position.unrelated"|"tabs.padding"|"tabs.pinned.close"|"tabs.pinned.frozen"|"tabs.pinned.shrink"|"tabs.position"|"tabs.select_on_remove"|"tabs.show"|"tabs.show_switching_delay"|"tabs.tabs_are_windows"|"tabs.title.alignment"|"tabs.title.format"|"tabs.title.format_pinned"|"tabs.tooltips"|"tabs.undo_stack_size"|"tabs.width"|"tabs.wrap"|"ui.auto_theme.dark"|"ui.auto_theme.light"|"ui.overlay.position"|"ui.overlay.width"|"ui.theme"|"url.auto_search"|"url.default_page"|"url.incdec_segments"|"url.open_base_url"|"url.searchengines"|"url.start_pages"|"url.yank_ignored_parameters"|"window.hide_decoration"|"window.title_format"|"zoom.default"|"zoom.levels"
---@alias rt.Event "startup"|"quit"|"load_started"|"load_finished"|"url_changed"|"title_changed"|"tab_opened"|"tab_closed"|"tab_selected"|"window_opened"|"window_closed"|"mode_changed"|"setting_changed"|"download_started"|"download_finished"
---@class rt
---@field platform "linux"|"macos"|"windows"
---@field version string
---@field config_dir string
---@field data_dir string
rt = {}
---@deprecated `hb` is the old name of `rt`.
hb = rt
---Set an option; `c.name = value` does the same. With `pattern` (e.g.
---`"*.example.com"` or `"https://meet.example.com"`), only for matching pages;
---this works for the content.* permission settings and content.blocking.enabled.
---@param name rt.SettingName
---@param value any
---@param pattern? string
function rt.set(name, value, pattern) end
---Get an option's current value.
---@param name rt.SettingName
---@return any
function rt.get(name) end
---Define a theme for `ui.theme` and `:theme`, like a `themes/<name>.toml`
---file: `palette` holds base, surface, fg, accent, yellow, red, green and blue
---(and optionally surface2, surface3, muted, orange) as `#rrggbb`, and
---`colors` any `colors.*` setting without the `colors.` prefix.
---@param name string a-z, 0-9, `-` and `_`
---@param spec { palette: table<string, string>, colors?: table<string, string> }
function rt.theme(name, spec) end
---Bind keys (qutebrowser notation, e.g. "<Ctrl-x>" or "gg") to a command,
---or to a Lua function that runs when they're pressed.
---@param keys string
---@param command string|fun()
---@param mode? rt.Mode defaults to "normal"
---@return string command what the keys run (`lua-call <n>` for a function)
function rt.bind(keys, command, mode) end
rt.keymap = {}
---Bind keys in one mode or several, as `vim.keymap.set`. `opts.desc` is shown
---in the key hints popup instead of the command.
---@param mode rt.Mode|rt.Mode[]
---@param keys string
---@param rhs string|fun()
---@param opts? { desc?: string }
function rt.keymap.set(mode, keys, rhs, opts) end
---Remove a binding in one mode or several.
---@param mode rt.Mode|rt.Mode[]
---@param keys string
function rt.keymap.del(mode, keys) end
---Remove a binding.
---@param keys string
---@param mode? rt.Mode defaults to "normal"
function rt.unbind(keys, mode) end
---Define a command, e.g. `:wiki rust`; `fn` gets the rest of the line.
---`opts` is a description, or a table with `desc` and `complete`, a function
---that gets what's typed after the command and returns completions: strings,
---or `{ name = "…", desc = "…" }` tables.
---@param name string letters, digits, `-` and `_`
---@param fn fun(args: string)
---@param opts? string|{ desc?: string, complete?: fun(arglead: string): (string|{ name: string, desc?: string })[] }
function rt.command(name, fn, opts) end
---Run `fn` on an event, with a table of what it's about (`e.url`, …):
---- `startup`: riptide has started and loaded config.lua
---- `quit`: riptide is about to quit
---- `load_started`: a tab started loading a page (url)
---- `load_finished`: a tab finished loading a page (url)
---- `url_changed`: a tab's address changed (url)
---- `title_changed`: a tab's title changed (url, title)
---- `tab_opened`: a tab was opened (url)
---- `tab_closed`: a tab was closed (url)
---- `tab_selected`: another tab became the current one (url, index from 1)
---- `window_opened`: a window was opened (private: "true" or "false")
---- `window_closed`: a window was closed
---- `mode_changed`: the mode changed (from, to)
---- `setting_changed`: a setting changed (name, value as text)
---- `download_started`: a download started (url, path)
---- `download_finished`: a download finished (url, path, state: done, failed or cancelled)
---`opts.pattern` only runs it for matching pages (as `:set -u` patterns),
---`opts.group` names it for `rt.off`/`rt.group`, and `opts.once` runs it once.
---`rt.on(event, fn)` works too. Returns an id for `rt.off`.
---@param event rt.Event
---@param opts { pattern?: string, group?: string, once?: boolean }|fun(e: table)
---@param fn? fun(e: table)
---@return integer
function rt.on(event, opts, fn) end
---Call `fn` once, `ms` milliseconds from now. `:stop()` on the result cancels it.
---@param ms integer
---@param fn fun()
---@return { stop: fun(self) }
function rt.defer(ms, fn) end
---Call `fn` every `ms` milliseconds (10 or more) until `:stop()` is called on the result.
---@param ms integer
---@param fn fun()
---@return { stop: fun(self) }
function rt.every(ms, fn) end
---Show a message in the status bar; the same as `rt.message`.
---@param text string
---@param level? "info"|"warning"|"error"
function rt.notify(text, level) end
---Data kept between runs under `name` (letters, digits, `-`, `_`), saved
---as JSON in the data folder on every change. Values are strings, numbers,
---booleans and tables of those.
---@param name? string Required in config.lua; in a plugin, its stores are its own and `name` defaults to "data".
---@return { get: fun(key: string): any, set: fun(key: string, value: any), all: fun(): table, clear: fun() }
function rt.store(name) end
---@class rt.PluginSpec
---@field [1]? string A git URL, the same as `src`.
---@field src? string A git URL to install it from.
---@field dir? string A folder on your computer instead.
---@field name? string Its name for `require`; by default from the URL or folder.
---@field version? string A tag, branch or commit.
---@field subdir? string The plugin's folder in a repository of several plugins.
---@field trusted? boolean Skip the sandbox and allow everything.
---@field opts? table Passed to `require(name).setup(opts)` once it loads.
---@field config? fun() Run once it loads, instead of `opts`.
---@field event? rt.Event|rt.Event[] Load when one of these events fires.
---@field cmd? string|string[] Load when one of these commands runs.
---@field keys? string|(string|{ [1]: string, mode?: string })[] Load when one of these keys is pressed.
rt.statusbar = {}
---A status bar widget: `fn` gives its text each time the bar is drawn,
---where `statusbar.widgets` lists `"lua:<name>"`. It gets 50 ms; one that
---fails or runs longer is removed. `nil` instead of `fn` removes it.
---@param name string Letters, digits, `-` and `_`.
---@param fn? fun(): string|number|nil
function rt.statusbar.widget(name, fn) end
rt.pack = {}
---Add plugins: a git URL, a spec, or a list of them. They load once
---`config.lua` has run, or with `event`, `cmd` or `keys` only when needed.
---@param specs string|rt.PluginSpec|(string|rt.PluginSpec)[]
function rt.pack.add(specs) end
---Remove a hook by the id `rt.on` returned, or every hook in a group.
---@param id integer|string
function rt.off(id) end
---A group name for hooks; `{ clear = true }` first removes the group's
---hooks, so a script that runs again doesn't add them twice.
---@param name string
---@param opts? { clear?: boolean }
---@return string
function rt.group(name, opts) end
---The current page's URL (in callbacks).
---@return string
function rt.url() end
---The current page's title (in callbacks).
---@return string
function rt.title() end
---The current mode, e.g. "normal" (in callbacks).
---@return string
function rt.mode() end
---The current window's tabs, in order (in callbacks).
---@return { index: integer, title: string, url: string, current: boolean, pinned: boolean }[]
function rt.tabs() end
---The count typed before the key, if any (in callbacks).
---@return integer?
function rt.count() end
---Run a command line, e.g. `rt.run("tab-close")` (in callbacks).
---@param line string
function rt.run(line) end
---Open a URL (in callbacks).
---@param url string
---@param target? "current"|"tab"|"tab-bg"|"window"|"private"
function rt.open(url, target) end
---Show a message in the status bar (in callbacks).
---@param text string
---@param level? "info"|"warning"|"error"
function rt.message(text, level) end
---@class rt.SpawnOpts
---@field stdin? string written to the program's standard input
---@field cwd? string the directory to run it in
---@field env? table<string, string> extra environment variables
---@class rt.SpawnResult
---@field code integer|nil the exit code; nil if a signal ended it or it didn't start
---@field stdout string
---@field stderr string
---@field error string|nil why it couldn't run
---Run a program in the background (in callbacks); no shell is involved.
---`argv` is a list, or a command line split like `:spawn` does.
---@param argv string[]|string
---@param opts? rt.SpawnOpts|fun(result: rt.SpawnResult)
---@param callback? fun(result: rt.SpawnResult) called when it exits
function rt.spawn(argv, opts, callback) end
rt.ui = {}
---@class rt.SelectOpts
---@field prompt? string the question shown above the items
---@field format? fun(item: any): string how to show an item; tostring by default
---Pick one of `items` in the prompt area, like `vim.ui.select`: each item has
---a key (1-9, then a-z; at most 35 items), and Return picks the first.
---`on_choice` gets the item and its index, or nil when cancelled.
---@param items any[]
---@param opts? rt.SelectOpts
---@param on_choice fun(item: any|nil, index: integer|nil)
function rt.ui.select(items, opts, on_choice) end
---@class rt.InputOpts
---@field prompt? string the question
---@field default? string text to start with
---@field secret? boolean mask what's typed, for passwords
---Ask for text in the prompt area, like `vim.ui.input`. `on_confirm` gets
---the text, or nil when cancelled.
---@param opts? rt.InputOpts
---@param on_confirm fun(text: string|nil)
function rt.ui.input(opts, on_confirm) end
---@alias rt.Highlight "title"|"muted"|"accent"|"match"|"url"|"key"|"info"|"warning"|"error"
---@class rt.FloatOpts
---@field title? string
---@field lines? (string|(string|{ [1]: string, [2]: rt.Highlight })[])[] Text, or chunks of text with highlights; never HTML.
---@field width? integer The widest it gets, in characters (10–200, default 60).
---@field position? "center"|"top"|"bottom"|"top-right"|"bottom-right"
---@field timeout? integer Close by itself after this many milliseconds.
---@field keys? table<string, fun(float: rt.Float)> Keys it takes in normal mode while it's the newest float with keys; Escape closes it.
---@field on_close? fun() Called when riptide closes it (Escape, its timeout).
---@class rt.Float
---@field id integer
local Float = {}
---Redraw with these options changed.
---@param changes rt.FloatOpts
function Float:update(changes) end
function Float:close() end
---@return boolean
function Float:is_open() end
---A box of text over the page. A plugin's floats show its name.
---@param opts rt.FloatOpts
---@return rt.Float
function rt.ui.float(opts) end
---@class rt.PanelOpts
---@field title? string
---@field lines? (string|(string|{ [1]: string, [2]: rt.Highlight })[])[] Text, or chunks of text with highlights; never HTML.
---@field side? "left"|"right"|"bottom" Default left.
---@field size? integer Width beside the page, or height below it, in pixels (default 300, or 200 below).
---@field keys? table<string, fun(panel: rt.Panel, line: integer)> Keys it takes while focused, with the cursor's line; j/k move the cursor and Escape returns to the page.
---@field on_close? fun() Called when riptide closes it (its window closing, another panel taking its side).
---@class rt.Panel
---@field id integer
local Panel = {}
---Redraw with these options changed.
---@param changes rt.PanelOpts
function Panel:update(changes) end
function Panel:close() end
---Give it the keyboard until Escape.
function Panel:focus() end
---@return boolean
function Panel:is_open() end
---@class rt.PageOpts
---@field path? string A file in the plugin's `pages/` folder (default `index.html`).
---@field where? "tab"|"panel" Default tab.
---@field side? "left"|"right"|"bottom" In a panel; default right.
---@field size? integer In a panel: its width, or height below the page, in pixels (default 400).
---@field on_message? fun(name: string, data: any, page: rt.Page) A message the page sent with `rt.send(name, json)`.
---@class rt.Page
---@field id integer
local Page = {}
---Send the page a message: it gets an `rtmessage` event with `detail.name` and `detail.data`.
---@param name string
---@param data any Anything `rt.json.encode` takes.
function Page:send(name, data) end
---Close its panel, or the tabs showing it.
function Page:close() end
rt.secret = {}
---One of this plugin's secret options (`type = "secret"` in its
---riptide-plugin.toml), from the OS keyring where the Plugins tab keeps it:
---`fn(value)`, `fn(nil)` when it isn't set, or `fn(nil, why)`. Only plugins
---have secret options, and each reads only its own.
---@param option string
---@param fn fun(value: string|nil, err: string|nil)
function rt.secret.get(option, fn) end
---Open one of this plugin's pages in a tab or a panel. Only plugins have pages.
---@param opts? rt.PageOpts
---@return rt.Page
function rt.ui.page(opts) end
---Lines beside or below the page, one panel per side of a window. A plugin's panels show its name.
---@param opts rt.PanelOpts
---@return rt.Panel
function rt.ui.panel(opts) end
---The current tab's page. Plugins need the `pages` permission for the site,
---checked when the action runs; nothing acts on riptide's own pages, and what's
---typed or filled is never logged or kept in history.
rt.page = {}
---Type text into the focused field, as `:insert-text` does.
---@param text string
function rt.page.type(text) end
---Press keys in the page, as `:fake-key` does, e.g. `"<Tab>"`.
---@param keys string
function rt.page.key(keys) end
---@class rt.Login
---@field host string the site the login is for; nothing is filled if the tab has moved on to another
---@field username? string
---@field password? string
---@field submit? boolean submit the form once it's filled
---Fill the page's login form: the focused field's form, or the first with a
---password field.
---@param login rt.Login
function rt.page.fill_login(login) end
---Evaluate a JavaScript expression in the page and get its value, as JSON
---turns it into Lua: `fn(value)`, or `fn(nil, why)`. It runs in the page's
---own world, so the page can see it and change what it returns.
---@param code string An expression; wrap statements in `(() => { … })()`.
---@param fn fun(value: any, err: string|nil)
function rt.page.eval(code, fn) end
---Add a stylesheet to the page, until it next loads.
---@param css string
function rt.page.css(css) end
---The page's selected text: `fn(text)`, or `fn(nil, why)`.
---@param fn fun(text: string|nil, err: string|nil)
function rt.page.selection(fn) end
---@class rt.HintedElement
---@field url string|nil Its link, if it has one.
---@field text string Its text, lowercased.
---Hint the elements `selector` matches, in frames of sites the plugin may act
---on, and hand the one you pick to `action`; nothing is clicked.
---@param opts { selector: string, action: fun(element: rt.HintedElement|nil, err: string|nil) }
function rt.page.hint(opts) end
rt.json = {}
---Parse JSON; `null` becomes nil.
---@param text string
---@return any
function rt.json.decode(text) end
---Write a value as JSON.
---@param value any
---@return string
function rt.json.encode(value) end
---@class rt.c
---@field aliases table<string, string> Command aliases: name → command. As in qutebrowser, :q closes the window, :qa quits, :w saves the session and :wq saves and quits
---@field auto_save rt.c.auto_save
---@field bindings rt.c.bindings
---@field changelog_after_upgrade "major"|"minor"|"patch"|"never" Open the changelog in a tab after an upgrade of at least this size: major, minor, patch or never
---@field colors rt.c.colors
---@field completion rt.c.completion
---@field confirm_quit string[] Ask before quitting: always, multiple-tabs (more than one tab open), downloads (downloads still running), or never
---@field content rt.c.content
---@field crash_report rt.c.crash_report
---@field downloads rt.c.downloads
---@field editor rt.c.editor
---@field extensions rt.c.extensions
---@field fileselect rt.c.fileselect
---@field fonts rt.c.fonts
---@field hints rt.c.hints
---@field input rt.c.input
---@field keyhint rt.c.keyhint
---@field messages rt.c.messages
---@field new_instance_open_target "tab"|"tab-bg"|"window" Where URLs from a second riptide invocation open
---@field new_instance_open_target_window "first-opened"|"last-opened"|"last-focused" Which window URLs from a second riptide invocation open in
---@field plugins rt.c.plugins
---@field prompt rt.c.prompt
---@field scrolling rt.c.scrolling
---@field search rt.c.search
---@field session rt.c.session
---@field spellcheck rt.c.spellcheck
---@field statusbar rt.c.statusbar
---@field tabs rt.c.tabs
---@field ui rt.c.ui
---@field url rt.c.url
---@field window rt.c.window
---@field zoom rt.c.zoom
---@class rt.c.auto_save
---@field interval integer Milliseconds between crash-recovery saves of the open tabs (0 turns them off)
---@field session boolean Save the open tabs as the 'default' session on quit, and restore them at startup
---@class rt.c.bindings
---@field key_mappings table<string, string> Keys treated as other keys in every mode, before bindings are looked up, e.g. Ctrl-[ as Escape
---@class rt.c.colors
---@field completion rt.c.colors.completion
---@field hints rt.c.colors.hints
---@field keyhint rt.c.colors.keyhint
---@field messages rt.c.colors.messages
---@field prompts rt.c.colors.prompts
---@field statusbar rt.c.colors.statusbar
---@field tabs rt.c.colors.tabs
---@field webpage rt.c.colors.webpage
---@class rt.c.colors.completion
---@field category rt.c.colors.completion.category
---@field description rt.c.colors.completion.description
---@field fg string Completion list text; empty uses ui.theme's
---@field item rt.c.colors.completion.item
---@field match rt.c.colors.completion.match
---@field odd rt.c.colors.completion.odd
---@class rt.c.colors.completion.category
---@field bg string Background of completion category headers; empty uses ui.theme's
---@field fg string Text of completion category headers; empty uses ui.theme's
---@class rt.c.colors.completion.description
---@field fg string Descriptions and details in the completion list; empty uses ui.theme's
---@class rt.c.colors.completion.item
---@field selected rt.c.colors.completion.item.selected
---@class rt.c.colors.completion.item.selected
---@field bg string Background of the selected completion; empty uses ui.theme's
---@field fg string Text of the selected completion; empty uses ui.theme's
---@class rt.c.colors.completion.match
---@field fg string The typed text where it appears in completion items; empty uses ui.theme's
---@class rt.c.colors.completion.odd
---@field bg string Completion list background; empty uses ui.theme's
---@class rt.c.colors.hints
---@field bg string Background of hint labels; empty uses ui.theme's
---@field border string Border of hint labels; empty uses ui.theme's
---@field fg string Text of hint labels; empty uses ui.theme's
---@field match rt.c.colors.hints.match
---@class rt.c.colors.hints.match
---@field fg string The typed part of hint labels; empty uses ui.theme's
---@class rt.c.colors.keyhint
---@field suffix rt.c.colors.keyhint.suffix
---@class rt.c.colors.keyhint.suffix
---@field fg string The keys still to type in the key hint popup; empty uses ui.theme's
---@class rt.c.colors.messages
---@field error rt.c.colors.messages.error
---@field warning rt.c.colors.messages.warning
---@class rt.c.colors.messages.error
---@field bg string Background of error messages; empty uses ui.theme's
---@field fg string Text of error messages; empty uses ui.theme's
---@class rt.c.colors.messages.warning
---@field bg string Background of warnings; empty uses ui.theme's
---@field fg string Text of warnings; empty uses ui.theme's
---@class rt.c.colors.prompts
---@field bg string Background of prompts; empty uses ui.theme's
---@field border string Frame, title and keys of floating prompts; empty uses ui.theme's
---@field fg string Text of prompts; empty uses ui.theme's
---@field key rt.c.colors.prompts.key
---@class rt.c.colors.prompts.key
---@field bg string Background of a floating prompt's keys; empty uses ui.theme's
---@class rt.c.colors.statusbar
---@field insert rt.c.colors.statusbar.insert
---@field normal rt.c.colors.statusbar.normal
---@field passthrough rt.c.colors.statusbar.passthrough
---@field private rt.c.colors.statusbar.private
---@field url rt.c.colors.statusbar.url
---@class rt.c.colors.statusbar.insert
---@field bg string Status bar background in insert mode; empty uses ui.theme's
---@field fg string Status bar text in insert mode; empty uses ui.theme's
---@class rt.c.colors.statusbar.normal
---@field bg string Status bar background; empty uses ui.theme's
---@field fg string Status bar text; empty uses ui.theme's
---@class rt.c.colors.statusbar.passthrough
---@field bg string Status bar background in passthrough mode; empty uses ui.theme's
---@field fg string Status bar text in passthrough mode; empty uses ui.theme's
---@class rt.c.colors.statusbar.private
---@field bg string Status bar background in private windows; empty uses ui.theme's
---@field fg string Status bar text in private windows; empty uses ui.theme's
---@class rt.c.colors.statusbar.url
---@field error rt.c.colors.statusbar.url.error
---@field success rt.c.colors.statusbar.url.success
---@class rt.c.colors.statusbar.url.error
---@field fg string The address of a page that failed to load; empty uses ui.theme's
---@class rt.c.colors.statusbar.url.success
---@field http rt.c.colors.statusbar.url.success.http
---@field https rt.c.colors.statusbar.url.success.https
---@class rt.c.colors.statusbar.url.success.http
---@field fg string An http:// address in the status bar; empty uses ui.theme's
---@class rt.c.colors.statusbar.url.success.https
---@field fg string An https:// address in the status bar; empty uses ui.theme's
---@class rt.c.colors.tabs
---@field bar rt.c.colors.tabs.bar
---@field even rt.c.colors.tabs.even
---@field indicator rt.c.colors.tabs.indicator
---@field odd rt.c.colors.tabs.odd
---@field pinned rt.c.colors.tabs.pinned
---@field selected rt.c.colors.tabs.selected
---@class rt.c.colors.tabs.bar
---@field bg string Tab bar background behind the tabs; empty uses ui.theme's
---@class rt.c.colors.tabs.even
---@field bg string Background of even-numbered tabs; empty uses ui.theme's
---@class rt.c.colors.tabs.indicator
---@field error string A tab's indicator when its page failed to load; empty uses ui.theme's
---@field start string A tab's loading indicator; empty uses ui.theme's
---@class rt.c.colors.tabs.odd
---@field bg string Background of odd-numbered tabs; empty uses ui.theme's
---@field fg string Text of tabs; empty uses ui.theme's
---@class rt.c.colors.tabs.pinned
---@field odd rt.c.colors.tabs.pinned.odd
---@class rt.c.colors.tabs.pinned.odd
---@field bg string Background of pinned tabs; empty uses ui.theme's
---@field fg string Text of pinned tabs; empty uses ui.theme's
---@class rt.c.colors.tabs.selected
---@field accent string Color of the line marking the current tab, any CSS color such as #2ec4b6; empty matches the tab, so no line shows
---@field odd rt.c.colors.tabs.selected.odd
---@class rt.c.colors.tabs.selected.odd
---@field bg string Background of the current tab; empty uses ui.theme's
---@field fg string Text of the current tab; empty uses ui.theme's
---@class rt.c.colors.webpage
---@field bg string Background of a new tab before its page paints, e.g. #1e1e2e so dark themes don't flash white; #rrggbb, white or black
---@field darkmode rt.c.colors.webpage.darkmode
---@field preferred_color_scheme "auto"|"light"|"dark" The color scheme pages see in prefers-color-scheme: auto follows the system
---@class rt.c.colors.webpage.darkmode
---@field enabled boolean Render light pages dark with Chromium's automatic dark mode; applies at once and can be set per site
---@class rt.c.completion
---@field cmd_history_max_items integer How many command lines Up and Down remember
---@field delay integer Milliseconds to wait after a key press before updating completions
---@field height string Height of the completion list: rows (12) or a percentage of the window (50%)
---@field min_chars integer Characters to type after a command before its arguments complete
---@field open_categories string[] What :open completes from, in order: searchengines, quickmarks, bookmarks, history, filesystem
---@field quick boolean When only one command or setting name is left, Tab takes it and moves on to completing the next part
---@field show "always"|"auto"|"never" When to show completions: always, only after pressing Tab (auto), or never
---@field shrink boolean Shrink the completion list to its items; false keeps it completion.height tall
---@field timestamp_format string strftime format of the last-visit time shown next to history completions; empty hides it
---@field use_best_match boolean Return runs the first command that starts with an unknown command name, so :rel runs :reload
---@field web_history rt.c.completion.web_history
---@class rt.c.completion.web_history
---@field exclude string[] URL globs (e.g. *://*.bank.example/*) that :open never suggests from history
---@field max_items integer How many history entries :open completion shows (0 turns history completion off)
---@class rt.c.content
---@field autoplay boolean Let videos play by themselves; false waits until you interact with the page (after a restart)
---@field blocking rt.c.content.blocking
---@field cache rt.c.content.cache
---@field call_mute_keys table<string, string> The key each call site mutes the microphone with, by URL pattern, for :call-mute (cm); keys as in :bind, e.g. <Ctrl-d>
---@field call_sites string[] Video call sites, as URL patterns, that open in a call window. There, sharing your screen lets you pick a tab, a window or the whole screen; in an ordinary tab it always shares the whole screen. Clear the list to open these sites as ordinary tabs; you then lose that choice unless you use :open --call or :tab-call
---@field canvas_reading boolean Let pages read back what they drew on a canvas; false blocks a common fingerprinting trick but breaks some sites (after a restart)
---@field cookies rt.c.content.cookies
---@field desktop_capture "ask"|"true"|"false" Let sites capture your screen or desktop audio: ask, true or false
---@field dns_prefetch boolean Look up the hosts of links before you follow them, which is faster but tells your DNS server about them
---@field geolocation "ask"|"true"|"false" Let sites know your location: ask, true or false
---@field headers rt.c.content.headers
---@field images boolean Load images; can be set per site
---@field javascript rt.c.content.javascript
---@field local_content_can_access_file_urls boolean Let file:// pages read other local files, which a downloaded page could misuse (after a restart)
---@field media rt.c.content.media
---@field mouse_lock "ask"|"true"|"false" Let sites lock your mouse pointer, as games do: ask, true or false
---@field mute boolean Mute pages; can be set per site
---@field notifications rt.c.content.notifications
---@field pdf_viewer boolean Show PDFs in the browser; false downloads them instead
---@field prefers_reduced_motion boolean Tell pages you prefer less motion, so they can tone down animations (after a restart)
---@field proxy string Proxy: system, none, a proxy URL such as socks5://127.0.0.1:9050, or pac+ and a PAC script's URL
---@field register_protocol_handler "ask"|"true"|"false" Let sites register to handle links like mailto: : ask, true or false
---@field tls rt.c.content.tls
---@field unknown_url_scheme_policy "ask"|"allow-all"|"disallow" Links to schemes the browser can't show (mailto:, magnet:, zoommtg:): ask before handing them to xdg-open, always hand them over, or never
---@field user_stylesheets string[] CSS files applied to pages (relative paths are in the config directory); reloaded when they change; can be set per site
---@field webgl boolean Allow WebGL, which 3D graphics need and fingerprinting scripts use (after a restart)
---@field webrtc_ip_handling_policy "all-interfaces"|"default-public-and-private-interfaces"|"default-public-interface-only"|"disable-non-proxied-udp" Which IP addresses WebRTC (video calls) may reveal; disable-non-proxied-udp keeps it behind content.proxy
---@field widevine boolean Allow Widevine DRM: Chromium downloads Google's CDM once (takes effect after a restart)
---@class rt.c.content.blocking
---@field adblock rt.c.content.blocking.adblock
---@field enabled boolean Block ads and trackers with the filter lists from content.blocking.adblock.lists
---@field whitelist string[] Sites where nothing is blocked, as host names; a host also covers its subdomains
---@class rt.c.content.blocking.adblock
---@field lists string[] Adblock Plus filter lists or hosts files that :adblock-update downloads (https://, or file:// for local lists); uBlock Origin's own lists may use its trusted scriptlets
---@field rules string[] Your own filter rules, in Adblock Plus syntax (e.g. example.com##.banner); they apply at once, without :adblock-update
---@class rt.c.content.cache
---@field size integer Disk cache size in bytes; 0 lets Chromium choose (takes effect after a restart)
---@class rt.c.content.cookies
---@field accept "all"|"no-3rdparty"|"no-unknown-3rdparty"|"never" Which cookies sites may set: all, none from other sites (no-3rdparty; no-unknown-3rdparty is the same here), or never
---@field store boolean Keep cookies after the browser closes; false makes every cookie last only for the session
---@class rt.c.content.headers
---@field accept_language string Languages sites are asked for, e.g. en-US,en;q=0.9 (also navigator.languages); empty for the system's
---@field custom table<string, string> Extra headers sent with every request: name → value
---@field do_not_track boolean Send DNT: 1 with every request, asking sites not to track you
---@field referer "always"|"never"|"same-domain" When to send the Referer header: always, never, or only within the same domain and its subdomains
---@field user_agent string User agent sent to sites and shown to their scripts; empty for Chromium's own. Can be set per site
---@class rt.c.content.javascript
---@field can_close_tabs boolean Let a page close its own tab with window.close(), as login popups do
---@field can_open_tabs_automatically boolean Let pages open tabs and windows without a click (popups); can be set per site
---@field clipboard "none"|"access"|"access-paste" What pages may do with the clipboard: nothing, copy with a click (access), or also read it (access-paste); can be set per site
---@field enabled boolean Run JavaScript on pages; can be set per site
---@field log_message rt.c.content.javascript.log_message
---@class rt.c.content.javascript.log_message
---@field levels string[] Console messages from pages shown in the status bar and :messages, by level: debug, info, warning, error (can be set per site)
---@class rt.c.content.media
---@field audio_capture "ask"|"true"|"false" Let sites use your microphone: ask, true or false
---@field video_capture "ask"|"true"|"false" Let sites use your camera: ask, true or false
---@class rt.c.content.notifications
---@field app_name string The app name on desktop notifications (presenter = libnotify), which notification services such as dunst and mako can match to style them
---@field enabled "ask"|"true"|"false" Let sites show notifications: ask, true or false
---@field presenter "auto"|"libnotify"|"messages" Where page notifications show: auto (Chromium's desktop notifications), libnotify (desktop notifications riptide sends with notify-send, following the other content.notifications settings) or messages (riptide's status bar)
---@field show_origin boolean Show the site a notification came from (presenter = libnotify or messages)
---@field site_icon boolean Show the site's icon on desktop notifications (presenter = libnotify)
---@field timeout integer Milliseconds a desktop notification stays (presenter = libnotify): -1 lets the desktop decide, 0 keeps it until dismissed
---@field urgency "low"|"normal"|"critical" How urgent desktop notifications are (presenter = libnotify): low, normal or critical
---@class rt.c.content.tls
---@field certificate_errors "ask"|"block"|"load-insecurely" Pages whose TLS certificate isn't trusted: ask, block, or load-insecurely
---@class rt.c.crash_report
---@field email string Where :crash-report's Email button sends a report; empty hides the button
---@class rt.c.downloads
---@field location rt.c.downloads.location
---@field open_dispatcher string Program that opens downloads (:download-open); {} is the file, or it's added at the end. Empty for the desktop's default
---@field remove_finished integer Take finished downloads off the list after this many milliseconds; -1 keeps them
---@class rt.c.downloads.location
---@field directory string Where downloads go; empty means the system Downloads folder
---@field prompt boolean Ask where to save each download (false saves straight to the directory)
---@field remember boolean Start the save prompt in the folder the last download went to
---@field suggestion "both"|"path"|"filename" What the save prompt starts with: the folder and file name (both), the folder (path), or the file name
---@class rt.c.editor
---@field command string[] Editor for :open-editor; fields: {file}, {line}, {column}, {line0}, {column0}
---@field remove_file boolean Delete the temporary file after the editor closes; false keeps it, e.g. to recover text
---@class rt.c.extensions
---@field load string[] Folders of unpacked Chrome extensions to load, besides the ones :extension-install installs (after a restart)
---@class rt.c.fileselect
---@field folder rt.c.fileselect.folder
---@field handler "default"|"external" File pickers for upload fields: Chromium's own (default), or the fileselect.*.command programs (external)
---@field multiple_files rt.c.fileselect.multiple_files
---@field single_file rt.c.fileselect.single_file
---@class rt.c.fileselect.folder
---@field command string[] Program that picks a folder for fileselect.handler = external; {} is the file it writes the path to
---@class rt.c.fileselect.multiple_files
---@field command string[] Program that picks several files for fileselect.handler = external; {} is the file it writes the paths to, one per line
---@class rt.c.fileselect.single_file
---@field command string[] Program that picks a file for fileselect.handler = external; {} is the file it writes the path to
---@class rt.c.fonts
---@field completion rt.c.fonts.completion
---@field default_family string Font family that the other fonts.* settings call default_family
---@field default_size string Font size that the other fonts.* settings call default_size, e.g. 10pt or 13px
---@field hints string Font of hint labels
---@field keyhint string Font of the key hint popup
---@field prompts string Font of prompts
---@field statusbar string Font of the status bar; sizes beyond the bar's height are cut off until bars size to their font
---@field tabs rt.c.fonts.tabs
---@field web rt.c.fonts.web
---@class rt.c.fonts.completion
---@field category string Font of completion category headers (default_size and default_family stand for those settings)
---@field entry string Font of completion entries
---@class rt.c.fonts.tabs
---@field selected string Font of the current tab
---@field unselected string Font of the other tabs
---@class rt.c.fonts.web
---@field family rt.c.fonts.web.family
---@field size rt.c.fonts.web.size
---@class rt.c.fonts.web.family
---@field fixed string Monospace font for pages (CSS monospace); empty for Chromium's
---@field sans_serif string Sans-serif font for pages; empty for Chromium's
---@field serif string Serif font for pages; empty for Chromium's
---@field standard string Font for pages that don't choose one; empty for Chromium's
---@class rt.c.fonts.web.size
---@field default integer Default text size of pages, in pixels
---@field default_fixed integer Default size of monospace text in pages, in pixels
---@field minimum integer Smallest text size pages may use, in pixels (0 for no minimum)
---@class rt.c.hints
---@field auto_follow "always"|"unique-match"|"full-match"|"never" When a hint is followed without Return: when one is left (unique-match), only when its label is typed in full (full-match), always, or never
---@field auto_follow_timeout integer Ignore keys for this many milliseconds after following a hint, so extra typing doesn't reach the page
---@field chars string Characters used for hint labels
---@field dictionary string Word list for hints.mode = word, one word per line
---@field hide_unmatched_rapid_hints boolean In rapid hint mode (:hint --rapid), hide the labels that don't match what's typed
---@field leave_on_load boolean Leave hint mode when the page starts loading something new
---@field min_chars integer The shortest hint label, in characters
---@field mode "letter"|"number"|"word" letter: labels from hints.chars; number: numbered labels, and typing letters filters by text; word: dictionary words from each link's text
---@field next_regexes string[] Link texts ]] follows to the next page, as JavaScript regular expressions (case doesn't matter)
---@field padding string Space around a hint label's text, as CSS padding, e.g. 1px 4px
---@field prev_regexes string[] Link texts [[ follows to the previous page, as JavaScript regular expressions (case doesn't matter)
---@field radius integer Corner radius of hint labels in pixels; 0 is square
---@field scatter boolean Spread hint labels over the alphabet so neighbours differ; false labels in order
---@field selectors table<string, string> Hint groups for :hint, as CSS selector lists; your entries are added to the built-in all, links, images, media and inputs
---@field uppercase boolean Show hint labels in upper case
---@class rt.c.input
---@field forward_unbound_keys "all"|"auto"|"none" Pass unbound keys to the page in normal mode (auto: all but plain letters and digits)
---@field insert_mode rt.c.input.insert_mode
---@field match_counts boolean Read digits typed before a binding as a count (3j); false lets digits be bindings themselves
---@field media_keys boolean Let the keyboard's media keys (play, pause, next) control audio and video in pages (after a restart)
---@field mode_override "none"|"normal"|"insert"|"passthrough" Mode to enter when a page loads or its tab is focused; set it per site, e.g. passthrough for a web terminal
---@field mouse rt.c.input.mouse
---@field partial_timeout integer Milliseconds before a half-typed key chain or count is forgotten; 0 waits forever
---@field spatial_navigation boolean Move focus between links and fields with the arrow keys, as on a TV (after a restart)
---@class rt.c.input.insert_mode
---@field auto_enter boolean Enter insert mode when an editable element gets focus
---@field auto_leave boolean Leave insert mode when focus leaves an editable element
---@field auto_load boolean Enter insert mode when a page focuses a text field by itself, as autofocus does on load
---@field leave_on_load boolean Leave insert mode when a new page starts loading
---@class rt.c.input.mouse
---@field rocker_gestures boolean Hold the right button and click the left to go back, or the other way round to go forward; turns off the page's context menu
---@class rt.c.keyhint
---@field blacklist string[] Key chains the key hint popup leaves out, as globs on the whole chain (e.g. g* for every chain starting with g)
---@field delay integer How long after a partial key chain the popup listing its continuations appears, in milliseconds
---@class rt.c.messages
---@field timeout integer Milliseconds before a status bar message clears (0 keeps it)
---@class rt.c.plugins
---@field catalog string The git repository of plugins the Plugins tab's Browse lists, one plugin per folder
---@field check_interval integer Every this many days, check plugins from git for new commits in the background and say once which have updates; nothing updates by itself (0: never)
---@class rt.c.prompt
---@field position "bottom"|"center"|"docked" Where questions (permissions, logins, downloads, page dialogs) appear: bottom, a box floating near the bottom of the page; center, the same box in the middle; or docked above the status bar
---@field width integer Width in pixels of a floating prompt (prompt.position = bottom or center), at most the page's
---@class rt.c.scrolling
---@field bar "always"|"never"|"overlay" Page scrollbars: always, never, or overlay (thin, shown while scrolling; after a restart)
---@field smooth boolean Animate scrolling by keys instead of jumping
---@class rt.c.search
---@field ignore_case "smart"|"always"|"never" Case in searches: smart ignores it unless the text has a capital, always, or never
---@field incremental boolean Search while typing after / or ?
---@field wrap boolean Go on from the top when a search passes the last match (or from the bottom, searching up)
---@field wrap_messages boolean Say when a search wraps around the page
---@class rt.c.session
---@field default_name string Session that :session-save, :wq and auto_save.session use; empty means the last one loaded, or default
---@field lazy_restore boolean When restoring a session, load background tabs only when they are first shown
---@class rt.c.spellcheck
---@field languages string[] Spell-check languages such as en-US (empty: off); Chromium downloads each dictionary from Google once
---@class rt.c.statusbar
---@field padding string Space around the status bar's text, as CSS padding (top right bottom left), e.g. 2px 8px; the bar grows to fit
---@field position "top"|"bottom" Where the status bar is
---@field show "always"|"never"|"in-mode" When to show the status bar: always, only while typing a command or answering a prompt (never), or also outside normal mode and while a message is shown (in-mode)
---@field widgets string[] What the right side of the status bar shows, in order: keypress, downloads, blocked (requests the ad blocker stopped on the page), muted, media, sharing (a screen, window or tab being shared from any tab; :share-stop stops it), zoom, search_match, url, scroll, scroll_raw, history, tabs, progress, clock[:strftime format], text:…, lua:<name> (drawn by rt.statusbar.widget)
---@class rt.c.tabs
---@field close_mouse_button "middle"|"right"|"none" Which mouse button closes a tab clicked in the tab bar
---@field close_mouse_button_on_bar "new-tab"|"close-current"|"close-last"|"ignore" What tabs.close_mouse_button does on the empty part of the tab bar
---@field favicons rt.c.tabs.favicons
---@field indicator rt.c.tabs.indicator
---@field last_close "ignore"|"blank"|"startpage"|"default-page"|"close" What closing the last tab does
---@field max_width integer Largest width in pixels of a tab in a top or bottom tab bar (-1 for no limit)
---@field min_width integer Smallest width in pixels of a tab in a top or bottom tab bar; tabs that don't fit scroll (-1 for no minimum)
---@field mode_on_change "normal"|"persist"|"restore" Mode after switching tabs: normal, persist (keep insert/passthrough), or restore (the mode the tab was left in)
---@field mousewheel_switching boolean Switch tabs with the mouse wheel over the tab bar
---@field new_position rt.c.tabs.new_position
---@field padding string Space around each tab's title, as CSS padding (top right bottom left); the tab bar grows to fit
---@field pinned rt.c.tabs.pinned
---@field position "top"|"bottom"|"left"|"right" Where the tab bar is; left and right list the tabs vertically
---@field select_on_remove "next"|"prev"|"last-used" Which tab to show after closing the current one: the next, the previous, or the one used before
---@field show "always"|"never"|"multiple"|"switching" When to show the tab bar: always, never, with more than one tab, or briefly after switching tabs
---@field show_switching_delay integer How long the tab bar stays after switching tabs with tabs.show = switching, in milliseconds
---@field tabs_are_windows boolean Open every tab in its own window and hide the tab bar, for tiling window managers
---@field title rt.c.tabs.title
---@field tooltips boolean Show a tab's title and URL when the mouse rests on it
---@field undo_stack_size integer How many closed tabs u can reopen; 0 keeps none
---@field width integer Width of the tab bar in pixels when tabs.position is left or right
---@field wrap boolean Wrap around from the last tab to the first (and back) when switching tabs
---@class rt.c.tabs.favicons
---@field show "always"|"never"|"pinned" Show site icons in the tab bar: always, never, or only on pinned tabs
---@class rt.c.tabs.indicator
---@field width integer Width in pixels of the loading indicator at the left of each tab (0 hides it)
---@class rt.c.tabs.new_position
---@field related "prev"|"next"|"first"|"last" Where tabs opened from a page go (popups, hints)
---@field unrelated "prev"|"next"|"first"|"last" Where other new tabs go (:open -t)
---@class rt.c.tabs.pinned
---@field close "ask"|"refuse"|"close" Closing a pinned tab without --force: ask first, refuse, or just close it
---@field frozen boolean Keep pinned tabs on their page: :open in a pinned tab opens a new tab
---@field shrink boolean Shrink pinned tabs to their icon and number
---@class rt.c.tabs.title
---@field alignment "left"|"center"|"right" Where tab titles sit in their tab: left, center or right
---@field format string Tab titles; fields: {index}, {aligned_index}, {current_title}, {current_url}, {host}, {perc}, {audio}, {media} ([A/V] while the page uses a camera or the screen, and a microphone), {private}
---@field format_pinned string Titles of pinned tabs while tabs.pinned.shrink shrinks them; same fields as tabs.title.format
---@class rt.c.ui
---@field auto_theme rt.c.ui.auto_theme
---@field overlay rt.c.ui.overlay
---@field theme string Colors of riptide's bars, prompts and hints: riptide, riptide-light, gruvbox, catppuccin, nord, dracula, solarized, tokyo-night or a theme from themes/ in the config directory (:theme); auto follows the light or dark preference
---@class rt.c.ui.auto_theme
---@field dark string The theme ui.theme = auto uses when the desktop (or colors.webpage.preferred_color_scheme) prefers dark
---@field light string The theme ui.theme = auto uses when light is preferred
---@class rt.c.ui.overlay
---@field position "docked"|"floating" Where the command line's completions and the key hints appear: docked above the status bar, or floating, a box near the top of the page that also shows the command
---@field width integer Width in pixels of the floating overlay (ui.overlay.position = floating), at most the page's
---@class rt.c.url
---@field auto_search "naive"|"schemeless"|"never" When :open searches: text that doesn't look like an address (naive), anything without a scheme:// (schemeless), or never
---@field default_page string Page for :open without a URL
---@field incdec_segments string[] Parts of the URL Ctrl-a and Ctrl-x change: host, port, path, query, anchor
---@field open_base_url boolean Open a search engine's home page when :open gets just its name
---@field searchengines table<string, string> Search engines; ':open g rust' uses the 'g' entry, anything else DEFAULT
---@field start_pages string[] Pages opened at startup when no URL is given
---@field yank_ignored_parameters string[] Query parameters dropped when yanking a URL, such as tracking tags
---@class rt.c.window
---@field hide_decoration boolean Ask the window manager for no title bar or borders (applies to new windows)
---@field title_format string Window title; fields: {current_title}, {title_sep}, {current_url}, {host}, {mode}
---@class rt.c.zoom
---@field default integer Zoom in percent for pages, and what :zoom without a value resets to
---@field levels string[] The zoom levels + and - step through, in percent
---@type rt.c
c = {}