# `Minga.Extension.Editor`
[🔗](https://github.com/jsmestad/minga/blob/main/lib/minga/extension/editor.ex#L1)

Editor surface for Minga extensions.

This module provides the DSL macros and compile-time wiring for editor-specific extension components: options, commands, keybindings, modeline segments, and capabilities.

`use Minga.Extension.Editor` is the recommended way to define an extension that contributes editor UI and interaction features. It injects the `Minga.Extension` behaviour, registers compile-time accumulate attributes for each editor component, provides a default `child_spec/1`, and imports the editor DSL macros.

## Usage

    defmodule MingaOrg do
      use Minga.Extension.Editor

      option :conceal, :boolean,
        default: true,
        description: "Hide markup delimiters and show styled content"

      command :org_cycle_todo, "Cycle TODO keyword",
        execute: {MingaOrg.Todo, :cycle},
        requires_buffer: true

      keybind :normal, "SPC m t", :org_cycle_todo, "Cycle TODO", filetype: :org

      modeline_segment :word_count, side: :right, priority: 50 do
        if ctx.data.filetype in [:markdown, :text, :org] do
          {" WORDS ", ctx.info_fg, ctx.bar_bg, [], nil}
        end
      end

      capability :filetype, :org

      @impl true
      def name, do: :minga_org

      @impl true
      def description, do: "Org-mode support"

      @impl true
      def version, do: "0.1.0"

      @impl true
      def init(_config), do: {:ok, %{}}
    end

For extensions that contribute agent-side components (hooks, skills, MCP servers, slash commands), see `Minga.Extension.Agent`.

# `__using__`
*macro* 

Injects the `Minga.Extension` behaviour, editor DSL macros, and a default `child_spec/1`.

The injected macros are: `option/3`, `command/3`, `keybind/4`, `keybind/5`, `modeline_segment/2`, `modeline_segment/3`, and `capability/2`.

At compile time, each macro accumulates declarations into module attributes. The `__before_compile__` hook then generates `__option_schema__/0`, `__command_schema__/0`, `__keybind_schema__/0`, `__modeline_segment_schema__/0`, and `__capability_schema__/0` functions that the framework reads at load time.

# `capability`
*macro* 

Declares a runtime or UI capability this extension uses.

Capabilities are declarative and are available through `Minga.Extension.Manifest` before `init/1` runs. They should describe contribution surfaces or runtime needs, not perform side effects.

# `command`
*macro* 

Declares an editor command this extension provides.

Accumulated at compile time and exposed via `__command_schema__/0`.
The framework auto-registers these commands when the extension loads.

## Options

- `:execute` (required) -- `{Module, :function}` MFA tuple. The function receives editor state and returns new state.
- `:requires_buffer` -- when `true`, command is skipped if no buffer is active (default: `false`)

## Examples

    command :org_cycle_todo, "Cycle TODO keyword",
      execute: {MingaOrg.Todo, :cycle},
      requires_buffer: true

    command :org_toggle_checkbox, "Toggle checkbox",
      execute: {MingaOrg.Checkbox, :toggle},
      requires_buffer: true

# `keybind`
*macro* 

Declares a keybinding this extension provides.

Accumulated at compile time and exposed via `__keybind_schema__/0`.
The framework auto-registers these keybindings when the extension loads.

## Examples

    keybind :normal, "SPC m t", :org_cycle_todo, "Cycle TODO"
    keybind :normal, "M-h", :org_promote_heading, "Promote heading", filetype: :org

# `load_policy`
*macro* 

Sets the extension's load policy.

See `Minga.Extension` for supported policies and examples.

# `modeline_segment`
*macro* 

Declares a modeline segment this extension provides.

The block receives `ctx`, the same context map used by built-in modeline segments, and returns a segment tuple, a list of segment tuples, `nil`, or `[]`.

## Examples

    modeline_segment :word_count, side: :right, priority: 50 do
      if ctx.data.filetype in [:markdown, :text, :org] do
        {" WORDS ", ctx.info_fg, ctx.bar_bg, [], nil}
      end
    end

---

*Consult [api-reference.md](api-reference.md) for complete listing*
