libtmux
Typed library that provides an ORM wrapper for tmux, a terminal multiplexer.
Description
<div align="center"> <h1>⚙️ libtmux</h1> <p><strong>Drive tmux from Python: typed, object-oriented control over servers, sessions, windows, and panes.</strong></p> <p> <a href="https://libtmux.git-pull.com/"><img src="https://raw.githubusercontent.com/tmux-python/libtmux/master/docs/_static/img/libtmux.svg" alt="libtmux logo" height="120"></a> </p> <p> <a href="https://pypi.org/project/libtmux/"><img src="https://img.shields.io/pypi/v/libtmux.svg" alt="PyPI version"></a> <a href="https://libtmux.git-pull.com/"><img src="https://github.com/tmux-python/libtmux/workflows/docs/badge.svg" alt="Docs status"></a> <a href="https://github.com/tmux-python/libtmux/actions"><img src="https://github.com/tmux-python/libtmux/workflows/tests/badge.svg" alt="Tests status"></a> <a href="https://codecov.io/gh/tmux-python/libtmux"><img src="https://codecov.io/gh/tmux-python/libtmux/branch/master/graph/badge.svg" alt="Coverage"></a> <a href="https://github.com/tmux-python/libtmux/blob/master/LICENSE"><img src="https://img.shields.io/github/license/tmux-python/libtmux.svg" alt="License"></a> </p> </div> ## 🐍 What is libtmux? libtmux is a typed Python API over [tmux], the terminal multiplexer. Stop shelling out and parsing `tmux ls`. Instead, interact with real Python objects: `Server`, `Session`, `Window`, and `Pane`. The same API powers [tmuxp], so it stays battle-tested in real-world workflows. ### ✨ Features - Typed, object-oriented control of tmux state - Query and [traverse](https://libtmux.git-pull.com/topics/traversal/) live sessions, windows, and panes - Raw escape hatch via `.cmd(...)` on any object - Works with multiple tmux sockets and servers - [Context managers](https://libtmux.git-pull.com/topics/context_managers/) for automatic cleanup - [pytest plugin](https://libtmux.git-pull.com/api/pytest-plugin/) for isolated tmux fixtures - Proven in production via tmuxp and other tooling ## Requirements & support - tmux: >= 3.2a - Python: >= 3.10 (CPython and PyPy) Maintenance-only backports (no new fixes): - Python 2.x: [`v0.8.x`](https://github.com/tmux-python/libtmux/tree/v0.8.x) - tmux 1.8-3.1c: [`v0.48.x`](https://github.com/tmux-python/libtmux/tree/v0.48.x) ## 📦 Installation Stable release: ```console $ pip install libtmux ``` With pipx: ```console $ pipx install libtmux ``` With uv / uvx: ```console $ uv add libtmux ``` ```console $ uvx --from "libtmux" python ``` From the main branch (bleeding edge): ```console $ pip install 'git+https://github.com/tmux-python/libtmux.git' ``` Tip: libtmux is pre-1.0. Pin a range in projects to avoid surprises: requirements.txt: ```ini libtmux==0.50.* ``` pyproject.toml: ```toml libtmux = "0.50.*" ``` ## 🚀 Quickstart ### Open a tmux session First, start a tmux session to connect to: ```console $ tmux new-session -s foo -n bar ``` ### Pilot your tmux session via Python Use [ptpython], [ipython], etc. for a nice REPL with autocompletions: ```console $ pip install --user ptpython ``` ```console $ ptpython ``` Connect to a live tmux session: ```python >>> import libtmux >>> svr = libtmux.Server() >>> svr Server(socket_path=/tmp/tmux-.../default) ``` **Tip:** You can also use [tmuxp]'s [`tmuxp shell`] to drop straight into your current tmux server / session / window / pane. [ptpython]: https://github.com/prompt-toolkit/ptpython [ipython]: https://ipython.org/ [`tmuxp shell`]: https://tmuxp.git-pull.com/cli/shell/ ### Run any tmux command Every object has a `.cmd()` escape hatch that honors socket name and path: ```python >>> server = Server(socket_name='libtmux_doctest') >>> server.cmd('display-message', 'hello world') <libtmux...> ``` Create a new session: ```python >>> server.cmd('new-session', '-d', '-P', '-F#{session_id}').stdout[0] '$...' ``` ### List and filter sessions [**Learn more about Filtering**](https://libtmux.git-pull.com/topics/filtering/) ```python >>> server.sessions [Session($... ...), ...] ``` Filter by attribute: ```python >>> server.sessions.filter(history_limit='2000') [Session($... ...), ...] ``` Direct lookup: ```python >>> server.sessions.get(session_id=session.session_id) Session($... ...) ``` ### Control sessions and windows [**Learn more about Workspace Setup**](https://libtmux.git-pull.com/topics/workspace_setup/) ```python >>> session.rename_session('my-session') Session($... my-session) ``` Create new window in the background (don't switch to it): ```python >>> bg_window = session.new_window(attach=False, window_name="bg-work") >>> bg_window Window(@... ...:bg-work, Session($... ...)) >>> session.windows.filter(window_name__startswith="bg") [Window(@... ...:bg-work, Session($... ...))] >>> session.windows.get(window_name__startswith="bg") Window(@... ...:bg-work, Session($... ...)) >>> bg_window.kill() ``` ### Split windows and send keys [**Learn more about Pane Interaction**](https://libtmux.git-pull.com/topics/pane_interaction/) ```python >>> pane = window.sp
Release History
| Version | Changes | Urgency | Date |
|---|---|---|---|
| 0.55.1 | Imported from PyPI (0.55.1) | Low | 4/21/2026 |
| v0.55.1 | A point release focused on a pytest-plugin cleanup fix, a new Sphinx extension for documenting pytest fixtures, and a docs-stack migration to [gp-sphinx](https://gp-sphinx.git-pull.com). ## Highlights ### Fix: `pytest_plugin` leaks tmux socket files on teardown (#661, fixes #660) The `server` and `TestServer` fixtures now `unlink(2)` the tmux socket from `/tmp/tmux-<uid>/` during teardown, in addition to calling `server.kill()`. tmux does not reliably remove its own socket on non-gracef | High | 4/19/2026 |
| v0.55.0 | ## What's Changed via @tony in https://github.com/tmux-python/libtmux/pull/636 ### Pane.set_title() New `Pane.set_title()` method wraps `select-pane -T` and returns the pane for method chaining. A `Pane.title` property aliases `pane_title` for convenience: ```python pane.set_title("my-worker") pane.pane_title # 'my-worker' pane.title # 'my-worker' ``` The `pane_title` format variable is now included in libtmux's pane format queries (it was previously excluded via an | Low | 3/8/2026 |
| v0.54.0 | ## Highlights - **Structured lifecycle logging** across Server, Session, Window, and Pane with filterable `extra` context - **Bug fixes** for `rename_window()`, `Server.kill()`, `new_session()`, and `kill_window()` error handling --- ## What's new ### Structured lifecycle logging ([#637](https://github.com/tmux-python/libtmux/pull/637)) All lifecycle operations (create, kill, rename, split) now emit INFO-level log records with structured `extra` context. Every log call includes s | Low | 3/7/2026 |
| v0.53.1 | ## What's Changed ### Bug fixes * Fix race condition in new_session() by avoiding list-sessions query by @neubig in https://github.com/tmux-python/libtmux/pull/625 ### Development * build: Migrate from Makefile to justfile by @tony in https://github.com/tmux-python/libtmux/pull/617 ## New Contributors * @neubig made their first contribution in https://github.com/tmux-python/libtmux/pull/625 **Full Changelog**: https://github.com/tmux-python/libtmux/compare/v0.53.0...v0.53.1 | Low | 2/19/2026 |
| v0.53.0 | A focused maintenance release that fixes a critical bug in `Session.attach()` that caused tracebacks when users killed sessions while attached via `tmuxp load`. ## Highlights - **Fixed:** `Session.attach()` no longer raises `TmuxObjectDoesNotExist` when a user kills the session during attachment - **Breaking:** `Session.attach()` no longer calls `refresh()` after returning (semantically incorrect for interactive commands) --- ## Bug Fixes ### Session.attach() no longer fails if s | Low | 12/14/2025 |
| v0.52.1 | ## Development * ci(release): Migrate to PyPI Trusted Publisher by @tony in https://github.com/tmux-python/libtmux/pull/615 **Full Changelog**: https://github.com/tmux-python/libtmux/compare/v0.52.0...v0.52.1 | Low | 12/7/2025 |
| v0.52.0 | # libtmux 0.52.0 ## `capture_pane()` enhancements The `Pane.capture_pane()` method now supports 5 new parameters exposing additional tmux `capture-pane` flags: | Parameter | tmux Flag | Description | |-----------|-----------|-------------| | `escape_sequences` | `-e` | Include ANSI escape sequences (colors, attributes) | | `escape_non_printable` | `-C` | Escape non-printable chars as octal `\xxx` | | `join_wrapped` | `-J` | Join wrapped lines back together | | `preserve_trailing` | | Low | 12/7/2025 |
| v0.51.0 | ## Breaking Changes ### Deprecate legacy APIs Legacy API methods (deprecated in v0.16–v0.33) now raise `DeprecatedError` (hard error) instead of emitting `DeprecationWarning`. See the [migration guide](https://libtmux.git-pull.com/migration.html) for full context and examples. * Deprecate legacy APIs (raise `DeprecatedError`) by @tony in https://github.com/tmux-python/libtmux/pull/611 ### Method Renamings | Deprecated | Replacement | Class | Deprecated Since | |------------|-- | Low | 12/6/2025 |
| v0.50.1 | ## Documentation * Doc fixes by @tony in https://github.com/tmux-python/libtmux/pull/612 **Full Changelog**: https://github.com/tmux-python/libtmux/compare/v0.50.0...v0.50.1 | Low | 12/6/2025 |
| v0.50.0 | libtmux 0.50 brings a major enhancement to option and hook management with a unified, typed API for managing tmux options and hooks across all object types. ## Highlights - **Unified Options API**: New `show_option()`, `show_options()`, `set_option()`, and `unset_option()` methods available on Server, Session, Window, and Pane - **Hook Management**: Full programmatic control over tmux hooks with support for indexed hook arrays and bulk operations - **SparseArray**: New internal data stru | Low | 11/30/2025 |
| v0.49.0 | ## What's Changed ### Breaking: tmux <3.2 fully dropped * Drop support for tmux versions < 3.2 by @tony in https://github.com/tmux-python/libtmux/pull/608 **Full Changelog**: https://github.com/tmux-python/libtmux/compare/v0.48.0...v0.49.0 | Low | 11/29/2025 |
| v0.48.0 | ## What's Changed ### Breaking: tmux <3.2 deprecated Deprecate old tmux versions by @tony in https://github.com/tmux-python/libtmux/pull/606 ### Development tmux: Add tmux 3.6 to testgrid by @tony in https://github.com/tmux-python/libtmux/pull/607 **Full Changelog**: https://github.com/tmux-python/libtmux/compare/v0.47.0...v0.48.0 | Low | 11/28/2025 |
| v0.47.0 | ## Breaking changes * Support Python 3.14 by @tony in https://github.com/tmux-python/libtmux/pull/601 * Drop Python 3.9 by @tony in https://github.com/tmux-python/libtmux/pull/602 **Full Changelog**: https://github.com/tmux-python/libtmux/compare/v0.46.2...v0.47.0 | Low | 11/1/2025 |
| v0.46.2 | ## What's Changed * Fix `new_window` argument typing in `Session` by @Data5tream in https://github.com/tmux-python/libtmux/pull/596 * types: Add `StrPath` typing, fix `new_session` by @tony in https://github.com/tmux-python/libtmux/pull/597 * types: Add `StrPath` typing, fix `new_session`, part 2 by @tony in https://github.com/tmux-python/libtmux/pull/598 ## New Contributors * @Data5tream made their first contribution in https://github.com/tmux-python/libtmux/pull/596 **Full Chan | Low | 5/26/2025 |
| v0.46.1 | **Full Changelog**: https://github.com/tmux-python/libtmux/compare/v0.46.0...v0.46.1 # Changes ## Feature branch at [v0.46.x](https://github.com/tmux-python/libtmux/tree/v0.46.x) [v0.46.x](https://github.com/tmux-python/libtmux/tree/v0.46.x) will extend the life of v0.46.0 while new features are being developed for watching for changes within libtmux panes, windows, and sessions. See: - https://github.com/tmux-python/libtmux/pull/587 - https://github.com/tmux-python/libtmux/pull/58 | Low | 3/16/2025 |
| v0.46.0 | ## Breaking Changes - **Test Helper Imports Refactored**: Direct imports from `libtmux.test` are no longer possible. You must now import from specific submodules (#580) ```python # Before: from libtmux.test import namer # After: from libtmux.test.named import namer ``` ```python # Before: from libtmux.test import RETRY_INTERVAL_SECONDS # After: from libtmux.test.constants import RETRY_INTERVAL_SECONDS ``` ## Internal Improvements - **Enhanced Test | Low | 2/25/2025 |
| v0.45.0 | ## What's Changed ### Breaking Changes #### Test helpers: Refactor by @tony in https://github.com/tmux-python/libtmux/pull/578 Test helper functionality has been split into focused modules (#578): - `libtmux.test` module split into: - `libtmux.test.constants`: Test-related constants (`TEST_SESSION_PREFIX`, etc.) - `libtmux.test.environment`: Environment variable mocking - `libtmux.test.random`: Random string generation utilities - `libtmux.test.temporary`: Temporary ses | Low | 2/23/2025 |
| v0.44.2 | ## What's Changed ### Bug fixes * fix(typings) Move typing-extensions into `TypeGuard` by @tony in https://github.com/tmux-python/libtmux/pull/572 ### Documentation * Doc / typos fixes by @tony in https://github.com/tmux-python/libtmux/pull/569 ### Development * Tests: Improved parametrization by @tony in https://github.com/tmux-python/libtmux/pull/570 **Full Changelog**: https://github.com/tmux-python/libtmux/compare/v0.44.1...v0.44.2 | Low | 2/17/2025 |
| v0.44.1 | ## What's Changed ### Packaging * types: Only use typing-extensions if necessary by @ppentchev in https://github.com/tmux-python/libtmux/pull/563 **Full Changelog**: https://github.com/tmux-python/libtmux/compare/v0.44.0...v0.44.1 | Low | 2/17/2025 |
| v0.44.0 | ## What's Changed ### Support for context managers _by @tony in https://github.com/tmux-python/libtmux/pull/566_. Added context manager support for all main tmux objects: - `Server`: Automatically kills the server when exiting the context - `Session`: Automatically kills the session when exiting the context - `Window`: Automatically kills the window when exiting the context - `Pane`: Automatically kills the pane when exiting the context Example usage: ```python with Server() | Low | 2/16/2025 |
| v0.43.0 | ## What's Changed ### New feature * `TestServer`: `Server`, but `partial`'d to run on a test socket by @tony in https://github.com/tmux-python/libtmux/pull/565 ### Documentation * Fix "Topics" links in docs * docs(traversal) Add more doctests by @tony in https://github.com/tmux-python/libtmux/pull/567 **Full Changelog**: https://github.com/tmux-python/libtmux/compare/v0.42.1...v0.43.0 | Low | 2/15/2025 |
| v0.42.1 | ## Changes ### Packaging: `typing-extensions` usage * Move a typing-extensions import into a t.TYPE_CHECKING section by @ppentchev in https://github.com/tmux-python/libtmux/pull/562 * py(deps[testing,lint]) Add `typing-extensions` for older python versions by @tony in https://github.com/tmux-python/libtmux/pull/564 **Full Changelog**: https://github.com/tmux-python/libtmux/compare/v0.42.0...v0.42.1 | Low | 2/15/2025 |
| v0.42.0 | ## What's Changed ### Improvements * `tmux_cmd`: Modernize to use `text=True` by @tony in https://github.com/tmux-python/libtmux/pull/560 Attempted fix for https://github.com/tmux-python/libtmux/pull/558. **Full Changelog**: https://github.com/tmux-python/libtmux/compare/v0.41.0...v0.42.0 | Low | 2/2/2025 |
| v0.41.0 | ## What's Changed ### Fixes * Fix hardcoded uid in `__str__` method of `Server` class by @lazysegtree in https://github.com/tmux-python/libtmux/pull/557 ### Development * Use future annotations by @tony in https://github.com/tmux-python/libtmux/pull/555 ### Documentation * Fix docstring for color parameter by @TravisDart in https://github.com/tmux-python/libtmux/pull/544 ## New Contributors * @lazysegtree made their first contribution in https://github.com/tmux-python/libtm | Low | 2/2/2025 |
| v0.40.1 | ## Bug fixes * Fix passing both window command and environment by @ppentchev in https://github.com/tmux-python/libtmux/pull/553 ## New Contributors * @ppentchev made their first contribution in https://github.com/tmux-python/libtmux/pull/553 **Full Changelog**: https://github.com/tmux-python/libtmux/compare/v0.40.0...v0.40.1 | Low | 12/24/2024 |
| v0.40.0 | _Maintenance only, no bug fixes or new features_ ## Development * Python 3.9 Modernization by @tony in https://github.com/tmux-python/libtmux/pull/550 * test(legacy[session]) Stabilize assertion by @tony in https://github.com/tmux-python/libtmux/pull/552 **Full Changelog**: https://github.com/tmux-python/libtmux/compare/v0.39.0...v0.40.0 | Low | 12/21/2024 |
| v0.39.0 | ## What's Changed ### Breaking changes * Drop Python 3.8 by @tony in https://github.com/tmux-python/libtmux/pull/548 Python 3.8 reached end-of-life on October 7th, 2024 (see devguide.python.org, Status of Python Versions, Unsupported versions See also: https://devguide.python.org/versions/#unsupported-versions **Full Changelog**: https://github.com/tmux-python/libtmux/compare/v0.38.1...v0.39.0 | Low | 11/26/2024 |
| v0.38.1 | **Full Changelog**: https://github.com/tmux-python/libtmux/compare/v0.38.0...v0.38.1 Minimum Python back to 3.8 for now. | Low | 11/26/2024 |
| v0.38.0 | ## What's Changed ### Development - Project and package management: poetry to uv (#547) [uv] is the new package and project manager for the project, replacing Poetry. - Code quality: Use f-strings in more places (#540) via [ruff 0.4.2](https://github.com/astral-sh/ruff/blob/v0.4.2/CHANGELOG.md). [uv]: https://github.com/astral-sh/uv ### Documentation * [docs] Sphinx v8 compatibility: configure a non-empty inventory name for Python Intersphinx mapping. by @jayaddison i | Low | 11/26/2024 |
| v0.37.0 | ## Tests * pytest-xdist support in https://github.com/tmux-python/libtmux/pull/522 * test stability improvements in https://github.com/tmux-python/libtmux/pull/522 * `retry_until()` tests: Relax clock in `assert`. * `tests/test_pane.py::test_capture_pane_start`: Use `retry_until()` to poll, improve correctness of test. **Full Changelog**: https://github.com/tmux-python/libtmux/compare/v0.36.0...v0.37.0 | Low | 4/21/2024 |
| v0.36.0 | ## What's Changed * Linting: Aggressive `ruff` pass (ruff v0.3.4) by @tony in https://github.com/tmux-python/libtmux/pull/539 **Full Changelog**: https://github.com/tmux-python/libtmux/compare/v0.35.1...v0.36.0 | Low | 3/24/2024 |
| v0.35.1 | ## What's Changed * fix: server.attached_sessions by @patrislav1 in https://github.com/tmux-python/libtmux/pull/537 * chore(Server.attached_sessions): Use .filter() by @tony in https://github.com/tmux-python/libtmux/pull/538 ## New Contributors * @patrislav1 made their first contribution in https://github.com/tmux-python/libtmux/pull/537 **Full Changelog**: https://github.com/tmux-python/libtmux/compare/v0.35.0...v0.35.1 | Low | 3/23/2024 |
| v0.35.0 | ## Breaking changes * refactor: Eliminate redundant targets / window_index's across codebase by @tony in https://github.com/tmux-python/libtmux/pull/536 **Full Changelog**: https://github.com/tmux-python/libtmux/compare/v0.34.0...v0.35.0 | Low | 3/17/2024 |
| v0.34.0 | ## Breaking #### Command target change ([#535](https://github.com/tmux-python/libtmux/issues/535)) Commands: All `cmd()` methods using custom or overridden targets must use the keyword argument `target`. This avoids entanglement with inner shell values that include `-t` for other purposes. These methods include: - [`Server.cmd()`](https://libtmux.git-pull.com/reference/servers.html#libtmux.Server.cmd "libtmux.Server.cmd") - [`Session.cmd()`](https://libtmux.git-pull.com/reference | Low | 3/17/2024 |
| v0.33.0 | ### Breaking changes[](https://libtmux.git-pull.com/history.html#breaking-changes "Permalink to this heading") #### Improved new sessions ([](https://github.com/tmux-python/libtmux/issues/532)[#532](https://github.com/tmux-python/libtmux/issues/532))[](https://libtmux.git-pull.com/history.html#improved-new-sessions-532 "Permalink to this heading") - `Session.new_window()`: - Learned `direction`, via [`WindowDirection`](https://libtmux.git-pull.com/reference/constants.html#libtmux.cons | Low | 3/17/2024 |
| v0.33.0b1 | ## What's Changed * Split, new window follow ups by @tony in https://github.com/tmux-python/libtmux/pull/534 **Full Changelog**: https://github.com/tmux-python/libtmux/compare/v0.33.0b0...v0.33.0b1 | Low | 3/17/2024 |
| v0.33.0b0 | ### Breaking changes[](https://libtmux.git-pull.com/history.html#breaking-changes "Permalink to this heading") #### Improved new sessions ([](https://github.com/tmux-python/libtmux/issues/532)[#532](https://github.com/tmux-python/libtmux/issues/532))[](https://libtmux.git-pull.com/history.html#improved-new-sessions-532 "Permalink to this heading") - `Session.new_window()` to [`Session.new_window()`](https://libtmux.git-pull.com/reference/sessions.html#libtmux.Session.new_window "libtmux.Se | Low | 3/17/2024 |
| v0.32.0 | ## What's Changed * Fix docstring ordering in pane.split_window by @Ngalstyan4 in https://github.com/tmux-python/libtmux/pull/528 * Add implicit exports into __init__.py by @ssbarnea in https://github.com/tmux-python/libtmux/pull/531 ## New Contributors * @Ngalstyan4 made their first contribution in https://github.com/tmux-python/libtmux/pull/528 * @ssbarnea made their first contribution in https://github.com/tmux-python/libtmux/pull/531 **Full Changelog**: https://github.com/tmux-pyth | Low | 3/2/2024 |
| v0.31.0post0 | # Post-release Documentation Fixes - Doc fixes to command examples **Full Changelog**: https://github.com/tmux-python/libtmux/compare/v0.31.0...v0.31.0post0 | Low | 2/17/2024 |
| v0.31.0 | ## Cleanups ([#527](https://github.com/tmux-python/libtmux/issues/527)) - Streamline {Server,Session,Window,Pane}.cmd(), across all usages to: - Use cmd: str as first positional - Removed unused keyword arguments **kwargs ## Renamings ([#527](https://github.com/tmux-python/libtmux/issues/527)) - Session.attached_window renamed to [Session.active_window()](http://localhost:8023/reference/sessions.html#libtmux.Session.active_window) - Session.attached_window deprecated - Session.a | Low | 2/17/2024 |
| v0.30.2 | - `TMUX_MAX_VERSION`: 3.3 -> 3.4 **Full Changelog**: https://github.com/tmux-python/libtmux/compare/v0.30.1...v0.30.2 | Low | 2/16/2024 |
| v0.30.1 | - pytest plugin, test module: Update to renamed methods introduced in v0.30.0 **Full Changelog**: https://github.com/tmux-python/libtmux/compare/v0.30.0...v0.30.1 | Low | 2/16/2024 |
| v0.30.0 | # New and improved commands by @tony in https://github.com/tmux-python/libtmux/pull/525 ### New commands - `Pane.kill()` ### Renamed commands - `Window.select_window()` renamed to `Window.select()` - Deprecated `Window.select_window()` - `Pane.select_pane()` renamed to `Pane.select()` - Deprecated `Pane.pane_select()` - `Session.attach_session()` renamed to `Session.attach()` - Deprecated `Session.attach_session()` - `Server.kill_server()` renamed to `Server.kill()` | Low | 2/16/2024 |
| v0.29.0 | ## Develpment * fix(warnings): Use `DeprecationWarning` for APIs being deprecated by @tony in https://github.com/tmux-python/libtmux/pull/526 ## Testing * pytest: Ignore `DeprecationWarning` in tests @tony in https://github.com/tmux-python/libtmux/pull/526 **Full Changelog**: https://github.com/tmux-python/libtmux/compare/v0.28.1...v0.29.0 | Low | 2/16/2024 |
| v0.28.1 | _Maintenance only, no bug fixes or new features_ #### Testing - CI: Bump actions to node 20+ versions #### Documentation - Refine docs and add migration for v0.28.0 **Full Changelog**: https://github.com/tmux-python/libtmux/compare/v0.28.0...v0.28.1 | Low | 2/15/2024 |
| v0.28.0 | # Breaking changes ## `Session.new_window()` + `Window.split_window()`: No longer attaches by default - 0.28 +: Now _defaults_ to `attach=False`. - 0.27.1 and before: _defaults_ to `attach=True`. Pass `attach=True` for the old behavior. ## `Pane.resize_pane()` renamed to `Pane.resize()`: (#523) This convention will be more consistent with `Window.resize()`. ## `Pane.resize_pane()`: Params changed (#523) - No longer accepts `-U`, `-D`, `-L`, `-R` directly, instead accepts | Low | 2/15/2024 |
| v0.27.1 | ## What's Changed * pyproject: Include `MIGRATION` in sdist by @tony in https://github.com/tmux-python/libtmux/pull/517, for https://github.com/tmux-python/libtmux/issues/508 **Full Changelog**: https://github.com/tmux-python/libtmux/compare/v0.27.0...v0.27.1 | Low | 2/8/2024 |
| v0.27.0 | ### Improvements - QueryList: Generic fixes by @tony in https://github.com/tmux-python/libtmux/pull/515 - This improves the annotations in descendant objects such as: - `Server.sessions` - `Session.windows` - `Window.panes` - Bolster tests (ported from `libvcs`): doctests and pytests **Full Changelog**: https://github.com/tmux-python/libtmux/compare/v0.26.0...v0.27.0 | Low | 2/7/2024 |
| v0.26.0 | ## What's Changed ### Breaking change - `get_by_id()` (already deprecated) keyword argument renamed from `id` to `Server.get_by_id(session_id)`, `Session.get_by_id(window_id)`, and `Window.get_by_id(pane_id)` (#514) ### Documentation - Various docstring fixes and tweaks (#514) ### Development - Strengthen linting (#514) - Add flake8-commas (COM) - https://docs.astral.sh/ruff/rules/#flake8-commas-com - https://pypi.org/project/flake8-commas/ - Add flake8 | Low | 2/6/2024 |
| v0.25.0 | ## Changes ### Comparator fixes * Fixed `__eq__` for windows. by @m1guelperez in https://github.com/tmux-python/libtmux/pull/505 * fix(pane,session,server): Return `False` if type mismatched by @tony in https://github.com/tmux-python/libtmux/pull/510 ### Documentation * ruff: Enable pydocstyle w/ numpy convention by @tony in https://github.com/tmux-python/libtmux/pull/509 ## New Contributors * @m1guelperez made their first contribution in https://github.com/tmux-python/libtmux/p | Low | 11/25/2023 |
