Changelog¶
For instructions on installing the development version of libtmux, refer to development releases.
pip:
$ pip install --user --upgrade --pre libtmux
pipx:
$ pipx install --suffix=@next 'libtmux' --pip-args '\--pre' --force
// Usage: libtmux@next [command]
uv:
$ uv add libtmux --prerelease allow
uvx:
$ uvx --from 'libtmux' --prerelease allow python
libtmux 0.54.x (Yet to be released)¶
libtmux 0.53.0 (2025-12-14)¶
Breaking changes¶
Session.attach() no longer calls refresh() (#616)¶
attach() previously called refresh()
after the attach-session command returned. This was semantically incorrect since
attach-session is a blocking interactive command where session state can change
arbitrarily during attachment.
This was never strictly defined behavior as libtmux abstracts tmux internals away.
Code that relied on the session object being refreshed after attach() should
explicitly call session.refresh() if needed.
Bug fixes¶
Session.attach() no longer fails if session killed during attachment (#616)¶
Fixed an issue where attach() would raise
TmuxObjectDoesNotExist when a user killed the session while
attached (e.g., closing all windows) and then detached.
libtmux 0.52.1 (2025-12-07)¶
CI¶
Migrate to PyPI Trusted Publisher (#615)¶
PyPI publishing now uses OIDC-based Trusted Publisher instead of API tokens. This improves security and enables package attestations for supply chain verification.
libtmux 0.52.0 (2025-12-07)¶
Pane.capture_pane() enhanced (#614)¶
The capture_pane() method now supports 5 new parameters
that expose additional tmux capture-pane flags:
Parameter |
tmux Flag |
Description |
|---|---|---|
|
|
Include ANSI escape sequences (colors, attributes) |
|
|
Escape non-printable chars as octal |
|
|
Join wrapped lines back together |
|
|
Preserve trailing spaces at line ends |
|
|
Trim trailing empty positions (tmux 3.4+) |
Capturing colored output:
# Capture with ANSI escape sequences preserved
pane.send_keys('printf "\\033[31mRED\\033[0m"', enter=True)
output = pane.capture_pane(escape_sequences=True)
# Output contains: '\x1b[31mRED\x1b[0m'
Joining wrapped lines:
# Long lines that wrap are joined back together
output = pane.capture_pane(join_wrapped=True)
Version compatibility:
The trim_trailing parameter requires tmux 3.4+. If used with an older version,
a warning is issued and the flag is ignored. All other parameters work with
libtmux’s minimum supported version (tmux 3.2a).
libtmux 0.51.0 (2025-12-06)¶
Breaking changes¶
APIs deprecated (#611)¶
Legacy API methods (deprecated in 0.16-0.33) now raise DeprecatedError (hard error) instead of emitting DeprecationWarning.
See Migration notes for full context and examples.
Deprecated API |
Replacement |
Deprecated |
Raises |
Note |
|---|---|---|---|---|
|
0.30.0 |
0.51.0 |
Server |
|
|
0.30.0 |
0.51.0 |
Session |
|
|
0.30.0 / 0.33.0 |
0.51.0 |
Window |
|
|
0.28.0 / 0.30.0 / 0.33.0 |
0.51.0 |
Pane |
|
|
0.31.0 |
0.51.0 |
Session/Window |
|
|
0.16.0 / 0.17.0 |
0.51.0 |
Query/filter helpers |
|
Dict-style access ( |
Attribute access (e.g., |
0.17.0 |
0.51.0 |
All tmux objects |
The following deprecations from 0.50.0 continue to emit DeprecationWarning (soft deprecation):
Deprecated API |
Replacement |
Deprecated |
Note |
|---|---|---|---|
|
|
0.50.0 |
Window |
|
|
0.50.0 |
Options & hooks |
libtmux 0.50.1 (2025-12-06)¶
Documentation (#612)¶
Normalize docs headings and Sphinx module directives to fix anchor and index generation issues.
Tweak Sphinx type-hints configuration to avoid RST indentation conflicts and suppress forward-reference warnings.
Refresh docstrings and cross-references (pane/window APIs, environment helpers, pytest plugin) for clearer return types and stable anchors.
Fix incorrect return type annotations for
capture_pane()anddisplay_message()methods (changed fromstr | list[str]tolist[str]- the methods always return a list).
libtmux 0.50.0 (2025-11-30)¶
Overview¶
libtmux 0.50 brings a major enhancement to option and hook management. The new
OptionsMixin and HooksMixin classes provide 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(), andunset_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 structure for handling tmux’s sparse indexed arrays (e.g.,
command-alias[0],command-alias[99]).tmux 3.2+ baseline: Removed support for tmux versions below 3.2a, enabling cleaner code and full hook/option feature support.
What’s New¶
Unified Options API (#516)¶
All tmux objects now share a consistent options interface through
OptionsMixin:
import libtmux
server = libtmux.Server()
session = server.sessions[0]
window = session.windows[0]
pane = window.panes[0]
# Get all options as a structured dict
session.show_options()
# {'activity-action': 'other', 'base-index': 0, ...}
# Get a single option value
session.show_option('base-index')
# 0
# Set an option
window.set_option('automatic-rename', True)
# Unset an option (revert to default)
window.unset_option('automatic-rename')
New methods on Server, Session, Window, and Pane:
Method |
Description |
|---|---|
|
Get all options as a structured dict |
|
Get a single option value |
|
Set an option |
|
Unset/remove an option |
New parameters for set_option():
Parameter |
tmux flag |
Description |
|---|---|---|
|
|
Expand format strings in value |
|
|
Unset the option |
|
|
Set as global option |
|
|
Also unset in child panes |
|
|
Don’t overwrite if exists |
|
|
Suppress warnings |
|
|
Append to existing value |
Hook Management (#516)¶
New HooksMixin provides programmatic control over tmux hooks:
session = server.sessions[0]
# Set a hook
session.set_hook('session-renamed', 'display-message "Renamed!"')
# Get hook value
session.show_hook('session-renamed')
# 'display-message "Renamed!"'
# Get all hooks
session.show_hooks()
# {'session-renamed': 'display-message "Renamed!"'}
# Remove a hook
session.unset_hook('session-renamed')
Indexed hooks and bulk operations:
tmux hooks support multiple values via indices (e.g., session-renamed[0],
session-renamed[1]). The bulk operations API makes this easy:
# Set multiple hooks at once
session.set_hooks('session-renamed', {
0: 'display-message "Hook 0"',
1: 'display-message "Hook 1"',
5: 'run-shell "echo hook 5"',
})
Hook methods available on Server, Session, Window, and Pane:
Method |
Description |
|---|---|
|
Set a hook |
|
Get hook value (returns SparseArray for indexed hooks) |
|
Get all hooks |
|
Remove a hook |
|
Run a hook immediately |
|
Set multiple indexed hooks at once |
SparseArray for Indexed Options (#516)¶
tmux uses sparse indexed arrays for options like command-alias[0],
command-alias[99], terminal-features[0]. Python lists can’t represent
gaps in indices, so libtmux introduces SparseArray:
>>> from libtmux._internal.sparse_array import SparseArray
>>> arr: SparseArray[str] = SparseArray()
>>> arr.add(0, "first")
>>> arr.add(99, "ninety-ninth") # Gap in indices preserved!
>>> arr[0]
'first'
>>> arr[99]
'ninety-ninth'
>>> list(arr.keys())
[0, 99]
>>> list(arr.iter_values()) # Values in index order
['first', 'ninety-ninth']
New Constants (#516)¶
OptionScopeenum:Server,Session,Window,PaneOPTION_SCOPE_FLAG_MAP: Maps scope to tmux flags (-s,-w,-p)HOOK_SCOPE_FLAG_MAP: Maps scope to hook flags
Breaking changes¶
Deprecated Window methods (#516)¶
The following methods are deprecated and will be removed in a future release:
Deprecated |
Replacement |
|---|---|
|
|
|
|
|
|
The old methods will emit a DeprecationWarning when called:
window.set_window_option('automatic-rename', 'on')
# DeprecationWarning: Window.set_window_option() is deprecated
# Use the new method instead:
window.set_option('automatic-rename', True)
tmux Version Compatibility¶
Feature |
Minimum tmux |
|---|---|
All options/hooks features |
3.2+ |
Window/Pane hook scopes ( |
3.2+ |
|
3.3+ |
|
3.5+ |
libtmux 0.49.0 (2025-11-29)¶
Breaking Changes¶
tmux 1.8 to 3.1c support removed (#608)¶
Support for tmux versions below 3.2a has been removed. This completes the deprecation announced in v0.48.0.
Minimum tmux version is now 3.2a (
TMUX_MIN_VERSION)Removed
TMUX_SOFT_MIN_VERSIONconstant and deprecation warning systemRemoved version guards throughout the codebase
For users on older tmux, use libtmux v0.48.x
libtmux 0.48.0 (2025-11-28)¶
Breaking Changes¶
Minimum tmux version bumped to 3.2+ (606)¶
tmux versions below 3.2a are now deprecated. libtmux 0.48.0 will be the last version to support tmux below 3.2. This is to ensure support for hooks, options, and newer tmux features.
A FutureWarning will be emitted on first use. Support for these versions will be removed in a future
release. Set LIBTMUX_SUPPRESS_VERSION_WARNING=1 to suppress the warning.
Internal¶
What’s new¶
tmux 3.6 support (#607)¶
Added tmux 3.6 to test grid and TMUX_MAX_VERSION 3.4 -> 3.6.
libtmux 0.47.0 (2025-11-01)¶
Breaking changes¶
Development¶
libtmux 0.46.2 (2025-05-26)¶
Development¶
Add
StrPathtype support forstart_directoryparameters (#596, #597, #598):Server.new_session: Accept PathLike objects for session start directorySession.new_window: Accept PathLike objects for window start directoryPane.splitandPane.split_window: Accept PathLike objects for pane start directoryWindow.splitandWindow.split_window: Accept PathLike objects for pane start directoryEnables
pathlib.Pathobjects alongside strings for all start directory parametersIncludes comprehensive tests for all parameter types (None, empty string, string paths, PathLike objects)
libtmux 0.46.1 (2025-03-16)¶
Maintenance only, no bug fixes or new features
A version branch has been created at v0.46.x, the next release of v0.47.0 may be a few months in waiting (watchers / snapshots are in development in #587).
Documentation¶
libtmux 0.46.0 (2025-02-25)¶
Breaking¶
Imports removed from libtmux.test (#580)¶
Root-level of imports from libtmux.test are no longer possible.
# Before 0.46.0
from libtmux.test import namer
# From 0.46.0 onward
from libtmux.test.named import namer
Same thing with constants:
# Before 0.46.0
from libtmux.test import (
RETRY_INTERVAL_SECONDS,
RETRY_TIMEOUT_SECONDS,
TEST_SESSION_PREFIX
)
# From 0.46.0 onward
from libtmux.test.constants import (
RETRY_INTERVAL_SECONDS,
RETRY_TIMEOUT_SECONDS,
TEST_SESSION_PREFIX
)
Development¶
Test helpers: Increased coverage (#580)¶
Several improvements to the test helper modules:
Enhanced
EnvironmentVarGuardinlibtmux.test.environmentto better handle variable cleanupAdded comprehensive test suites for test constants and environment utilities
Improved docstrings and examples in
libtmux.test.randomwith test coverage annotationsFixed potential issues with environment variable handling during tests
Added proper coverage markers to exclude type checking blocks from coverage reports
libtmux 0.45.0 (2025-02-23)¶
Breaking Changes¶
Test helpers: Refactor¶
Test helper functionality has been split into focused modules (#578):
libtmux.testmodule split into:libtmux.test.constants: Test-related constants (TEST_SESSION_PREFIX, etc.)libtmux.test.environment: Environment variable mockinglibtmux.test.random: Random string generation utilitieslibtmux.test.temporary: Temporary session/window management
Breaking: Import paths have changed. Update imports:
# Old (0.44.x and earlier)
from libtmux.test import (
TEST_SESSION_PREFIX,
get_test_session_name,
get_test_window_name,
namer,
temp_session,
temp_window,
EnvironmentVarGuard,
)
# New (0.45.0+)
from libtmux.test.constants import TEST_SESSION_PREFIX
from libtmux.test.environment import EnvironmentVarGuard
from libtmux.test.random import get_test_session_name, get_test_window_name, namer
from libtmux.test.temporary import temp_session, temp_window
Development¶
libtmux 0.44.2 (2025-02-17)¶
Bug fix¶
Development¶
Improved test organization and coverage in
test_common.py(#570):Consolidated version-related tests into parametrized fixtures using NamedTuples
Added comprehensive test cases for various version formats (master, next, OpenBSD, dev, rc)
Improved test readability with clear test IDs and logical grouping
Consistent use of pytest parametrize convention across test suite
libtmux 0.44.1 (2025-02-17)¶
Packaging¶
libtmux 0.44.0 (2025-02-16)¶
New Features¶
Context Managers support (#566)¶
Added context manager support for all major object types:
Server: Automatically kills the server when exiting the contextSession: Automatically kills the session when exiting the contextWindow: Automatically kills the window when exiting the contextPane: Automatically kills the pane when exiting the context
Example usage:
with Server() as server:
with server.new_session() as session:
with session.new_window() as window:
with window.split() as pane:
pane.send_keys('echo "Hello"')
# Do work with the pane
# Everything is cleaned up automatically when exiting contexts
This makes it easier to write clean, safe code that properly cleans up tmux resources.
libtmux 0.43.0 (2025-02-15)¶
New Features¶
Server Initialization Callbacks¶
Server now accepts 2 new optional params, socket_name_factory and on_init callbacks (#565):
socket_name_factory: Callable that generates unique socket names for new serverson_init: Callback that runs after server initializationUseful for creating multiple servers with unique names and tracking server instances
Socket name factory is tried after socket_name, maintaining backward compatibility
New test fixture: TestServer¶
Add TestServer pytest fixture for creating temporary tmux servers (#565):
Creates servers with unique socket names that clean up after themselves
Useful for testing interactions between multiple tmux servers
Includes comprehensive test coverage and documentation
Available in doctest namespace
Documentation¶
libtmux 0.42.1 (2024-02-15)¶
Bug fixes¶
Development¶
libtmux 0.42.0 (2025-02-02)¶
Bug fixes¶
libtmux 0.41.0 (2025-02-02)¶
Fixes¶
Documentation¶
Development¶
chore: Implement PEP 563 deferred annotation resolution (#555)¶
Add
from __future__ import annotationsto defer annotation resolution and reduce unnecessary runtime computations during type checking.Enable Ruff checks for PEP-compliant annotations:
For more details on PEP 563, see: https://peps.python.org/pep-0563/
libtmux 0.40.1 (2024-12-24)¶
Bug fix¶
libtmux 0.40.0 (2024-12-20)¶
Maintenance only, no bug fixes or new features
Breaking¶
_globalrenamed toglobal_
Development¶
libtmux 0.39.0 (2024-11-26)¶
Maintenance only, no bug fixes or new features
Breaking changes¶
libtmux 0.38.1 (2024-11-26)¶
Keep minimum Python version at 3.8 for now.
libtmux 0.38.0 (2024-11-26)¶
Breaking changes¶
Project and package management: poetry to uv (#547)¶
uv is the new package and project manager for the project, replacing Poetry.
Build system: poetry to hatchling (#547)¶
Build system moved from poetry to hatchling.
Development¶
Code quality: Use f-strings in more places (#540)
via ruff 0.4.2.
Documentation¶
Fix docstrings in
query_listforMultipleObjectsReturnedandObjectDoesNotExist.
libtmux 0.37.0 (04-21-2024)¶
Maintenance only, no bug fixes or new features
Testing¶
Documentation¶
Automatically linkify links that were previously only text.
Development¶
poetry: 1.8.1 -> 1.8.2
See also: https://github.com/python-poetry/poetry/blob/1.8.2/CHANGELOG.md
libtmux 0.36.0 (2024-03-24)¶
Maintenance only, no bug fixes or new features
Development¶
Aggressive automated lint fixes via
ruff(#539)via ruff v0.3.4, all automated lint fixes, including unsafe and previews were applied:
ruff check --select ALL . --fix --unsafe-fixes --preview --show-fixes; ruff format .
Branches were treated with:
git rebase \ --strategy-option=theirs \ --exec 'poetry run ruff check --select ALL . --fix --unsafe-fixes --preview --show-fixes; poetry run ruff format .; git add src tests; git commit --amend --no-edit' \ origin/master
libtmux 0.35.1 (2024-03-23)¶
Bug fix¶
Server.attached_sessionsfix for when multiple clients attached, thank you @patrislav1 (#537)#538 fix to
QueryList.
libtmux 0.35.0 (2024-03-17)¶
Breaking changes¶
libtmux 0.34.0 (2024-03-17)¶
Breaking changes¶
Command target change (#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:
libtmux 0.33.0 (2024-03-17)¶
Breaking changes¶
Improved new sessions (#532)¶
Session.new_window():Learned
direction, viaWindowDirection).
Added
Window.new_window()shorthand to create window based on that window’s position.
Improved window splitting (#532)¶
Window.split_window()toWindow.split()Deprecate
Window.split_window()
Pane.split_window()toPane.split()Deprecate
Pane.split_window()Learned
direction, viaPaneDirection).Deprecate
verticalandhorizontalin favor ofdirection.
Learned
zoom
Tweak: Pane position (#532)¶
It’s now possible to retrieve the position of a pane in a window via a
bool helper::
Development¶
poetry: 1.7.1 -> 1.8.1
See also: https://github.com/python-poetry/poetry/blob/1.8.1/CHANGELOG.md
libtmux 0.32.0 (2024-03-01)¶
Maintenance only, no bug fixes or new features
Packaging¶
Development¶
ruff 0.2.2 -> 0.3.0
libtmux 0.31.0 (2024-02-17)¶
Cleanups (#527)¶
Streamline
{Server,Session,Window,Pane}.cmd(), across all usages to:Use
cmd: stras first positionalRemoved unused keyword arguments
**kwargs
Renamings (#527)¶
Session.attached_windowrenamed toSession.active_window()Session.attached_windowdeprecated
Session.attached_panerenamed toSession.active_pane()Session.attached_panedeprecated
Window.attached_panerenamed toWindow.active_pane()Window.attached_panedeprecated
Improvements (#527)¶
Server.attached_windowsnow usesQueryList’s.filter()
Documentation (#527)¶
Document
.cmdin README and quickstartAdd doctests and improve docstrings to
cmd()methods across:
Post-release: v0.31.0post0 (2024-02-17)¶
Documentation updates
libtmux 0.30.2 (2024-02-16)¶
Development¶
Updated
TMUX_MAX_VERSIONfrom 3.3 to 3.4
libtmux 0.30.1 (2024-02-16)¶
Fixes¶
Adjusted pytest plugin and test module: Updated to use renamed methods from version 0.30.0.
libtmux 0.30.0 (2024-02-16)¶
Additions¶
Introduced
Pane.kill()method
Modifications¶
Window.select_window()renamed toWindow.select()Deprecated
Window.select_window()
Pane.select_pane()renamed toPane.select()Deprecated
Pane.pane_select()
Session.attach_session()renamed toSession.attach()Deprecated
Session.attach_session()
Server.kill_server()renamed toServer.kill()Deprecated
Server.kill_server()
Session.kill_session()renamed toSession.kill()Deprecated
Session.kill_session()
Window.kill_window()renamed toWindow.kill()Deprecated
Window.kill_window()
Enhancements¶
Server.new_session(): Support environment variablesWindow.split_window(): Supportsizevia-lSupports columns/rows (
size=10) and percentage (size='10%')
libtmux 0.29.0 (2024-02-16)¶
Fixes¶
Use
DeprecationWarningfor APIs set to be deprecated (#526)
Testing¶
pytest: Ignore
DeprecationWarningby default (#526)
libtmux 0.28.1 (2024-02-15)¶
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
libtmux 0.28.0 (2024-02-14)¶
Breaking changes¶
Detached / unselected by default (#523)¶
To ensure consistency and principle of least surprise, keep these set to
not use -a unless explicitly specified.
Breaking: Session.new_window() + Window.split_window() no longer attaches by default.
0.28.0 and greater: Defaults to
attach=False.0.27.1 and below: Defaults to
attach=True.
To keep the old behavior in 0.28.0 and beyond, pass attach=True explicitly.
Improved resizing (#523)¶
Breaking:
Pane.resize_pane()renamed toPane.resize()(#523)This convention will be more consistent with
Window.resize().Breaking:
Pane.resize()’s params changed (#523)No longer accepts
-U,-D,-L,-Rdirectly, instead acceptsResizeAdjustmentDirection).
-
Accept adjustments via
adjustment_directionw/ResizeAdjustmentDirection+adjustment.Learned to accept manual
heightand / orwidth(columns/rows or percentage)Zoom (and unzoom)
Window.resize(): Newly added
Tip: If Pane.resize() was not taking affect <= 0.27.1, try to resize with
Window.resize() first.
Fixes¶
Window.refresh()andPane.refresh(): Refresh more underlying state (#523)Obj._refresh(): Allow passing args (#523)e.g.
-a(all) tolist-panesandlist-windowsServer.panes: Fix listing of panes (#523)Would list only panes in attached session, rather than all in a server.
Improvement¶
Tests¶
libtmux 0.27.1 (2024-02-07)¶
Packaging¶
libtmux 0.27.0 (2024-02-07)¶
Improvement¶
libtmux 0.26.0 (2024-02-06)¶
Breaking changes¶
Documentation¶
Development¶
-
Add flake8-commas (COM)
Add flake8-builtins (A)
Add flake8-errmsg (EM)
CI¶
Move CodeQL from advanced configuration file to GitHub’s default
libtmux 0.25.0 (2023-11-25)¶
Improvement¶
Development¶
Documentation¶
libtmux 0.24.1 (2023-11-23)¶
Packaging¶
libtmux 0.24.0 (2023-11-19)¶
Maintenance only, no bug fixes or new features
Breaking changes¶
Packaging¶
Poetry: 1.5.1 -> 1.6.1 (#497), 1.6.1 -> 1.7.0 (direct to trunk)
See also: https://github.com/python-poetry/poetry/blob/1.7.0/CHANGELOG.md
Packaging (poetry): Fix development dependencies
Per Poetry’s docs on managing dependencies and
poetry check, we had it wrong: Instead of using extras, we should create these:[tool.poetry.group.group-name.dependencies] dev-dependency = "1.0.0"
Which we now do.
Development¶
Move formatting from
blacktoruff format(#506)This retains the same formatting style of
blackwhile eliminating a dev dependency by using our existing rust-basedrufflinter.CI: Update action packages to fix warnings
dorny/paths-filter: 2.7.0 -> 2.11.1
codecov/codecov-action: 2 -> 3
libtmux 0.23.2 (2023-09-09)¶
Maintenance only, no bug fixes or new features
Breaking changes¶
Cut last python 3.7 release (EOL was June 27th, 2023)
For security updates, a 0.23.x branch can be maintained for a limited time, if necessary.
libtmux 0.23.1 (2023-09-02)¶
Maintenance only, no bug fixes or new features
Development¶
Automated typo fixes from typos-cli:
typos --format brief --write-changesruff: Remove ERA /
eradicatepluginThis rule had too many false positives to trust. Other ruff rules have been beneficial.
libtmux 0.23.0 (2023-08-20)¶
Maintenance only, no bug fixes or new features
Development¶
Post-release: v0.23.0post0 (2023-08-20)¶
Fixes code comments cleaned up by
ruff, but missed in QA. In the future, even when using an automated tool, we will review more thoroughly.
Post-release: v0.23.0post1 (2023-08-26)¶
Fixes for more
ERA001issues.
Post-release: v0.23.0post2 (2023-08-28)¶
Yet more
ERA001fixes.
libtmux 0.22.2 (2023-08-20)¶
Development¶
libtmux 0.22.1 (2023-05-28)¶
Maintenance only, no bug fixes or new features
Development¶
Add back
blackfor formattingThis is still necessary to accompany
ruff, until it replaces black.
libtmux 0.22.0 (2023-05-27)¶
Maintenance only, no bug fixes or new features
Internal improvements¶
Move formatting, import sorting, and linting to ruff.
This rust-based checker has dramatically improved performance. Linting and formatting can be done almost instantly.
This change replaces black, isort, flake8 and flake8 plugins.
poetry: 1.4.0 -> 1.5.0
See also: https://github.com/python-poetry/poetry/releases/tag/1.5.0
libtmux 0.21.1 (2023-04-07)¶
Development¶
Update mypy to 1.2.0
Fixes¶
SkipDefaultFieldsReprMixin: Fix typing for mypy 1.2.0
libtmux 0.21.0 (2023-01-29)¶
Breaking internal change¶
libtmux 0.20.0 (2023-01-15)¶
What’s new¶
libtmux 0.19.1 (2022-01-07)¶
Fixes¶
libtmux 0.19.0 (2022-01-07)¶
New features¶
libtmux 0.18.3 (2023-01-07)¶
Improvement¶
libtmux 0.18.2 (2022-12-30)¶
Fixes¶
libtmux 0.18.1 (2022-12-28)¶
Fixes¶
Window.panes: Fix docstring
Remove unused code documentation
libtmux 0.18.0 (2022-12-27)¶
Breaking¶
Server: Add
__repr__and setsocket_pathif none set.Before (0.17 and below):
<libtmux.server.Server object at ...>
New
__repr__(0.18+):Server(socket_name=test)
Server(socket_path=/tmp/tmux-1000/default)
libtmux 0.17.2 (2022-12-27)¶
Server: Move
_list_panesand_update_panesto deprecated
libtmux 0.17.1 (2022-12-27)¶
Fixes¶
Documentation fixes
Add deprecation warning to
Server.children,Session.children,Window.children.
libtmux 0.17.0 (2022-12-26)¶
Breaking changes (#426)¶
Finding objects / relations
0.16 and below:
session._windows(),session.list_windows(), etc.0.17 and after:
session.windows0.16 and below:
session.find_where({'window_name': my_window})0.17 and after:
session.windows.get(window_name=my_window, default=None)If not found and not
default, raisesObjectDoesNotExistIf multiple objects found, raises
MultipleObjectsReturned
0.16 and below:
session.where({'window_name': my_window})0.17 and after:
session.windows.filter(window_name=my_window)
Accessing attributes
0.16 and below:
window['id']0.17 and after:
window.id0.16 and below:
window.get('id')0.17 and after:
window.id0.16 and below:
window.get('id', None)0.17 and after:
getattr(window, 'id', None)
New features¶
Detect if server active (#448)¶
Server.is_alive()Server.raise_if_dead()
Internal¶
Remove unused
sphinx-clickdevelopment dependency
libtmux 0.16.1 (2022-12-12)¶
Fixes¶
libtmux 0.16.0 (2022-12-10)¶
Breaking changes¶
Fix
distutilswarning, vendorizeLegacyVersion(#351)Removal of reliancy on
distutils.version.LooseVersion, which does not supporttmux(1)versions like3.1a.Fixes warning:
DeprecationWarning: distutils Version classes are deprecated. Use packaging.version instead.
The temporary workaround, before 0.16.0 (assuming setup.cfg):
[tool:pytest] filterwarnings = ignore:.* Use packaging.version.*:DeprecationWarning:: ignore:The frontend.Option(Parser)? class.*:DeprecationWarning::
Features¶
libtmux 0.15.10 (2022-11-05)¶
There will be more improvements over the coming weeks and months to shore up flakiness across shells and environments.
Tests¶
libtmux 0.15.9 (2022-10-30)¶
Bug fix¶
CI¶
Packaging¶
Development¶
libtmux 0.15.8 (2022-10-02)¶
Bug fix¶
libtmux 0.15.7 (2022-09-23)¶
libtmux 0.15.6 (2022-09-23)¶
Maintenance only, no bug fixes or new features
Packaging¶
Remove
MANIFEST.inThis is handled by poetry’s
includein pyproject.toml.
libtmux 0.15.5 (2022-09-23)¶
Maintenance only, no bug fixes or new features
Packaging¶
Remove
.tmuxp-before-script.shfrom.tmuxp.yaml
libtmux 0.15.4 (2022-09-21)¶
Fixes¶
Packaging¶
libtmux 0.15.3 (2022-09-20)¶
Tests / docs¶
Move conftest.py to root level (#440)
https://docs.pytest.org/en/stable/deprecations.html#pytest-plugins-in-non-top-level-conftest-files
Less conftest.py files
We can now run py.test for
README.mdwithout needing to proxy throughdocs/index.md
libtmux 0.15.2 (2022-09-17)¶
Maintenance release, no features or fixes
Tests¶
Packaging¶
pyproject.toml: Note pytest framework in trove classifiers
Infrastructure¶
libtmux 0.15.1 (2022-09-11)¶
Packaging¶
pyproject.toml: Drop old issues package, remove anther package from grouping
Documentation¶
Cleanup quickstart page
libtmux 0.15.0 (2022-09-10)¶
New features¶
Added a pytest plugin, #411.
Breaking changes¶
Remove
common.which()in favor ofshutil.which(), Credit: @rocksandska, via #407Fixes #402:
common.tmux_cmd()will only strip trailing empty lines. Before this change, all empty lines were filtered out. This will lead to a more accurate behavior when usingPane.capture_pane(). Credit: @rockandska, via #405.
Development¶
Tests¶
Test doctests in documentation via pytest-doctest-docutils (#410)
Documentation¶
Examples updated for correctness, #412 (cherry-picked from #410)
Render changelog in linkify_issues (#410)
Fix Table of contents rendering with sphinx autodoc with sphinx_toctree_autodoc_fix (#410)
libtmux 0.14.2 (2022-08-17)¶
Fixes¶
Server.new_session()really works withoutsession_name, #401 fixes #399. Improved tests and doctests added.
libtmux 0.14.1 (2022-08-17)¶
Fixes¶
Server.new_session()works withoutsession_name, #400 fixes #399This still passed
Noneto the session name, this was fixed in v0.14.2.
libtmux 0.14.0 (2022-08-05)¶
Breaking changes¶
Pane.send_keys():suppress_historydefault value changed fromTruetoFalse, #395
Tests and docs¶
libtmux 0.13.0 (2022-08-05)¶
What’s new¶
Improved typings
Now
mypy --strictcompliant (#383)
Breaking changes¶
Deprecated individual item lookups (#390)
Removed key lookups from
libtmux.common.EnvironmentMixin.show_environment()Only
EnvironmentMixin.show_environment()(without an argument) exists, and it still returns adict.Add key lookups via
libtmux.common.EnvironmentMixin.getenv()# Before server.show_environment('DISPLAY') # After server.getenv('DISPLAY') # Before session.show_environment('DISPLAY') # After session.getenv('DISPLAY')
Removed key lookups from
Session.show_options()session.show_options() # still returns dict, without an argument # Old session.show_options('DISPLAY') # Now session.show_option('DISPLAY')
Removed key lookups from
Window.show_window_options()window.show_window_options() # still returns dict, without an argument # Old window.show_window_options('DISPLAY') # Now window.show_window_option('DISPLAY')
Development¶
libtmux 0.12.0 (2022-07-13)¶
Compatibility¶
Development¶
Documentation¶
Testing¶
retry(): Add deprecation warning. This will be removed in 0.13.x (#368, #372)New function
retry_until(): Polls a callback function for a set period of time until it returnsTrueor times out. By default it will raiselibtmux.exc.WaitTimeout, withraises=Falseit will returnFalse. Thank you @categulario! (#368, #372)#384 Chore: Use absolute modules rather than root-level to avoid cyclic imports.
# Bad / Old from libtmux import Server # Good / New from libtmux.server import Server
Internals¶
#382 [mypy] support added:
Basic mypy tests now pass
libtmux 0.11.0 (2022-03-10)¶
Compatibility¶
Python 3.7 and 3.8 returns in 0.12.0
Note: This was not the final Python 3.7 and 3.8 release as originally stated. Python 3.7 and 3.8 support was extended in 0.12.0.
Internal: Use new separator to split
tmux(1)formatting information (#289, #343)The separator is configurable via
LIBTMUX_TMUX_FORMAT_SEPARATOR. If you ever have compatibility issues in the future let us know which default works best across versions.Credit: @JonathanRaiman and @jagguli
Development¶
Documentation¶
Sidebar reorganized into sections
Added documentation on fetching developmental releases of libtmux
libtmux 0.10.3 (2022-01-10)¶
Packaging¶
First experimental release using poetry build (#347). If you are packaging and run
across any difficulty please see #346.
Compatibility¶
Development¶
libtmux 0.10.2 (2021-10-30)¶
#324: Update poetry to 1.1
CI: Use poetry 1.1.7 and
install-poetry.pyinstallerRelock poetry.lock at 1.1 (w/ 1.1.7’s fix)
#339 (CI): Lock python at 3.9 to avoid poetry issue with
dataclasses#341 #342:
Server.attached_sessions()now supports multiple attached sessions.Remove attached sessions limitation to not detect multiple attached clients, thank you @timoses
libtmux 0.10.1 (2021-06-16)¶
libtmux 0.10.0 (2021-06-16)¶
libtmux 0.9.0 (2021-06-14)¶
Python 2.7 support dropped.
libtmux 0.8.5 (2020-10-25)¶
#297: Enchance subprocess interaction std[in|out|err]. Needed for interact with big buffer, fixes #251, thank you @gil-obradors!
#303 Add
common.get_libtmux_versionwhich gives the tmux version as a loose constraint. Fix linking to terms inside docs, and duplicate description of module which sphinx warned about in api.rst.#266 Fix issue on local tests where env variables would cause show-environment to pause tests indefinitely.
libtmux 0.8.4 (2020-10-25)¶
#234:
Window.split_window: Allow passingpercent, Thank you @jinankjain!#289: Fix warning due to invalid escape sequences, Thank you @tirkarthi!
#295: Publish docs via our own action
#295: Move more packaging over to poetry, though we’ll keep setup.py for the moment to ensure compatibility package maintainers.
#295: New development instructions
#295: Move doc/ to docs/
#296: CI: Test python 2.7, cache python packages, prevent running internal PRs twice
libtmux 0.8.3 (2020-08-16)¶
libtmux 0.8.2 (2019-06-02)¶
CHANGES updated to plain reStructuredText
Add
project_urlsto setup.py for pypi.Looser Pipfile versions, add Pipfile.lock
libtmux 0.8.1 (2019-01-26)¶
#117 Fix issue with renaming clients with tmux 2.7 on BSD/macOS machines.
#121 Support
literal=True(-l) inPane.send_keysfrom @ritiek#131 Fix for unicode commands in Python 2, thanks @myw
#172 Support for next-X.Y versions from @sloria
#120
capture_panesupport forPane#119
display_messagesupport forPaneSort imports with isort
Add sphinxcontrib-napoleon package for documentation
Move docstrings over to numpy’s style
libtmux 0.8.0 (2018-03-11)¶
#46 Change license from BSD to MIT
Move to new organization, tmux-python
Support package updates to pytest, sphinx, etc.
Travis/CI: Limit tests to Python 2.7 and 3.6 (removed 3.3 to 3.5)
Travis/CI: Update pypy veersions
#103
Server.new_sessionlearned how to run commands in window on session start, thanks @grimpy!#68 Make Server.has_session() use returncode, thanks @jlargentaye! This should make
has_sessionmore robust.
libtmux 0.7.8 (2018-03-04)¶
Port
retryfunction from tmuxp (https://github.com/tmux-python/tmuxp/issues/354)
libtmux 0.7.7 (2017-11-10)¶
Don’t add -x/-y in tmux >= 2.6 if running tmuxp from inside client.
libtmux 0.7.6 (2017-11-09)¶
Allow
Window.select_layoutwith no argsFix test where
bell-was no longer ambiguous as of tmux 2.6
libtmux 0.7.5 (2017-10-07)¶
Hotfix to support tmux 2.6 session creation
libtmux 0.7.4 (2017-08-19)¶
#65 Add session id to commands, thanks @askedrelic
libtmux 0.7.3 (2017-05-29)¶
Exact matches only supported on 2.1 and up
libtmux 0.7.2 (2017-05-29)¶
Support exact matching in
Server.has_session
libtmux 0.7.1 (2017-04-28)¶
#37 Improve support for formatted options like
pane-border-status. Thanks @kaushalmodi.
libtmux 0.7.0 (2017-04-27)¶
Support for python 2.6 dropped. New minimum version is 2.7
Add support for tmux 2.4, pypy and pypy3
Overhaul error handling when setting and showing options
Added
handle_option_errorfor handling option errorsAdded
libtmux.exc.OptionErrorbase exceptionAdded
libtmux.exc.InvalidOptionandlibtmux.exc.AmbiguousOptionlibtmux.exc.UnknownOptionnow extendslibtmux.exc.OptionError
Overhaul version checking
has_versionhas been renamed toget_versionget_versionwill return tmux built from git master as the latest version supported by the libtmux version with-masterat the end, e.g.2.4-masterget_versionwill return tmux on openbsd base system as the latest version supported by the libtmux version with-openbsdat the end, e.g.2.4-openbsdhas_required_tmux_versionhas been renamed tohas_minimum_versionadded
has_gt_version,has_gte_version,has_lt_version,has_lte_version,
Fixed up documentation in some session methods
Added pydoc exception info to option methods in window and sessions.
Added
TMUX_MIN_VERSIONandTMUX_MAX_VERSION
libtmux 0.6.5 (2017-04-02)¶
Fix
whichcommandAdd
TmuxCommandNotFoundexceptionAdd
tmux_search_pathsandappend_env_pathkwargs totmux_cmd.
libtmux 0.6.4 (2017-03-25)¶
#32 support for OpenBSD’s tmux
libtmux 0.6.3 (2017-02-08)¶
#25 support for working with tmux
master, thanks @sloria.
libtmux 0.6.2 (2017-01-19)¶
libtmux 0.6.1 (2016-12-20)¶
libtmux 0.6.0 (2016-09-16)¶
Raise exception for invalid session names. tmux does not allow names that are empty, contain periods or colons.
Remove unused
target_sessionparam inServer.attach_sessionandServer.switch_client.
libtmux 0.5.1 (2016-08-18)¶
#12 - fix logger message when tmux doesn’t exist in
PATH
libtmux 0.5 (2016-06-15)¶
libtmux 0.4.1 (2016-05-23)¶
update
which()to find tmux viaos.environ['PATH']. https://redd.it/4laeut
libtmux 0.4.0 (2016-05-23)¶
attributes for formatters are now accessible via
Session,WindowandPaneobjects.session.nameis equivalent tosession.get('session_name'), you can do the same with other properties in_info.window.name,pane.current_path,session.id,window.id,pane.id,session.index,window.index,pane.index, etc.attached_sessions,attached_windowandattached_paneare now properties._TMUXmetadata object changed to_info..findWhere()is nowfind_where.README and usage fixes
libtmux 0.3.0 (2016-05-23)¶
switch to pytest
libtmux 0.1.0 (2016-05-22)¶
libtmux forked from tmuxp.