Skip to content

Commit abbefdf

Browse files
committed
Pane(feat[set_title]): Add set_title() method and pane_title support
why: tmux supports select-pane -T and #{pane_title} (since 2.6). tmuxinator uses this for named panes. libtmux had no wrapper and pane_title was commented out of formats.py. what: - Uncomment pane_title in formats.py PANE_FORMATS list - Add pane_title field to neo.Obj dataclass - Add Pane.set_title() method using select-pane -T - Add Pane.title property alias for pane_title - Add tests for set_title with plain and special characters
1 parent 7b3654a commit abbefdf

4 files changed

Lines changed: 59 additions & 1 deletion

File tree

src/libtmux/formats.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@
6767
"pane_index",
6868
"pane_width",
6969
"pane_height",
70-
# "pane_title", # removed in 3.1+
70+
"pane_title",
7171
"pane_id",
7272
"pane_active",
7373
"pane_dead",

src/libtmux/neo.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ class Obj:
103103
pane_start_command: str | None = None
104104
pane_start_path: str | None = None
105105
pane_tabs: str | None = None
106+
pane_title: str | None = None
106107
pane_top: str | None = None
107108
pane_tty: str | None = None
108109
pane_width: str | None = None

src/libtmux/pane.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -831,6 +831,32 @@ def set_height(self, height: int) -> Pane:
831831
self.resize(height=height)
832832
return self
833833

834+
def set_title(self, title: str) -> Pane:
835+
"""Set pane title via ``select-pane -T``.
836+
837+
Parameters
838+
----------
839+
title : str
840+
Title to set for the pane.
841+
842+
Returns
843+
-------
844+
:class:`Pane`
845+
846+
Examples
847+
--------
848+
>>> pane.set_title('my-title')
849+
Pane(...)
850+
851+
>>> pane.pane_title
852+
'my-title'
853+
"""
854+
proc = self.cmd("select-pane", "-T", title)
855+
if proc.stderr:
856+
raise exc.LibTmuxException(proc.stderr)
857+
self.refresh()
858+
return self
859+
834860
def enter(self) -> Pane:
835861
"""Send carriage return to pane.
836862
@@ -913,6 +939,18 @@ def width(self) -> str | None:
913939
"""
914940
return self.pane_width
915941

942+
@property
943+
def title(self) -> str | None:
944+
"""Alias for :attr:`pane_title`.
945+
946+
>>> pane.set_title('test-alias')
947+
Pane(...)
948+
949+
>>> pane.title == pane.pane_title
950+
True
951+
"""
952+
return self.pane_title
953+
916954
@property
917955
def at_top(self) -> bool:
918956
"""Typed, converted wrapper around :attr:`Pane.pane_at_top`.

tests/test_pane.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,25 @@ def test_split_pane_size(session: Session) -> None:
303303
assert new_pane.at_right
304304

305305

306+
def test_set_title(session: Session) -> None:
307+
"""Test Pane.set_title() sets pane title."""
308+
window = session.active_window
309+
pane = window.active_pane
310+
assert pane is not None
311+
result = pane.set_title("test-title")
312+
assert result == pane # returns self for chaining
313+
assert pane.pane_title == "test-title"
314+
assert pane.title == "test-title"
315+
316+
317+
def test_set_title_special_characters(session: Session) -> None:
318+
"""Test Pane.set_title() with spaces and unicode."""
319+
pane = session.active_window.active_pane
320+
assert pane is not None
321+
pane.set_title("my pane title")
322+
assert pane.pane_title == "my pane title"
323+
324+
306325
def test_pane_context_manager(session: Session) -> None:
307326
"""Test Pane context manager functionality."""
308327
window = session.new_window()

0 commit comments

Comments
 (0)