Colors - tmuxp._internal.colors

Warning

Be careful with these! Internal APIs are not covered by version policies. They can break or be removed between minor versions!

If you need an internal API stabilized please file an issue.

Color output utilities for tmuxp CLI.

This module provides semantic color utilities following patterns from vcspull and CPython’s _colorize module. It includes low-level ANSI styling functions and high-level semantic color utilities.

Examples

Basic usage with automatic TTY detection (AUTO mode is the default). In a TTY, colored text is returned; otherwise plain text:

>>> colors = Colors()

Force colors on or off:

>>> colors = Colors(ColorMode.ALWAYS)
>>> colors.success("loaded")
'...'
>>> colors = Colors(ColorMode.NEVER)
>>> colors.success("loaded")
'loaded'

Environment variables NO_COLOR and FORCE_COLOR are respected. NO_COLOR takes highest priority (disables even in ALWAYS mode):

>>> monkeypatch.setenv("NO_COLOR", "1")
>>> colors = Colors(ColorMode.ALWAYS)
>>> colors.success("loaded")
'loaded'

FORCE_COLOR enables colors in AUTO mode even without TTY:

>>> import sys
>>> monkeypatch.delenv("NO_COLOR", raising=False)
>>> monkeypatch.setenv("FORCE_COLOR", "1")
>>> monkeypatch.setattr(sys.stdout, "isatty", lambda: False)
>>> colors = Colors(ColorMode.AUTO)
>>> colors.success("loaded")
'...'
class tmuxp._internal.colors.ColorMode

Bases: Enum

Color output modes for CLI.

Examples

>>> ColorMode.AUTO.value
'auto'
>>> ColorMode.ALWAYS.value
'always'
>>> ColorMode.NEVER.value
'never'
class tmuxp._internal.colors.Colors

Bases: object

Semantic color utilities for CLI output.

Provides semantic color methods (success, warning, error, etc.) that conditionally apply ANSI colors based on the color mode and environment.

Parameters:

mode (ColorMode) – Color mode to use. Default is AUTO which detects TTY.

Examples

>>> colors = Colors(ColorMode.NEVER)
>>> colors.success("session loaded")
'session loaded'
>>> colors.error("failed to load")
'failed to load'
>>> colors = Colors(ColorMode.ALWAYS)
>>> result = colors.success("ok")

Check that result contains ANSI escape codes:

>>> "\033[" in result
True
tmuxp._internal.colors.get_color_mode(color_arg=None)
function[source]

Convert CLI argument string to ColorMode enum.

Parameters:

color_arg (str | None) – Color mode argument from CLI (auto, always, never). None defaults to AUTO.

Returns:

The determined color mode. Invalid values return AUTO.

Return type:

ColorMode

Examples

>>> get_color_mode(None)
<ColorMode.AUTO: 'auto'>
>>> get_color_mode("always")
<ColorMode.ALWAYS: 'always'>
>>> get_color_mode("NEVER")
<ColorMode.NEVER: 'never'>
>>> get_color_mode("invalid")
<ColorMode.AUTO: 'auto'>
tmuxp._internal.colors.strip_ansi(value)
function[source]

Clear ANSI escape codes from a string value.

Parameters:

value (str) – String potentially containing ANSI escape codes.

Returns:

String with ANSI codes removed.

Return type:

str

Examples

>>> strip_ansi("\033[32mgreen\033[0m")
'green'
>>> strip_ansi("plain text")
'plain text'
tmuxp._internal.colors._interpret_color(color, offset=0)
function[source]

Convert color specification to ANSI escape code number.

Parameters:
  • color (int | tuple[int, int, int] | str) – Color as 256-color index, RGB tuple, or color name.

  • offset (int) – Offset for background colors (10 for bg).

Returns:

ANSI escape code parameters.

Return type:

str

Examples

Color name returns base ANSI code:

>>> _interpret_color("red")
'31'

256-color index returns extended format:

>>> _interpret_color(196)
'38;5;196'

RGB tuple returns 24-bit format:

>>> _interpret_color((255, 128, 0))
'38;2;255;128;0'
exception tmuxp._internal.colors.UnknownStyleColor
exception[source]

Bases: Exception

Raised when encountering an unknown terminal style color.

Examples

>>> try:
...     raise UnknownStyleColor("invalid_color")
... except UnknownStyleColor as e:
...     "invalid_color" in str(e)
True
tmuxp._internal.colors.style(text, fg=None, bg=None, bold=None, dim=None, underline=None, overline=None, italic=None, blink=None, reverse=None, strikethrough=None, reset=True)
function[source]

Apply ANSI styling to text.

Credit: click.

Parameters:
  • text (Any) – Text to style (will be converted to str).

  • fg (CLIColour | None) – Foreground color (name, 256-index, or RGB tuple).

  • bg (CLIColour | None) – Background color.

  • bold (bool | None) – Apply bold style.

  • dim (bool | None) – Apply dim style.

  • underline (bool | None) – Apply underline style.

  • overline (bool | None) – Apply overline style.

  • italic (bool | None) – Apply italic style.

  • blink (bool | None) – Apply blink style.

  • reverse (bool | None) – Apply reverse video style.

  • strikethrough (bool | None) – Apply strikethrough style.

  • reset (bool) – Append reset code at end. Default True.

Returns:

Styled text with ANSI escape codes.

Return type:

str

Examples

>>> style("hello", fg="green")
'\x1b[32m...'
>>> "hello" in style("hello", fg="green")
True
tmuxp._internal.colors.unstyle(text)
function[source]

Remove ANSI styling information from a string.

Usually it’s not necessary to use this function as tmuxp_echo function will automatically remove styling if necessary.

Credit: click.

Parameters:

text (str) – Text to remove style information from.

Returns:

Text with ANSI codes removed.

Return type:

str

Examples

>>> unstyle("\033[32mgreen\033[0m")
'green'
tmuxp._internal.colors.build_description(intro, example_blocks)
function[source]

Assemble help text with optional example sections.

Parameters:
  • intro (str) – The introductory description text.

  • example_blocks (sequence of (heading, commands) tuples) – Each tuple contains an optional heading and a sequence of example commands. If heading is None, the section is titled “examples:”. If heading is provided, it becomes the section title (without “examples:”).

Returns:

Formatted description with examples.

Return type:

str

Examples

>>> from tmuxp._internal.colors import build_description
>>> build_description("My tool.", [(None, ["mytool run"])])
'My tool.\n\nexamples:\n  mytool run'
>>> build_description("My tool.", [("sync", ["mytool sync repo"])])
'My tool.\n\nsync examples:\n  mytool sync repo'
>>> build_description("", [(None, ["cmd"])])
'examples:\n  cmd'