formatters

June 15, 2026 · View on GitHub

Formatter controls module for cosmic-ui. This module validates setup and module enable state, then executes formatter operations. Lua APIs are primary; :CosmicFormatters and :CosmicFormat are optional wrappers.

Setup

require("cosmic-ui").setup({
  formatters = {
    enabled = true,
  },
})

⚙️ Config

formatters = {
  enabled = true,
}

Types

OpenOpts

FieldTypeRequiredDefaultDescription
scope"buffer"|"global"|nilNo"buffer"Scope shown when UI opens.
bufnrinteger|nilNocurrent buffer (0)Buffer used for discovery and local state.

BackendOpts

FieldTypeRequiredDefaultDescription
scope"buffer"|"global"|nilNo"buffer"Scope target for backend mutation/query.
bufnrinteger|nilNocurrent buffer (0)Buffer used for local scope operations.
backend"lsp"|"conform"|table|nilNoboth backendsBackend selector.

ItemOpts

FieldTypeRequiredDefaultDescription
scope"buffer"|"global"|nilNo"buffer"Scope target for item mutation/query.
bufnrinteger|nilNocurrent buffer (0)Buffer used for local scope operations.
source"lsp"|"conform"YesnoneItem source namespace.
namestringYesnoneItem name (LSP client or conform formatter).

ResetOpts

FieldTypeRequiredDefaultDescription
scope"buffer"|"global"|nilNo"buffer"Scope target to reset.
bufnrinteger|nilNocurrent buffer (0)Buffer used for local reset scope.
backend"lsp"|"conform"|table|nilNoboth backendsBackend reset target when resetting backend state.
source"lsp"|"conform"|nilNonilSwitches reset into item-reset mode.
namestring|nilNonilItem name to reset when source is set.

FormatOpts

FieldTypeRequiredDefaultDescription
scope"buffer"|"global"|nilNo"buffer"Scope for backend/item filtering.
bufnrinteger|nilNocurrent buffer (0)Buffer to format.
backend"lsp"|"conform"|table|nilNoboth backendsBackend request selector.
conformtable|nilNo{}Extra options for conform formatting logic.
lsptable|nilNo{}Extra options for vim.lsp.buf.format.

Module

All methods below:

  • warn and no-op if setup() has not run
  • warn and no-op if formatters is disabled
  • when bufnr is accepted, invalid/nonexistent handles warn and no-op
  • otherwise execute formatter operations immediately

require("cosmic-ui").formatters.open(opts?)

Opens the formatter toggle UI. Opts: OpenOpts.

require("cosmic-ui").formatters.toggle(opts?)

Toggles backend state (lsp/conform) for selected scope. Opts: BackendOpts.

require("cosmic-ui").formatters.enable(opts?)

Enables backend state for selected scope. Opts: BackendOpts.

require("cosmic-ui").formatters.disable(opts?)

Disables backend state for selected scope. Opts: BackendOpts.

require("cosmic-ui").formatters.toggle_item(opts)

Toggles one item override. Opts: ItemOpts.

require("cosmic-ui").formatters.enable_item(opts)

Enables one item override. Opts: ItemOpts.

require("cosmic-ui").formatters.disable_item(opts)

Disables one item override. Opts: ItemOpts.

require("cosmic-ui").formatters.is_item_enabled(opts)

Returns whether one item is enabled. Opts: ItemOpts. Returns: boolean|nil.

require("cosmic-ui").formatters.reset(opts?)

Clears backend and/or item overrides. Opts: ResetOpts.

require("cosmic-ui").formatters.is_enabled(opts?)

Returns effective backend state. Opts: BackendOpts. Returns:

  • boolean when a single backend is requested
  • { lsp = boolean, conform = boolean } when backend is omitted or multiple

require("cosmic-ui").formatters.status(opts?)

Returns formatter status snapshot. Opts: OpenOpts plus optional conform.lsp_format to preview requested Conform LSP mode resolution without mutating formatter state. Returns: status table with backends, lsp_clients, and conform. Includes fallback visibility:

  • conform.fallback:
    • requested_mode (opts.conform.lsp_format when provided)
    • global_mode (from conform.default_format_opts.lsp_format)
    • specific_mode + specific_filetype (from matching formatters_by_ft entry)
    • display_global_mode (global Conform-config mode source for header rendering)
    • display_specific_mode + display_specific_filetype (LSP header ghost text context, rendered as <specific_mode_or_global_mode>)
    • mode (configured mode before backend clamp)
    • effective_mode ("never"|"fallback"|"prefer"|"first"|"last")
    • source (effective source: "requested"|"specific"|"global"|"default"|"clamped")
    • configured_source (pre-clamp source: "requested"|"specific"|"global"|"default")
    • uses_lsp, eligible_clients, total_clients, reason
  • lsp_clients[].conform_fallback:
    • eligible, reason, mode, effective_mode, source, configured_source

require("cosmic-ui").formatters.format(opts?)

Runs synchronous formatting with Conform-first routing. Opts: FormatOpts. Returns: boolean|nil.

Behavior:

  • If Conform is installed and conform backend is enabled/requested, runs conform.format().
  • Else if LSP backend is enabled/requested, runs vim.lsp.buf.format().
  • Under Conform path:
    • LSP toggle OFF forces conform.lsp_format = "never".
    • LSP toggle ON uses mode precedence:
      • opts.conform.lsp_format (requested) >
      • matching Conform filetype mode (formatters_by_ft) >
      • Conform global default (default_format_opts.lsp_format) >
      • "never" default
    • Supported lsp_format values:
      • "never": never use LSP
      • "fallback": use LSP only when no other formatters are available
      • "prefer": use only LSP when available
      • "first": run LSP then other formatters
      • "last": run other formatters then LSP

require("cosmic-ui").formatters.format_async(opts?)

Runs asynchronous formatting with the same routing rules as format. Opts: FormatOpts. Returns: boolean|nil.

Usage

local fmt = require("cosmic-ui").formatters

fmt.open()
fmt.toggle({ backend = "lsp" })
fmt.format_async({ backend = { "conform", "lsp" } })

Optional commands:

  • :CosmicFormatters opens the Cosmic formatter panel.
  • :CosmicFormat formats the current buffer.

Conform format_on_save example

require("conform").setup({
  format_on_save = function(bufnr)
    if not vim.g.format_on_save_enabled then
      return
    end

    local ok, cosmic = pcall(require, "cosmic-ui")
    if not (ok and cosmic.is_setup and cosmic.is_setup()) then
      return { timeout_ms = 500, lsp_format = "fallback" }
    end

    local st = cosmic.formatters.status({ scope = "buffer", bufnr = bufnr })
    local enabled = {}
    for _, f in ipairs((st and st.conform and st.conform.formatters) or {}) do
      if f.enabled then
        enabled[#enabled + 1] = f.name
      end
    end

    if #enabled == 0 then
      return nil
    end

    return {
      timeout_ms = 500,
      formatters = enabled,
      lsp_format = "never",
    }
  end,
})

Notes:

  • This example makes save-formatting honor CosmicUI Conform item toggles.
  • LSP code-action save hooks (for example ESLint fix-all) are separate from Conform formatting.