# `Minga.Config.ModelineSegments`
[🔗](https://github.com/jsmestad/minga/blob/main/lib/minga/config/modeline_segments.ex#L1)

ETS-backed registry for custom modeline segments.

User config and extensions register segment render functions here. The traditional shell modeline reads the registry on each render frame so config reloads take effect immediately without coupling the config layer to editor presentation modules.

# `register_error`

```elixir
@type register_error() ::
  Minga.Config.ModelineSegment.validation_error()
  | {:reserved_name, atom()}
  | {:duplicate_name, atom(), existing_source :: source(),
     attempted_source :: source()}
```

# `source`

```elixir
@type source() :: atom() | {:extension, atom()}
```

# `table`

```elixir
@type table() :: atom()
```

# `list`

```elixir
@spec list() :: [Minga.Config.ModelineSegment.t()]
```

Returns all custom modeline segments.

# `list`

```elixir
@spec list(table()) :: [Minga.Config.ModelineSegment.t()]
```

# `lookup`

```elixir
@spec lookup(atom()) :: Minga.Config.ModelineSegment.t() | nil
```

Looks up a custom segment by name.

# `lookup`

```elixir
@spec lookup(table(), atom()) :: Minga.Config.ModelineSegment.t() | nil
```

# `names_for_side`

```elixir
@spec names_for_side(Minga.Config.ModelineSegment.side()) :: [atom()]
```

Returns all custom segment names declared for a side, ordered by priority descending then name.

# `names_for_side`

```elixir
@spec names_for_side(table(), Minga.Config.ModelineSegment.side()) :: [atom()]
```

# `register`

```elixir
@spec register(atom(), keyword(), Minga.Config.ModelineSegment.render_fun()) ::
  :ok | {:error, register_error()}
```

Registers or replaces a custom modeline segment from user config.

# `register`

```elixir
@spec register(atom(), keyword(), Minga.Config.ModelineSegment.render_fun(), source()) ::
  :ok | {:error, register_error()}
```

Registers or replaces a custom modeline segment for a source.

# `register`

```elixir
@spec register(
  table(),
  atom(),
  keyword(),
  Minga.Config.ModelineSegment.render_fun(),
  source()
) ::
  :ok | {:error, register_error()}
```

# `register!`

```elixir
@spec register!(atom(), keyword(), Minga.Config.ModelineSegment.render_fun()) :: :ok
```

Registers a custom modeline segment and raises on invalid declarations or collisions.

# `register_error_message`

```elixir
@spec register_error_message(atom(), register_error()) :: String.t()
```

# `reserved_names`

```elixir
@spec reserved_names() :: [atom()]
```

Returns built-in or otherwise reserved modeline segment names that custom segments cannot use.

# `reset`

```elixir
@spec reset() :: :ok
```

Clears all custom modeline segments. Used during config reload.

# `reset`

```elixir
@spec reset(table()) :: :ok
```

# `reset_warnings`

```elixir
@spec reset_warnings() :: :ok
```

Clears warning-once modeline diagnostics without deleting registered segments.

# `reset_warnings`

```elixir
@spec reset_warnings(table()) :: :ok
```

# `start_link`

```elixir
@spec start_link(keyword()) :: GenServer.on_start()
```

Starts the process that owns the custom segment ETS table.

# `unregister`

```elixir
@spec unregister(atom()) :: :ok
```

Unregisters one custom modeline segment.

# `unregister`

```elixir
@spec unregister(table(), atom()) :: :ok
```

# `unregister_source`

```elixir
@spec unregister_source(source()) :: :ok
```

Removes every segment owned by a source, such as one extension.

# `unregister_source`

```elixir
@spec unregister_source(table(), source()) :: :ok
```

# `warn_once`

```elixir
@spec warn_once(term(), String.t()) :: :ok
```

Logs a warning once for a render-time modeline segment diagnostic.

# `warn_once`

```elixir
@spec warn_once(table(), term(), String.t()) :: :ok
```

---

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