| Index | index by Group | index by Distribution | index by Vendor | index by creation date | index by Name | Mirrors | Help | Search |
| Name: python313-libtmux | Distribution: openSUSE Tumbleweed |
| Version: 0.62.0 | Vendor: openSUSE |
| Release: 1.1 | Build date: Mon Jul 13 07:03:07 2026 |
| Group: Unspecified | Build host: reproducible |
| Size: 1374638 | Source RPM: python-libtmux-0.62.0-1.1.src.rpm |
| Packager: http://bugs.opensuse.org | |
| Url: https://github.com/tmux-python/libtmux/ | |
| Summary: Python API / wrapper for tmux | |
libtmux is a typed python scripting library for tmux. You can use it to command and control tmux servers, sessions, windows, and panes. It is the tool powering tmuxp, a tmux workspace manager.
MIT
* Mon Jul 13 2026 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.62.0:
* Highlights
libtmux 0.62.0 teaches libtmux objects to locate themselves and
to resolve shared windows the way tmux does. Code running
inside tmux can now find the object it's running in, a window
can name every session that holds it, and point lookups follow
tmux's own choice of session and index instead of an arbitrary
one. One breaking change lands too — query errors now belong to
the LibTmuxException hierarchy (see below).
* Find where you're running — from_env()
Most libtmux code starts from a handle you already hold. But
a script in a split, a tmux hook, a test harness, or an agent
is running inside a pane and holds nothing. tmux already
wrote the answer into the pane's environment, and each level
of the hierarchy now reads it back:
from libtmux import Pane
pane = Pane.from_env() # the pane this code is running in
window = pane.window # …and you're back on the hierarchy from there
session = window.session
Server.from_env(), Session.from_env(), and Window.from_env()
do the same for the rest of the tree. Each also accepts an
environment mapping in place of os.environ, so code that
locates itself stays testable outside a pane. Outside tmux —
or with an environment that doesn't parse — the family raises
libtmux.exc.NotInsideTmux rather than guessing.
The answer stays true as tmux moves things around: it
survives a move-window, and for a window linked into several
sessions it names the session tmux itself would act on. See
the Locating yourself guide for the whole story.
* Ask a window which sessions hold it — Window.linked_sessions
A window can be linked into more than one session at once.
Window.linked_sessions lists every Session from which a
window is reachable — a typical window returns one, a linked
or grouped window returns several, with each session
appearing once even when it holds the window at multiple
indexes. Use it when you need every holder; Window.session
still follows the single session_id recorded on that
instance.
* Linked windows resolve the way tmux does
Window.from_window_id(), Pane.from_pane_id(),
Window.refresh(), and Pane.refresh() used to pick one holding
session by accident — whichever sorted last by name — so
their answer could change when you renamed a session. They
now let tmux resolve the object, reporting the session tmux
itself would act on, and give Window.window_index the index
tmux would choose for a window linked twice. For the ordinary
single-session window, nothing changes; the lookups also got
cheaper. See winlinks.
https://libtmux.git-pull.com/topics/filtering/#winlinks
* Lookups that say what happened
QueryList.get() now names both the lookup and its outcome. A
missing pane_id="%99" raises ObjectDoesNotExist with No
objects found: pane_id='%99'; two matches for pane_id="%0"
raise MultipleObjectsReturned with Multiple objects returned
(2): pane_id='%0'.
* Breaking change: query errors join the LibTmuxException
hierarchy
libtmux.exc.ObjectDoesNotExist and
libtmux.exc.MultipleObjectsReturned now subclass
libtmux.exc.LibTmuxException. Because TmuxObjectDoesNotExist
inherits from ObjectDoesNotExist, it now falls under
LibTmuxException too.
If you catch both families, order the handlers from most
specific to most general so the broad clause no longer
intercepts lookup outcomes:
from libtmux import exc
try:
pane = server.panes.get(pane_id="%0")
except exc.ObjectDoesNotExist: # specific first
pane = None
except exc.LibTmuxException: # general last
pane = None
Blanket retry policies for LibTmuxException should now
exclude ObjectDoesNotExist and MultipleObjectsReturned — they
report deterministic missing or ambiguous lookups, not
transient tmux failures. See the migration notes for a retry
predicate example.
* What's Changed
- Correct AGENTS.md fixture guidance by @tony in #708
- fix(Pane,Window): Resolve point lookups through tmux by @tony
in #713
- feat(Server,Session,Window,Pane): Resolve the pane you run
inside (from_env) by @tony in #714
- Resolve winlinks: the right window index, and lookups that
say what happened by @tony in #718
* Mon Jul 06 2026 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.61.0:
libtmux 0.61.0 hardens support for the tmux 3.7 patch line. It
fixes Pane.break_pane() naming broken-out windows libtmux instead
of tmux's own default on tmux 3.7a/3.7b, and adds
get_version_str() for reading the raw tmux version with its
point-release suffix intact.
* Highlights
- Fix — break_pane() keeps tmux's default window name on
3.7a/3.7b (#699). Breaking a pane into a new window without
an explicit window_name left it named libtmux on tmux
3.7a/3.7b; it now keeps tmux's own default (typically the
running command). Passing window_name is unaffected.
- New — get_version_str() (#699).
libtmux.common.get_version_str() returns the running tmux
version verbatim, keeping the point-release suffix ("3.7a")
that get_version() strips for numeric comparison — useful for
telling patch releases apart, e.g. 3.7 from 3.7a.
- tmux 3.7a/3.7b test compatibility (#698). The test suite now
passes against tmux 3.7a and 3.7b, which CI also exercises.
* What's Changed
- docs: lead topic pages with the concept, add docs voice guide
by @tony in #696
- Fix window-name test for tmux 3.7a/3.7b and add them to CI by
@tony in #698
- Fix break_pane forcing 'libtmux' window name on tmux
3.7a/3.7b by @tony in #699
* Wed Jul 01 2026 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.60.0:
libtmux 0.60.0 completes tmux 3.7 feature parity. Building on the
3.7 compatibility shipped in 0.59.0, it adds first-class floating
panes via Pane.new_pane() and Window.new_pane(), types tmux 3.7's
new server, session, window, and pane options, exposes the new
pane format variables on Pane, and wraps tmux 3.7's new command
flags. Every 3.7-only surface is version-gated, so tmux 3.2a–3.6
keep working unchanged.
* What's new
- Floating panes (new-pane) (#694)
tmux 3.7's flagship feature is now reachable through
Window.new_pane() and Pane.new_pane(). A floating pane sits
above the tiled layout like a popup but behaves like a real
pane. Pass width/height to size it and x/y to position it,
alongside the usual shell, start_directory, environment,
zoom, and empty, plus style, active_border_style,
inactive_border_style, message, and keep (remain-on-exit).
The returned Pane reports pane_floating_flag == "1". Requires
tmux 3.7+; see the floating panes guide.
- Typed tmux 3.7 options (#694)
The option dataclasses now type tmux 3.7's new options. On
the server, get-clipboard; on the session,
focus-follows-mouse, message-format, and
prompt-command-cursor-style; and on the window, the copy-mode
line-number options, the tree-mode preview options, and the
window-pane status formats (of these,
tree-mode-preview-format is also pane-scoped). The pane
remain-on-exit option gained tmux 3.7's key value, and
pane-active-border-style / pane-border-style (widened to pane
scope in 3.7) now type on the pane too.
- tmux 3.7 pane format variables (#694)
Pane now exposes tmux 3.7's new pane format variables: the
floating-pane geometry and flags (pane_floating_flag, pane_x,
pane_y, pane_z, pane_flags, pane_zoomed_flag), the OSC 9;4
progress report (pane_pb_progress, pane_pb_state),
pane_pipe_pid, and the bracket_paste_flag and
synchronized_output_flag screen-mode flags. Each is
version-gated, so the format template stays clean on tmux
3.2a–3.6.
- tmux 3.7 command flags (#694)
New tmux 3.7 flags are exposed on existing wrappers:
Pane.capture_pane() gains hyperlinks (-H), line_numbers (-L),
and line_flags (-F); Window.split() / Pane.split() gain empty
(-E) plus style/active_border_style/inactive_border_style
(-s/-S/-R), message (-m), and keep (-k); Session.kill() gains
group (-g); and Pane.paste_buffer() gains no_vis (-S). On the
server, Server.command_prompt() gains no_freeze (-C),
Server.list_keys() gains format_ (-F), Server.run_shell()
accepts trailing args expanded as #{1}/#{2}, and
Server.refresh_client() gains request_clipboard (-l). Each
warns and is ignored on tmux < 3.7.
* Compatibility
Purely additive — no breaking changes. New 3.7 parameters are
gated on tmux's reported version; unsupported flags warn and
are ignored on older tmux, and floating-pane creation raises
there because new-pane does not exist before 3.7. tmux 3.2a–3.6
remain supported and tested.
* What's Changed
- Add tmux 3.7 feature parity: floating panes, options, formats
by @tony in #694
- update to 0.59.0:
* Restore compatibility with tmux 3.7 by @tony in #693
* Thu Jun 18 2026 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.58.1:
libtmux 0.58.1 restores compatibility with pytest 9.1. libtmux's
bundled pytest plugin no longer aborts at import time, so
projects that rely on libtmux's fixtures can move to the latest
pytest without their test suite failing before collection.
pytest 9.1 rejects marks applied to fixture functions during
plugin import — before collection begins. Because the plugin
ships as an installed entry point, this aborted the entire test
session for any downstream project that has libtmux installed
(for example, tmuxp). The fix removes a no-op skipif mark from
the zshrc fixture; the real zsh handling lives in conftest.py and
is unchanged, so behavior is identical for zsh and non-zsh users.
This is a bug-fix-only patch release, per libtmux's pre-1.0
version policy (patch = bug fixes; minor = features/breaking
changes).
See the CHANGES entry for full details.
- Fix pytest 9.1 fixture-mark import failure by @tony in #687
* Fri May 29 2026 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.58.0:
libtmux 0.58.0 fixes subprocess output decoding on non-UTF-8
locales. Both tmux_cmd and ControlMode now enforce UTF-8 when
reading tmux output, matching tmux's own encoding contract.
* Fixes
- Subprocess encoding on non-UTF-8 locales (#679)
tmux_cmd and ControlMode now pass encoding="utf-8" to
subprocess.Popen, ensuring tmux output is decoded correctly
regardless of the system locale. Previously, on non-UTF-8
locales, the FORMAT_SEPARATOR character (U+241E) was
corrupted during decoding, causing list accessors
(Server.sessions, etc.) to return empty results.
* Tue May 19 2026 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.57.1:
* libtmux 0.57.1 restores the lenient-by-default behavior for
Server.sessions and Server.clients. Both accessors return an
empty QueryList on tmux failure (socket permission errors,
subprocess crashes, missing daemon) again, matching the
contract Server.sessions has carried since 0.17.0.
Code written for 0.57.0 with try/except LibTmuxException around
these accessors keeps working — the except clause just becomes
unreachable. For an explicit connectivity signal, use
Server.is_alive() or Server.raise_if_dead().
Server.search_sessions, Server.search_windows, and
Server.search_panes continue to raise — they take a
caller-supplied filter where a tmux error carries meaningful
signal.
See the CHANGES entry for full details.
- Server(fix[sessions,clients]): Return empty on tmux errors by
@tony in #677
* Mon May 18 2026 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.57.0:
libtmux 0.57.0 broadens tmux support around attached clients,
tmux-native filtering, and format-token fields. Client gives
callers a typed object for attached terminals, search_*() methods
let tmux return only matching sessions, windows, and panes, and
more tmux format tokens are exposed as typed attributes.
LibTmuxException now records which tmux subcommand failed, making
command errors easier to handle downstream.
Full release notes: https://libtmux.git-pull.com/history.html#libtmux-0-57-0-2026-05-17
* Breaking changes
- LibTmuxException string form gains a subcommand prefix
When LibTmuxException is raised from a libtmux method,
str(exc) now begins with the originating tmux subcommand name
followed by ": ". An error from Session.last_window() used to
render as "can't find window" and now renders as
"last-window: can't find window".
exc.args[0] still carries the original tmux error text, and
the new LibTmuxException.subcommand attribute exposes the
tmux subcommand name as a separate field.
The error-payload type also changed: exc.args[0] is now str,
joined with "\n" when tmux emitted multiple stderr lines.
Previously it was list[str]. Code that pattern-matches on
str(exc) exactly, anchors a regex with ^ against the old
shape, or indexes exc.args[0] element-by-element will no
longer match. Substring matches ("can't find" in str(exc))
and unanchored re.search patterns continue to work unchanged.
See the migration guide for the upgrade pattern.
https://libtmux.git-pull.com/migration.html#libtmux-0-57-0-subcommand-tagged-exceptions-672
- Server.sessions, Server.clients, Server.search_sessions raise
on tmux errors
Previously, a tmux command failure under these accessors
could return an empty QueryList indistinguishable from "no
sessions / no clients attached" or "filter matched nothing".
They now let LibTmuxException propagate for real tmux
failures.
Genuine empty results — a server with no attached clients, or
a filter that matched zero sessions — still return an empty
QueryList. A missing or not-yet-started tmux server is also
still treated as an empty result, preserving the historic
contract that a fresh Server can be safely introspected
before its daemon is up. Other tmux errors, such as socket
permission failures or unsupported flags, now surface.
* What's new
- Client object and Server.clients accessor. New typed
dataclass for tmux's attached-client model. client_name is
the stable identifier; attached_session / attached_window /
attached_pane re-read list-clients before resolving.
attached_pane follows the attached session's current window —
that can differ from the per-client active pane set by
select-pane -P.
- Server.display_message and Window.display_message. Server
reads like #{version} and #{socket_path} work without a pane
handle; window reads (#{window_zoomed_flag},
[#]{window_active_clients_list}) auto-bind to the window's id.
All three display_message wrappers (including the existing
Pane.display_message) surface tmux stderr via warnings.warn
rather than dropping it silently.
- tmux-native filtering with search_*(). Server.search_panes /
search_windows / search_sessions plus the Session and Window
analogues take a filter= kwarg routed to tmux's -f flag. tmux
evaluates the expression and returns only matching objects.
Caveat: tmux silently expands a malformed expression to
empty, which it treats as false — a typo looks identical to
"no matches".
- Pane.send_keys(cmd=None, …) flag-only invocation. Pass
cmd=None together with reset=True or repeat=N to invoke
tmux's flag-only send-keys -R / send-keys -N <n> form without
any trailing key argument.
- Server.list_buffers(format_string=, filter=). Project a
chosen -F template or push a buffer-name match expression
through tmux's format engine — same bad-filter caveat as the
search_* methods.
- Server.run_shell(cwd=, show_stderr=). New kwargs map to
tmux's -c (3.4+) and -E (3.6+) flags. Older tmux warns and
ignores the kwarg instead of erroring.
- Pane.capture_pane(pending=True). Return bytes tmux has read
from the pane but not yet committed to the terminal — useful
for diagnosing programs whose output stalls mid-sequence.
- More format-token fields on tmux objects. Pane / Window /
Session / Client expose more typed attributes for pane state
(pane_dead, pane_in_mode, pane_marked, pane_synchronized,
pane_path, pane_pipe), window state (window_zoomed_flag,
window_silence_flag, window_flags), session state
(session_marked), and client state (client_session,
client_readonly, client_termtype). Tokens the running tmux
does not support stay None instead of making the listing
fail.
* Fixes
- Pane.reset() now clears pane scrollback. In 0.56.0 the
history clear silently no-op'd, leaving the scrollback intact
(#650).
* Documentation
- New API page: libtmux.client.
- New Format-Token Fields topic explains why some fields
describe an active child object — for example,
session.pane_id reflects the active pane in the session's
current window.
* Sun May 10 2026 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.56.0:
The tmux command parity release. ~50 new public methods land
across Server, Pane, Window, and Session, plus expanded flag
coverage on existing wrappers, plus a control_mode test fixture
that lets commands requiring an attached client run under CI
without a TTY. Net result: callers no longer need to drop down to
Server.cmd(...) for the commands tmux ships out of the box.
No breaking changes — public API is purely additive.
* Highlights
- Interactive tmux commands now scriptable
New wrappers for commands that require an attached client:
Pane.display_popup, Pane.display_panes
Pane.choose_buffer, Pane.choose_client, Pane.choose_tree
Server.display_menu, Server.command_prompt,
Server.confirm_before Session.detach_client,
Server.detach_client, Server.detach_all_clients
The three detach-client wrappers each map to one tmux flag
group exactly, with a single subprocess call
(Details see
https://github.com/tmux-python/libtmux/releases/tag/v0.56.0)
- tmux buffer I/O suite
Round-trip pane content through named tmux buffers — useful
for clipboard interop and inter-process data hand-off:
Server.set_buffer, Server.show_buffer, Server.delete_buffer
Server.save_buffer, Server.load_buffer, Server.list_buffers
Pane.paste_buffer
- Key bindings, shell execution, and client management
Server:
bind_key, unbind_key, list_keys, list_commands,
run_shell, if_shell, source_file, list_clients,
start_server, lock_server, lock_client, refresh_client,
suspend_client, server_access, show_messages,
show_prompt_history, clear_prompt_history
Session: lock_session
Pane: send_prefix
- Window and pane manipulation parity
Window:
swap, link, unlink, respawn, last_pane, next_layout,
previous_layout, rotate
Pane:
swap, join, break_pane, move, pipe, clear_history,
respawn, copy_mode, clock_mode, customize_mode,
find_window
Server: wait_for
Session: last_window, next_window, previous_window
- Filled-in flag coverage on existing methods
Most pre-existing wrappers now expose the remaining tmux
flags:
- Pane.send_keys — literal, hex_keys, key_name,
expand_formats, target_client, repeat, reset, copy_mode_cmd
- Pane.split — percentage=
- Pane.capture_pane — alternate_screen, quiet, mode_screen,
to_buffer (writes capture into a tmux buffer instead of
returning it)
- Pane.display_message — format_string, verbose, delay,
notify, update_pane, target_client
- Pane.display_popup — target_client=, -c
- Window.move_window — after, before, kill, renumber
- Window.select_layout — spread, next, previous
- Server.new_session — detach_others, no_size, config
- Session.new_window — kill_existing, select_existing
- EnvironmentMixin.set_environment — expand_format, hidden
- OptionsMixin.show_options — quiet
- control_mode pytest fixture
A new fixture spawns a real tmux -C attach-session subprocess
that registers as a real client, satisfying commands like
Pane.display_popup, Session.detach_client,
Server.command_prompt, and Server.confirm_before — no TTY
required. Exposed via libtmux.pytest_plugin and into the
doctest namespace via conftest.py.
(Code example see
https://github.com/tmux-python/libtmux/releases/tag/v0.56.0)
* Bug fixes
- Window.move_window() returns up-to-date state after the move.
Previously left the Window object pointing at its pre-move
index, so attribute reads could appear stale until a manual
refresh() call. The moved window now refreshes automatically.
- Pane.swap makes target optional when move_up/move_down is
set, since tmux's swap-pane -U/-D already imply the target.
- OptionsMixin.show_options wires quiet= through the public
API, fixing a flag that was previously inert.
- Window.last_pane calls tmux last-pane directly instead of
select-pane -l, exposing its native flags (disable_input=-d,
enable_input=-e, keep_zoom=-Z) with correct mappings per
cmd-select-pane.c.
* Compatibility
- TMUX_MAX_VERSION bumped 3.6 → 3.7, unlocking method coverage
already version-gated for tmux 3.7 — notably
Server.command_prompt(bspace_exit=...) and
Server.show_messages(terminals=..., jobs=...). No effect on
installations running tmux 3.6 or earlier.
- Every version-gated flag uses has_gte_version(...) with a
warnings.warn(stacklevel=2) fallback when the running tmux is
too old, matching the existing trim_trailing pattern.
- All new methods and parameters are annotated with ..
versionadded:: 0.56 so downstream readers can see
availability at a glance.
* Documentation
- Bumped gp-sphinx docs stack to v0.0.1a16 — docs site now
renders via gp-furo-theme, a Tailwind v4 respin of Furo, with
sphinx-vite-builder handling theme-asset builds (#666).
* Tests
- test_no_server_* and test_raise_if_dead_no_server_raises now
reuse the server fixture for a unique socket name and
finalizer cleanup, instead of hardcoded socket names with no
finalizer that broke whenever a stale tmux daemon survived at
the same path (#665, fixes #664).
* What's Changed
- test_server(fix[isolation]): use server fixture for "no
server" tests by @tony in #665
- Bump gp-sphinx → 0.0.1a16 (sphinx-vite-builder consolidation)
by @tony in #666
- tmux parity: add interactive command coverage and align flag
semantics with tmux by @tony in #653
* Wed Apr 22 2026 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.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.
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-graceful exit, so /tmp/tmux-<uid>/ would
accumulate stale libtmux_test* entries across runs — 10k+
observed on long-lived dev machines.
A new internal '_reap_test_server' helper centralizes the kill
+ unlink flow and suppresses cleanup-time errors, so a
finalizer failure can no longer mask the real test failure.
If you use libtmux's pytest plugin in CI or locally, upgrade to
stop the leak.
* New: Sphinx extension for pytest fixture documentation (#656)
A new Sphinx extension (docs/_ext/sphinx_pytest_fixtures.py)
renders pytest fixtures as first-class API documentation with
scope/kind/factory badges, cross-referenced dependencies, and
auto-generated usage snippets.
- .. autofixture:: — autodoc-style documenter for individual
fixtures
- .. autofixtures:: — bulk discovery and rendering from a
module
- .. autofixture-index:: — auto-generated index table with
linked return types (via intersphinx) and parsed RST
descriptions
- :fixture: cross-reference role with short-name resolution
- Scope, kind, and autouse badges with touch-accessible
tooltips
- Responsive layout (mobile metadata stacking, badge font
scaling, scroll wrappers)
- WCAG AA contrast compliance in both light and dark mode
- 109 tests (unit + integration)
Also fixes an inaccurate session_params fixture docstring
surfaced by the new extension.
* Documentation
- Docs restructured to the Library Skeleton pattern (#652)
- Self-hosted fonts, eliminated layout shift, added SPA-style
navigation (#643)
- Standardized shell code-block formatting across all docs
(#644)
- Migrated the docs stack to gp-sphinx workspace packages
(#657)
- Visual improvements to API docs via gp-sphinx (#658)
- Bumped gp-sphinx to v0.0.1a8 (#659); subsequent bump to
v0.0.1a9 on master
* Development
- Added types-docutils to dev dependencies for mypy type
checking (#656)
* What's Changed
- docs: self-host fonts, eliminate layout shift, add SPA
navigation by @tony in #643
- docs(style[shell]): Standardize shell code blocks by @tony in
[#644]
- docs(redesign): restructure documentation to Library Skeleton
pattern by @tony in #652
- feat(_ext[sphinx_pytest_fixtures]): Sphinx extension for
pytest fixture documentation by @tony in #656
- docs: Migrate to gp-sphinx workspace packages by @tony in
[#657]
- docs(feat[api-style]): Visual improvements to API docs via
gp-sphinx by @tony in #658
- chore(docs): adopt gp-sphinx v0.0.1a8 by @tony in #659
- fix(pytest_plugin): unlink socket file on fixture teardown by
@tony in #661
* Mon Mar 09 2026 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.55.0:
* 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:
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
incorrect "removed in 3.1+" comment).
* Configurable tmux binary path
- Server now accepts a tmux_bin parameter to use an alternative
binary (e.g. wemux, byobu, or a custom build):
server = Server(socket_name="myserver", tmux_bin="/usr/local/bin/tmux-next")
The path is threaded through Server.cmd(),
Server.raise_if_dead(), fetch_objs(), all version-check
functions (has_version, has_gte_version, etc.), and hook
scope guards in HooksMixin. Child objects (Session, Window,
Pane) inherit it automatically. Falls back to
shutil.which("tmux") when not set.
* Pre-execution command logging
- tmux_cmd now emits a structured DEBUG log record with
extra={"tmux_cmd": ...} before invoking the subprocess, using
shlex.join for POSIX-correct quoting. This complements the
existing post-execution stdout log and is a prerequisite for
a future dry-run mode.
* Bug fix: TmuxCommandNotFound raised for invalid tmux_bin path
- Passing a non-existent binary path previously surfaced as a
raw FileNotFoundError from subprocess. Both tmux_cmd and
raise_if_dead now catch FileNotFoundError and raise
TmuxCommandNotFound consistently.
- update to 0.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
* Structured lifecycle logging (#637)
- All lifecycle operations (create, kill, rename, split) now
emit INFO-level log records with structured extra context.
Every log call includes scalar keys for filtering in log
aggregators and test assertions via caplog.records:
Key Type Context
tmux_subcommand str tmux subcommand (e.g. new-session)
tmux_target str tmux target specifier
tmux_session str session name
tmux_window str window name or index
tmux_pane str pane identifier
* Logging hygiene improvements:
- NullHandler added to library __init__.py per Python logging
best practices
- DEBUG-level structured logs for tmux_cmd execution with
isEnabledFor guards and heavy keys (tmux_stdout, tmux_stderr,
tmux_stdout_len, tmux_stderr_len)
- Lazy formatting: replaced f-string log formatting with %s
throughout
- Diagnostics: replaced traceback.print_stack() with
logger.debug(exc_info=True)
- Options warnings: replaced logger.exception() with
logger.warning() and tmux_option_key structured context for
recoverable parse failures
- Cleanup: removed unused logger definitions from modules that
don't log
* Bug fixes
- Window.rename_window() now raises on failure (#637)
Previously rename_window() caught all exceptions and logged
them, masking tmux errors. It now propagates the error,
consistent with all other command methods.
- Server.kill() captures stderr (#637)
Server.kill() previously discarded the tmux return value. It
now checks stderr, raises on unexpected errors, and silently
returns for expected conditions ("no server running", "error
connecting to").
- Server.new_session() checks kill-session stderr (#637)
When kill_session=True and the existing session kill fails,
new_session() now raises LibTmuxException with the stderr
instead of proceeding silently.
- Session.kill_window() target formatting fix (#637)
Fixed self.window_name (wrong attribute) to self.session_name
when formatting tmux targets for integer target_window
values. Also widened the type signature from str | None to
str | int | None to match the existing
isinstance(target_window, int) branch.
* Thu Feb 19 2026 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.53.1:
* Bug fixes
- Fix race condition in new_session() by avoiding list-sessions
query by @neubig in #625
* Development
- build: Migrate from Makefile to justfile by @tony in #617
* Mon Dec 15 2025 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.53.0:
* 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 session killed during
attachment (#616)
Fixed an issue where Session.attach() would raise
TmuxObjectDoesNotExist when a user:
- Attaches to a tmux session via tmuxp load
- Works in the session
- Kills the session (e.g., closes all windows) before
detaching
- Detaches from tmux
User Experience (Before Fix)
After running tmuxp load, users would see this traceback
printed to their terminal after detaching:
Traceback (most recent call last):
File "~/.local/bin/tmuxp", line 7, in <module>
sys.exit(cli.cli())
...
File ".../libtmux/session.py", line 332, in attach
self.refresh()
File ".../libtmux/neo.py", line 167, in _refresh
obj = fetch_obj(...)
File ".../libtmux/neo.py", line 242, in fetch_obj
raise exc.TmuxObjectDoesNotExist(...)
libtmux.exc.TmuxObjectDoesNotExist: Could not find object
Root Cause
Session.attach() called self.refresh() after the
attach-session command returned. Since attach-session is a
blocking interactive command, the session state can change
arbitrarily during attachment—including being killed
entirely.
Technical Details
The refresh() call was semantically incorrect for interactive
commands:
- attach-session blocks until user detaches
- Session state can change during attachment (user may kill
session, rename it, etc.)
- Refreshing the object after such a command makes no
sense—the state could be anything
The fix: Remove the self.refresh() call from Session.attach()
(2 lines removed).
* Breaking Changes
- Session.attach() no longer calls refresh() (#616)
Session.attach() previously called Session.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.
Migration
[#] If you relied on the implicit refresh (unlikely):
session.attach()
session.refresh() # Now explicit if you need it
Timeline
Date Event
Feb 2024 Session.attach() added with refresh() call (9a5147a)
Nov 2025 tmuxp switched from attach_session() to attach() (fdafdd2b)
Dec 2025 Users started experiencing the bug
Dec 2025 v0.53.0 released with fix
* What's Changed
- fix(Session.attach()): Remove refresh() call that fails after
session killed by @tony in #616
* Tue Dec 09 2025 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.52.1:
* Development
- ci(release): Migrate to PyPI Trusted Publisher by @tony in #615
- update to 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 -N Preserve trailing spaces at line ends
trim_trailing -T Trim trailing empty positions (tmux 3.4+)
Examples
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).
* What's Changed
- Capture pane updates by @tony in #614
- update to 0.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 for full context and examples.
- Deprecate legacy APIs (raise DeprecatedError) by @tony in
[#611]
Method Renamings
Deprecated Replacement Class Deprecated Since
kill_server() kill() Server 0.30.0
attach_session() attach() Session 0.30.0
kill_session() kill() Session 0.30.0
select_window() select() Window 0.30.0
kill_window() kill() Window 0.30.0
split_window() split() Window 0.33.0
select_pane() select() Pane 0.30.0
resize_pane() resize() Pane 0.28.0
split_window() split() Pane 0.33.0
Property Renamings
Deprecated Replacement Class Deprecated Since
attached_window active_window Session 0.31.0
attached_pane active_pane Session 0.31.0
attached_pane active_pane Window 0.31.0
Query/Filter API Changes
Deprecated Replacement Class Deprecated Since
list_sessions() / '_list_sessions(') sessions property Server 0.17.0
list_windows() / '_list_windows()' windows property Session 0.17.0
list_panes() / '_list_panes()' panes property Window 0.17.0
where({...}) .filter(**kwargs) on sessions/windows/panes All 0.17.0
find_where({...}) .get(default=None, **kwargs) on sessions/windows/panes All 0.17.0
get_by_id(id) .get(session_id/window_id/pane_id=..., default=None) All 0.16.0
children property sessions/windows/panes All 0.17.0
Attribute Access Changes
Deprecated Replacement Deprecated Since
obj['key'] obj.key 0.17.0
obj.get('key') obj.key 0.17.0
obj.get('key', None) getattr(obj, 'key', None) 0.17.0
Still Soft Deprecations (DeprecationWarning)
The following deprecations from v0.50.0 continue to emit DeprecationWarning only:
Deprecated Replacement Class
set_window_option() set_option() Window
show_window_option() show_option() Window
show_window_options() show_options() Window
g parameter global_ parameter Options & hooks methods
Migration Example
Before (deprecated, now raises DeprecatedError):
[#] Old method names
server.kill_server()
session.attach_session()
window.split_window()
pane.resize_pane()
[#] Old query API
server.list_sessions()
session.find_where({'window_name': 'main'})
[#] Old dict-style access
window['window_name']
After:
[#] New method names
server.kill()
session.attach()
window.split()
pane.resize()
[#] New query API
server.sessions
session.windows.get(window_name='main', default=None)
[#] New attribute access
window.window_name
- update to 0.50.1:
* Documentation
- Doc fixes by @tony in #612
* Fri Dec 05 2025 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.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 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
* Unified Options API
All tmux objects now share a consistent options interface:
import libtmux
server = libtmux.Server()
session = server.sessions[0]
window = session.windows[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')
* Hook Management
Programmatic control over tmux hooks:
session = server.sessions[0]
[#] Set a hook
session.set_hook('session-renamed', 'display-message "Renamed!"')
[#] Get hook value (returns SparseArray for indexed hooks)
session.show_hook('session-renamed')
[#] {0: 'display-message "Renamed!"'}
[#] Get all hooks
session.show_hooks()
[#] Remove a hook
session.unset_hook('session-renamed')
[#] Bulk operations for indexed hooks
session.set_hooks('session-renamed', {
0: 'display-message "Hook 0"',
1: 'display-message "Hook 1"',
5: 'run-shell "echo hook 5"',
})
* Breaking Changes
- Deprecated Window methods
The following methods are deprecated and will be removed in a
future release:
Deprecated Replacement
Window.set_window_option() Window.set_option()
Window.show_window_option() Window.show_option()
Window.show_window_options() Window.show_options()
* Deprecated g parameter
The g parameter for global options is deprecated in favor of
global_:
[#] Before (deprecated)
session.show_option('status', g=True)
[#] After (0.50.0+)
session.show_option('status', global_=True)
* New Constants
- OptionScope enum: Server, Session, Window, Pane
- OPTION_SCOPE_FLAG_MAP: Maps scope to tmux flags (-s, -w, -p)
- HOOK_SCOPE_FLAG_MAP: Maps scope to hook flags
* Documentation
- New topic guide: Options and Hooks
- New topic guides: Automation patterns, Workspace setup, Pane
interaction, QueryList filtering
- Refreshed README with hero section, quickstart, and more
examples
* tmux Version Compatibility
Feature Minimum tmux
All options/hooks features 3.2+
Window/Pane hook scopes (-w, -p) 3.2+
client-active, window-resized hooks 3.3+
pane-title-changed hook 3.5+
* What's Changed
- Improved option management, add hook management by @tony in
[#516]
- Refresh README by @tony in #609
- update to 0.49.0:
* Breaking: tmux <3.2 fully dropped
- Drop support for tmux versions < 3.2 by @tony in #608
- update to 0.48.0:
* Breaking: tmux <3.2 deprecated
- Deprecate old tmux versions by @tony in #606
* Development
- tmux: Add tmux 3.6 to testgrid by @tony in #607
* Sun Nov 02 2025 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.47.0:
* Breaking changes
- Support Python 3.14 by @tony in #601
- Drop Python 3.9 by @tony in #602
* Thu May 29 2025 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.46.2:
* Fix new_window argument typing in Session by @Data5tream in #596
- types: Add StrPath typing, fix new_session by @tony in #597
- types: Add StrPath typing, fix new_session, part 2 by @tony
in #598
* Sun Mar 16 2025 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.46.1:
* Documentation
- Fix typo in Pane.send_keys (#593)
* Wed Feb 26 2025 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.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)
[#] Before:
from libtmux.test import namer
[#] After:
from libtmux.test.named import namer
[#] Before:
from libtmux.test import RETRY_INTERVAL_SECONDS
[#] After:
from libtmux.test.constants import RETRY_INTERVAL_SECONDS
* Internal Improvements
- Enhanced Test Utilities: The EnvironmentVarGuard now handles
variable cleanup more reliably
- Comprehensive Test Coverage: Added test suites for constants
and environment utilities
- Code Quality: Added proper coverage markers to exclude type
checking blocks from coverage reports
- Documentation: Improved docstrings and examples in the random
module
These changes improve maintainability of test helpers both
internally and for downstream packages that depend on libtmux.
* What's Changed
Coverage: Test helpers by @tony in #580
* Mon Feb 24 2025 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.45.0:
* Breaking Changes
- Test helpers: Refactor by @tony in #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 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
* Misc
- Cursor rules: Add Cursor Rules for Development and Git Commit
Standards by @tony in #575
* CI
- tests(ci) Check runtime deps import correctly by @tony in
[#574]
* Tue Feb 18 2025 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.44.2:
* Bug fixes
- fix(typings) Move typing-extensions into TypeGuard by @tony
in #572
* Documentation
- Doc / typos fixes by @tony in #569
* Development
- Tests: Improved parametrization by @tony in #570
* Mon Feb 17 2025 Johannes Kastl <opensuse_buildservice@ojkastl.de>
-update to 0.44.1:
* types: Only use typing-extensions if necessary by @ppentchev in
[#563]
* Mon Feb 17 2025 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.44.0:
* Support for context managers by @tony in #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
This makes it easier to write clean, safe code that properly
cleans up tmux resources.
* Sun Feb 16 2025 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.43.0:
* New feature
- TestServer: Server, but partial'd to run on a test socket by
@tony in #565
* Documentation
- Fix "Topics" links in docs
- docs(traversal) Add more doctests by @tony in #567
- update to 0.42.1:
* Packaging: typing-extensions usage
- Move a typing-extensions import into a t.TYPE_CHECKING
section by @ppentchev in #562
- py(deps[testing,lint]) Add typing-extensions for older python
versions by @tony in #564
* Sat Feb 08 2025 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.42.0:
* Improvements
- tmux_cmd: Modernize to use text=True by @tony in #560
Attempted fix for #558.
* Sat Feb 08 2025 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.41.0:
* Fixes
- Fix hardcoded uid in __str__ method of Server class by
@lazysegtree in #557
* Development
- Use future annotations by @tony in #555
* Documentation
- Fix docstring for color parameter by @TravisDart in #544
* Fri Dec 27 2024 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.40.1:
* Bug fixes
- Fix passing both window command and environment by
@ppentchev in #553
* Sat Dec 21 2024 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.40.0:
* Python 3.9 Modernization by @tony in #550
* test(legacy[session]) Stabilize assertion by @tony in #552
* Wed Nov 27 2024 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.39.0:
* Drop Python 3.8 by @tony in #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
* Wed Nov 27 2024 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.38.1:
* Minimum Python back to 3.8 for now.
* Wed Nov 27 2024 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.38.0:
* 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.
* Documentation
- [docs] Sphinx v8 compatibility: configure a non-empty
inventory name for Python Intersphinx mapping. by @jayaddison
in #542
- Fix docstrings in query_list for MultipleObjectsReturned and
ObjectDoesNotExist.
* Other
- Bump dev dependencies, including ruff 0.4.2, f-string tweaks
by @tony in #540
* Tue Apr 23 2024 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.37.0:
Tests
* pytest-xdist support in #522
* test stability improvements in #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.
* Sun Mar 24 2024 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.36.0:
* Linting: Aggressive ruff pass (ruff v0.3.4) by @tony in #539
* Sun Mar 24 2024 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.35.1:
* fix: server.attached_sessions by @patrislav1 in #537
* chore(Server.attached_sessions): Use .filter() by @tony in #538
* Tue Mar 19 2024 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.35.0:
Breaking changes
* refactor: Eliminate redundant targets / window_index's across
codebase by @tony in #536
* Sun Mar 17 2024 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.34.0:
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:
- Server.cmd()
- Session.cmd()
- Window.cmd()
- Pane.cmd()
* Sun Mar 17 2024 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.33.0:
Breaking changes!
* Improved new sessions (#532)
- Session.new_window():
- Learned direction, via WindowDirection).
- PEP 3102 keyword-only arguments after window name (#534).
- Added {meth}Window.new_window() shorthand to create window
based on that window's position.
* Improved window splitting (#532)
- Window.split_window() to Window.split()
- Deprecate Window.split_window()
- Pane.split_window() to Pane.split()
- Deprecate Pane.split_window()
- Learned direction, via PaneDirection).
- Deprecate vertical and horizontal in favor of direction.
- Learned zoom
* Tweak: Pane position (#532)
It's now possible to retrieve the position of a pane in a
window via a bool helper::
- Pane.at_left
- Pane.at_right
- Pane.at_bottom
- Pane.at_right
* Sat Mar 16 2024 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.32.0:
* Fix docstring ordering in pane.split_window by @Ngalstyan4
in #528
* Add implicit exports into init.py by @ssbarnea in #531
* Sun Feb 18 2024 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.31.0:
* Cleanups (#527)
- Streamline {Server,Session,Window,Pane}.cmd(), across all
usages to:
- Use cmd: str as first positional
- Removed unused keyword arguments **kwargs
* Renamings (#527)
- Session.attached_window renamed to Session.active_window()
- Session.attached_window deprecated
- Session.attached_pane renamed to Session.active_pane()
- Session.attached_pane deprecated
- Window.attached_pane renamed to Window.active_pane()
- Window.attached_pane deprecated
* Improvements (#527)
- Server.attached_windows now users QueryList’s .filter()
* Sun Feb 18 2024 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.30.2:
* Bump `TMUX_MAX_VERSION` 3.3 -> 3.4
* Sun Feb 18 2024 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.30.1:
* pytest plugin, test module: Update to renamed methods
introduced in v0.30.0
* Sun Feb 18 2024 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.30.0:
* 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()
- Deprecated Server.kill_server()
- Session.kill_session() renamed to Session.kill()
- Deprecated Session.kill_session()
- Window.kill_window() renamed to Window.kill()
Deprecated Window.kill_window()
* Improved commands
- Server.new_session(): Support environment variables
- Window.split_window(): Support size via -l
- Supports columns/rows (size=10) and percentage (size='10%')
* Sun Feb 18 2024 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.29.0:
* fix(warnings): Use |DeprecationWarning| for APIs being
deprecated
* pytest: Ignore |DeprecationWarning| in tests
* Sun Feb 18 2024 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.28.1:
Maintenance only, no bug fixes or new features
* Thu Feb 15 2024 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.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
ResizeAdjustmentDirection.
* New features
- Pane.resize(): Improved param coverage (#523)
Learned to accept adjustments via adjustment_direction w/
ResizeAdjustmentDirection + adjustment.
Learned to accept manual height and / or width (columns/rows
or percentage) Zoom (and unzoom)
- Window.resize_window(): New Method (#523)
If Pane.resize_pane() (now Pane.resize()) didn't work before,
try resizing the window.
* Bug fixes
- Window.refresh() and Pane.refresh(): Refresh more underlying
state (#523)
- Obj._refresh: Allow passing args (#523)
e.g. -a (all) to list-panes and list-windows
- Server.panes: Fix listing of panes (#523)
Would list only panes in attached session, rather than all in
a server.
* Improvements
- Pane, Window: Improve parsing of option values that return
numbers
(#520)
- Obj._refresh: Allow passing list_extra_args to ensure
list-windows and list-panes can return more than the target
(#523)
* Fri Feb 09 2024 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- ignore some checks again, that seemed fine but are now again
failing intermittently
* Thu Feb 08 2024 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.27.1:
* pyproject: Include MIGRATION in sdist by @tony in #517, for
[#508]
* Thu Feb 08 2024 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.27.0:
* Improvements
- QueryList: Generic fixes by @tony in #515
- This improves the annotations in descendant objects such
as:
- Server.sessions
- Session.windows
- Window.panes
- Bolster tests (ported from libvcs): doctests and pytests
* Thu Feb 08 2024 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- update to 0.26.0:
* 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)
- Add flake8-builtins (A)
- Add flake8-errmsg (EM)
* CI
- Move CodeQL from advanced configuration file to GitHub's
default
* Mon Nov 27 2023 Johannes Kastl <kastl@b1-systems.de>
- update to 0.25.0:
* Comparator fixes
- Fixed __eq__ for windows. by @m1guelperez in #505
- fix(pane,session,server): Return False if type mismatched by
@tony in #510
* Documentation
- ruff: Enable pydocstyle w/ numpy convention by @tony in #509
* Fri Nov 24 2023 Johannes Kastl <kastl@b1-systems.de>
- update to 0.24.1:
* packaging: Remove requirements/ folder. Unused. by @tony in
[#507]
* pyproject: Add gp-libs to test dependency group
* Mon Nov 20 2023 Johannes Kastl <kastl@b1-systems.de>
- update to 0.24.0:
* Breaking changes
- Drop Python 3.7 by @tony in #497
* Packaging
- packaging(pytest): Move configuration to pyproject.toml by
@tony in #499
- 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
- Formatting: black -> ruff format by @tony in #506
- CI: Update action packages to fix warnings
- dorny/paths-filter: 2.7.0 -> 2.11.1
- codecov/codecov-action: 2 -> 3
* Full Changelog: v0.23.2...v0.24.0
* Mon Sep 11 2023 Johannes Kastl <kastl@b1-systems.de>
- update to 0.23.2:
_Maintenance only, no bug fixes or new features_
Final Python 3.7 Release (End of life was June 27th, 2023)
* Wed Sep 06 2023 Johannes Kastl <kastl@b1-systems.de>
- update to 0.23.1:
_Maintenance only, no bug fixes, or new features_
* Development
- Automated typo fixes from [typos-cli]:
```console
typos --format brief --write-changes
```
[typos-cli]: https://github.com/crate-ci/typos
- ruff's linter for code comments, `ERA` (eradicate), has been
removed
* Wed Sep 06 2023 Johannes Kastl <kastl@b1-systems.de>
- update to 0.23.0:
_This maintenance release covers only developer quality of life
improvements, no bug fixes or new features_
* Maintenance
- Stricter code quality rules (via ruff) by @tony in
https://github.com/tmux-python/libtmux/pull/488
* Wed Sep 06 2023 Johannes Kastl <kastl@b1-systems.de>
- update to 0.22.2:
_Maintenance only, no bug fixes or features for this release_
* Build system
- ci: Remove setuptools requirement for build-system in
https://github.com/tmux-python/libtmux/pull/495
* Mon May 29 2023 Johannes Kastl <kastl@b1-systems.de>
- update to 0.22.1:
* Add back black dev dependency until `ruff` replaces black's
formatting
* Sat May 27 2023 Johannes Kastl <kastl@b1-systems.de>
- update to 0.22.0:
* 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.
* Tue May 16 2023 Johannes Kastl <kastl@b1-systems.de>
- ignore flaky test test_capture_pane (see
https://github.com/tmux-python/libtmux/issues/484)
- ignore flaky test test_new_window_with_environment[environment0]
(see https://github.com/tmux-python/libtmux/
issues/480#issuecomment-1551533987)
* Mon May 08 2023 Daniel Garcia <daniel.garcia@suse.com>
- Depends on poetry-core for building, we don't need the full poetry
module in this case.
* Fri May 05 2023 Johannes Kastl <kastl@b1-systems.de>
- add sle15_python_module_pythons
* Thu Apr 06 2023 Johannes Kastl <kastl@b1-systems.de>
- ignore yet another test:
test_new_window_with_environment[environment1]
(reported at https://github.com/tmux-python/libtmux/issues/478)
* Thu Mar 09 2023 Johannes Kastl <kastl@b1-systems.de>
- new package python-libtmux: Python API / wrapper for tmux
/usr/lib/python3.13/site-packages/libtmux /usr/lib/python3.13/site-packages/libtmux-0.62.0.dist-info /usr/lib/python3.13/site-packages/libtmux-0.62.0.dist-info/INSTALLER /usr/lib/python3.13/site-packages/libtmux-0.62.0.dist-info/METADATA /usr/lib/python3.13/site-packages/libtmux-0.62.0.dist-info/RECORD /usr/lib/python3.13/site-packages/libtmux-0.62.0.dist-info/REQUESTED /usr/lib/python3.13/site-packages/libtmux-0.62.0.dist-info/WHEEL /usr/lib/python3.13/site-packages/libtmux-0.62.0.dist-info/entry_points.txt /usr/lib/python3.13/site-packages/libtmux-0.62.0.dist-info/licenses /usr/lib/python3.13/site-packages/libtmux-0.62.0.dist-info/licenses/LICENSE /usr/lib/python3.13/site-packages/libtmux/__about__.py /usr/lib/python3.13/site-packages/libtmux/__init__.py /usr/lib/python3.13/site-packages/libtmux/__pycache__ /usr/lib/python3.13/site-packages/libtmux/__pycache__/__about__.cpython-313.opt-1.pyc /usr/lib/python3.13/site-packages/libtmux/__pycache__/__about__.cpython-313.pyc /usr/lib/python3.13/site-packages/libtmux/__pycache__/__init__.cpython-313.opt-1.pyc /usr/lib/python3.13/site-packages/libtmux/__pycache__/__init__.cpython-313.pyc /usr/lib/python3.13/site-packages/libtmux/__pycache__/_compat.cpython-313.opt-1.pyc /usr/lib/python3.13/site-packages/libtmux/__pycache__/_compat.cpython-313.pyc /usr/lib/python3.13/site-packages/libtmux/__pycache__/client.cpython-313.opt-1.pyc /usr/lib/python3.13/site-packages/libtmux/__pycache__/client.cpython-313.pyc /usr/lib/python3.13/site-packages/libtmux/__pycache__/common.cpython-313.opt-1.pyc /usr/lib/python3.13/site-packages/libtmux/__pycache__/common.cpython-313.pyc /usr/lib/python3.13/site-packages/libtmux/__pycache__/constants.cpython-313.opt-1.pyc /usr/lib/python3.13/site-packages/libtmux/__pycache__/constants.cpython-313.pyc /usr/lib/python3.13/site-packages/libtmux/__pycache__/exc.cpython-313.opt-1.pyc /usr/lib/python3.13/site-packages/libtmux/__pycache__/exc.cpython-313.pyc /usr/lib/python3.13/site-packages/libtmux/__pycache__/formats.cpython-313.opt-1.pyc /usr/lib/python3.13/site-packages/libtmux/__pycache__/formats.cpython-313.pyc /usr/lib/python3.13/site-packages/libtmux/__pycache__/hooks.cpython-313.opt-1.pyc /usr/lib/python3.13/site-packages/libtmux/__pycache__/hooks.cpython-313.pyc /usr/lib/python3.13/site-packages/libtmux/__pycache__/neo.cpython-313.opt-1.pyc /usr/lib/python3.13/site-packages/libtmux/__pycache__/neo.cpython-313.pyc /usr/lib/python3.13/site-packages/libtmux/__pycache__/options.cpython-313.opt-1.pyc /usr/lib/python3.13/site-packages/libtmux/__pycache__/options.cpython-313.pyc /usr/lib/python3.13/site-packages/libtmux/__pycache__/pane.cpython-313.opt-1.pyc /usr/lib/python3.13/site-packages/libtmux/__pycache__/pane.cpython-313.pyc /usr/lib/python3.13/site-packages/libtmux/__pycache__/pytest_plugin.cpython-313.opt-1.pyc /usr/lib/python3.13/site-packages/libtmux/__pycache__/pytest_plugin.cpython-313.pyc /usr/lib/python3.13/site-packages/libtmux/__pycache__/server.cpython-313.opt-1.pyc /usr/lib/python3.13/site-packages/libtmux/__pycache__/server.cpython-313.pyc /usr/lib/python3.13/site-packages/libtmux/__pycache__/session.cpython-313.opt-1.pyc /usr/lib/python3.13/site-packages/libtmux/__pycache__/session.cpython-313.pyc /usr/lib/python3.13/site-packages/libtmux/__pycache__/window.cpython-313.opt-1.pyc /usr/lib/python3.13/site-packages/libtmux/__pycache__/window.cpython-313.pyc /usr/lib/python3.13/site-packages/libtmux/_compat.py /usr/lib/python3.13/site-packages/libtmux/_internal /usr/lib/python3.13/site-packages/libtmux/_internal/__init__.py /usr/lib/python3.13/site-packages/libtmux/_internal/__pycache__ /usr/lib/python3.13/site-packages/libtmux/_internal/__pycache__/__init__.cpython-313.opt-1.pyc /usr/lib/python3.13/site-packages/libtmux/_internal/__pycache__/__init__.cpython-313.pyc /usr/lib/python3.13/site-packages/libtmux/_internal/__pycache__/constants.cpython-313.opt-1.pyc /usr/lib/python3.13/site-packages/libtmux/_internal/__pycache__/constants.cpython-313.pyc /usr/lib/python3.13/site-packages/libtmux/_internal/__pycache__/control_mode.cpython-313.opt-1.pyc /usr/lib/python3.13/site-packages/libtmux/_internal/__pycache__/control_mode.cpython-313.pyc /usr/lib/python3.13/site-packages/libtmux/_internal/__pycache__/dataclasses.cpython-313.opt-1.pyc /usr/lib/python3.13/site-packages/libtmux/_internal/__pycache__/dataclasses.cpython-313.pyc /usr/lib/python3.13/site-packages/libtmux/_internal/__pycache__/env.cpython-313.opt-1.pyc /usr/lib/python3.13/site-packages/libtmux/_internal/__pycache__/env.cpython-313.pyc /usr/lib/python3.13/site-packages/libtmux/_internal/__pycache__/query_list.cpython-313.opt-1.pyc /usr/lib/python3.13/site-packages/libtmux/_internal/__pycache__/query_list.cpython-313.pyc /usr/lib/python3.13/site-packages/libtmux/_internal/__pycache__/sparse_array.cpython-313.opt-1.pyc /usr/lib/python3.13/site-packages/libtmux/_internal/__pycache__/sparse_array.cpython-313.pyc /usr/lib/python3.13/site-packages/libtmux/_internal/__pycache__/types.cpython-313.opt-1.pyc /usr/lib/python3.13/site-packages/libtmux/_internal/__pycache__/types.cpython-313.pyc /usr/lib/python3.13/site-packages/libtmux/_internal/constants.py /usr/lib/python3.13/site-packages/libtmux/_internal/control_mode.py /usr/lib/python3.13/site-packages/libtmux/_internal/dataclasses.py /usr/lib/python3.13/site-packages/libtmux/_internal/env.py /usr/lib/python3.13/site-packages/libtmux/_internal/query_list.py /usr/lib/python3.13/site-packages/libtmux/_internal/sparse_array.py /usr/lib/python3.13/site-packages/libtmux/_internal/types.py /usr/lib/python3.13/site-packages/libtmux/_vendor /usr/lib/python3.13/site-packages/libtmux/_vendor/__init__.py /usr/lib/python3.13/site-packages/libtmux/_vendor/__pycache__ /usr/lib/python3.13/site-packages/libtmux/_vendor/__pycache__/__init__.cpython-313.opt-1.pyc /usr/lib/python3.13/site-packages/libtmux/_vendor/__pycache__/__init__.cpython-313.pyc /usr/lib/python3.13/site-packages/libtmux/_vendor/__pycache__/_structures.cpython-313.opt-1.pyc /usr/lib/python3.13/site-packages/libtmux/_vendor/__pycache__/_structures.cpython-313.pyc /usr/lib/python3.13/site-packages/libtmux/_vendor/__pycache__/version.cpython-313.opt-1.pyc /usr/lib/python3.13/site-packages/libtmux/_vendor/__pycache__/version.cpython-313.pyc /usr/lib/python3.13/site-packages/libtmux/_vendor/_structures.py /usr/lib/python3.13/site-packages/libtmux/_vendor/version.py /usr/lib/python3.13/site-packages/libtmux/client.py /usr/lib/python3.13/site-packages/libtmux/common.py /usr/lib/python3.13/site-packages/libtmux/constants.py /usr/lib/python3.13/site-packages/libtmux/exc.py /usr/lib/python3.13/site-packages/libtmux/formats.py /usr/lib/python3.13/site-packages/libtmux/hooks.py /usr/lib/python3.13/site-packages/libtmux/neo.py /usr/lib/python3.13/site-packages/libtmux/options.py /usr/lib/python3.13/site-packages/libtmux/pane.py /usr/lib/python3.13/site-packages/libtmux/py.typed /usr/lib/python3.13/site-packages/libtmux/pytest_plugin.py /usr/lib/python3.13/site-packages/libtmux/server.py /usr/lib/python3.13/site-packages/libtmux/session.py /usr/lib/python3.13/site-packages/libtmux/test /usr/lib/python3.13/site-packages/libtmux/test/__init__.py /usr/lib/python3.13/site-packages/libtmux/test/__pycache__ /usr/lib/python3.13/site-packages/libtmux/test/__pycache__/__init__.cpython-313.opt-1.pyc /usr/lib/python3.13/site-packages/libtmux/test/__pycache__/__init__.cpython-313.pyc /usr/lib/python3.13/site-packages/libtmux/test/__pycache__/constants.cpython-313.opt-1.pyc /usr/lib/python3.13/site-packages/libtmux/test/__pycache__/constants.cpython-313.pyc /usr/lib/python3.13/site-packages/libtmux/test/__pycache__/environment.cpython-313.opt-1.pyc /usr/lib/python3.13/site-packages/libtmux/test/__pycache__/environment.cpython-313.pyc /usr/lib/python3.13/site-packages/libtmux/test/__pycache__/random.cpython-313.opt-1.pyc /usr/lib/python3.13/site-packages/libtmux/test/__pycache__/random.cpython-313.pyc /usr/lib/python3.13/site-packages/libtmux/test/__pycache__/retry.cpython-313.opt-1.pyc /usr/lib/python3.13/site-packages/libtmux/test/__pycache__/retry.cpython-313.pyc /usr/lib/python3.13/site-packages/libtmux/test/__pycache__/temporary.cpython-313.opt-1.pyc /usr/lib/python3.13/site-packages/libtmux/test/__pycache__/temporary.cpython-313.pyc /usr/lib/python3.13/site-packages/libtmux/test/constants.py /usr/lib/python3.13/site-packages/libtmux/test/environment.py /usr/lib/python3.13/site-packages/libtmux/test/random.py /usr/lib/python3.13/site-packages/libtmux/test/retry.py /usr/lib/python3.13/site-packages/libtmux/test/temporary.py /usr/lib/python3.13/site-packages/libtmux/window.py /usr/share/doc/packages/python313-libtmux /usr/share/doc/packages/python313-libtmux/README.md /usr/share/licenses/python313-libtmux /usr/share/licenses/python313-libtmux/LICENSE
Generated by rpm2html 1.8.1
Fabrice Bellet, Sun Aug 2 03:14:27 2026