Skip to content

Commit fffc0eb

Browse files
committed
Pane(feat[paste_buffer]): add paste_buffer() wrapping tmux paste-buffer
why: paste-buffer is needed for programmatically inserting buffer content into panes, completing the buffer management API. what: - Add Pane.paste_buffer() with buffer_name (-b), delete_after (-d), no_trailing_newline (-r), bracket (-p), separator (-s) parameters - Add test verifying buffer content appears in pane after paste
1 parent 86297ec commit fffc0eb

2 files changed

Lines changed: 77 additions & 0 deletions

File tree

src/libtmux/pane.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1139,6 +1139,57 @@ def enter(self) -> Pane:
11391139
self.cmd("send-keys", "Enter")
11401140
return self
11411141

1142+
def paste_buffer(
1143+
self,
1144+
*,
1145+
buffer_name: str | None = None,
1146+
delete_after: bool | None = None,
1147+
no_trailing_newline: bool | None = None,
1148+
bracket: bool | None = None,
1149+
separator: str | None = None,
1150+
) -> None:
1151+
"""Paste a buffer into the pane via ``$ tmux paste-buffer``.
1152+
1153+
Parameters
1154+
----------
1155+
buffer_name : str, optional
1156+
Name of the buffer to paste (``-b`` flag).
1157+
delete_after : bool, optional
1158+
Delete the buffer after pasting (``-d`` flag).
1159+
no_trailing_newline : bool, optional
1160+
Do not add a trailing newline (``-r`` flag).
1161+
bracket : bool, optional
1162+
Use bracketed paste mode (``-p`` flag).
1163+
separator : str, optional
1164+
Separator between lines (``-s`` flag).
1165+
1166+
Examples
1167+
--------
1168+
>>> server.set_buffer('pasted_text')
1169+
>>> pane.paste_buffer()
1170+
"""
1171+
tmux_args: tuple[str, ...] = ()
1172+
1173+
if delete_after:
1174+
tmux_args += ("-d",)
1175+
1176+
if no_trailing_newline:
1177+
tmux_args += ("-r",)
1178+
1179+
if bracket:
1180+
tmux_args += ("-p",)
1181+
1182+
if buffer_name is not None:
1183+
tmux_args += ("-b", buffer_name)
1184+
1185+
if separator is not None:
1186+
tmux_args += ("-s", separator)
1187+
1188+
proc = self.cmd("paste-buffer", *tmux_args)
1189+
1190+
if proc.stderr:
1191+
raise exc.LibTmuxException(proc.stderr)
1192+
11421193
def pipe(
11431194
self,
11441195
command: str | None = None,

tests/test_pane.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -740,6 +740,32 @@ def test_split_percentage_size_mutual_exclusion(session: Session) -> None:
740740
pane.split(size=10, percentage=50)
741741

742742

743+
def test_paste_buffer(session: Session) -> None:
744+
"""Test Pane.paste_buffer() pastes buffer content into pane."""
745+
env = shutil.which("env")
746+
assert env is not None
747+
748+
window = session.new_window(
749+
window_name="test_paste",
750+
window_shell=f"{env} PS1='$ ' sh",
751+
)
752+
pane = window.active_pane
753+
assert pane is not None
754+
755+
retry_until(lambda: "$" in "\n".join(pane.capture_pane()), 2, raises=True)
756+
757+
# Set buffer and paste it
758+
session.server.set_buffer("pasted_content", buffer_name="paste_test")
759+
pane.paste_buffer(buffer_name="paste_test")
760+
761+
# Verify content appeared in pane
762+
retry_until(
763+
lambda: "pasted_content" in "\n".join(pane.capture_pane()),
764+
3,
765+
raises=True,
766+
)
767+
768+
743769
def test_pipe_pane(session: Session, tmp_path: pathlib.Path) -> None:
744770
"""Test Pane.pipe() pipes output to a file."""
745771
env = shutil.which("env")

0 commit comments

Comments
 (0)