|
7 | 7 |
|
8 | 8 | libtmux.server
|
9 | 9 | ~~~~~~~~~~~~~~
|
| 10 | +
|
| 11 | +Examples |
| 12 | +-------- |
| 13 | +>>> from libtmux import Server |
| 14 | +>>> server = Server() # Create a new server instance |
| 15 | +>>> server.is_alive() # Check if tmux server is running |
| 16 | +True |
| 17 | +>>> # Clean up any existing test session first |
| 18 | +>>> if server.has_session("test_session"): |
| 19 | +... server.kill_session("test_session") |
| 20 | +>>> new_session = server.new_session(session_name="test_session") |
| 21 | +>>> new_session.name |
| 22 | +'test_session' |
| 23 | +>>> server.has_session("test_session") |
| 24 | +True |
| 25 | +>>> server.kill_session("test_session") # Clean up |
| 26 | +Server(socket_path=/tmp/tmux-.../default) |
10 | 27 | """
|
11 | 28 |
|
12 | 29 | from __future__ import annotations
|
@@ -359,25 +376,33 @@ def attached_sessions(self) -> list[Session]:
|
359 | 376 | return self.sessions.filter(session_attached__noeq="1")
|
360 | 377 |
|
361 | 378 | def has_session(self, target_session: str, exact: bool = True) -> bool:
|
362 |
| - """Check if a session with the given name (or pattern) exists. |
| 379 | + """Return True if session exists. |
363 | 380 |
|
364 | 381 | Parameters
|
365 | 382 | ----------
|
366 |
| - target_session |
367 |
| - The session name or pattern to check. |
368 |
| - exact |
369 |
| - Whether to require an exact match (tmux 2.1+). If True, prepends |
370 |
| - ``=`` to the session name for an exact match. |
371 |
| -
|
372 |
| - Raises |
373 |
| - ------ |
374 |
| - exc.BadSessionName |
375 |
| - If the `target_session` is invalid. |
| 383 | + target_session : str |
| 384 | + Target session name to check |
| 385 | + exact : bool, optional |
| 386 | + If True, match the name exactly. Otherwise, match as a pattern. |
376 | 387 |
|
377 |
| - Returns |
378 |
| - ------- |
379 |
| - bool |
380 |
| - True if the session exists, False otherwise. |
| 388 | + Examples |
| 389 | + -------- |
| 390 | + >>> server = Server() |
| 391 | + >>> # Clean up any existing test session |
| 392 | + >>> if server.has_session("test_session"): |
| 393 | + ... server.kill_session("test_session") |
| 394 | + >>> server.new_session(session_name="test_session") |
| 395 | + Session($... test_session) |
| 396 | + >>> server.has_session("test_session") |
| 397 | + True |
| 398 | + >>> server.has_session("nonexistent") |
| 399 | + False |
| 400 | + >>> server.has_session("test_session", exact=True) # Exact match |
| 401 | + True |
| 402 | + >>> server.has_session("test*", exact=False) # Pattern match |
| 403 | + True |
| 404 | + >>> server.kill_session("test_session") # Clean up |
| 405 | + Server(socket_path=/tmp/tmux-.../default) |
381 | 406 | """
|
382 | 407 | session_check_name(target_session)
|
383 | 408 |
|
@@ -409,23 +434,26 @@ def kill(self) -> None:
|
409 | 434 | self.cmd("kill-server")
|
410 | 435 |
|
411 | 436 | def kill_session(self, target_session: str | int) -> Server:
|
412 |
| - """Kill a specific session on this server. |
| 437 | + """Kill a session by name. |
413 | 438 |
|
414 | 439 | Parameters
|
415 | 440 | ----------
|
416 |
| - target_session |
417 |
| - The session name or ID to kill. Note that tmux uses fnmatch(3), |
418 |
| - so 'asdf' might also match 'asdfasd'. |
| 441 | + target_session : str or int |
| 442 | + Name of the session or session ID to kill |
419 | 443 |
|
420 |
| - Returns |
421 |
| - ------- |
422 |
| - Server |
423 |
| - This server object (for chaining). |
424 |
| -
|
425 |
| - Raises |
426 |
| - ------ |
427 |
| - exc.LibTmuxException |
428 |
| - If tmux reports an error (stderr output). |
| 444 | + Examples |
| 445 | + -------- |
| 446 | + >>> server = Server() |
| 447 | + >>> # Clean up any existing session first |
| 448 | + >>> if server.has_session("temp"): |
| 449 | + ... server.kill_session("temp") |
| 450 | + >>> session = server.new_session(session_name="temp") |
| 451 | + >>> server.has_session("temp") |
| 452 | + True |
| 453 | + >>> server.kill_session("temp") |
| 454 | + Server(socket_path=/tmp/tmux-.../default) |
| 455 | + >>> server.has_session("temp") |
| 456 | + False |
429 | 457 | """
|
430 | 458 | proc = self.cmd("kill-session", target=target_session)
|
431 | 459 | if proc.stderr:
|
@@ -487,58 +515,63 @@ def new_session(
|
487 | 515 | *args: t.Any,
|
488 | 516 | **kwargs: t.Any,
|
489 | 517 | ) -> Session:
|
490 |
| - """Create a new tmux session and return the associated :class:`Session`. |
491 |
| -
|
492 |
| - Uses ``-P -F#{session_id}`` to capture the session ID in the output. |
| 518 | + """Create a new session. |
493 | 519 |
|
494 | 520 | Parameters
|
495 | 521 | ----------
|
496 | 522 | session_name : str, optional
|
497 |
| - The name to assign to the new session (``-s`` flag). |
| 523 | + Name of the session |
498 | 524 | kill_session : bool, optional
|
499 |
| - If True, kills any existing session with the same name. |
| 525 | + Kill session if it exists |
500 | 526 | attach : bool, optional
|
501 |
| - If True, creates the new session in the foreground (no ``-d`` flag). |
| 527 | + Attach to session after creating it |
502 | 528 | start_directory : str, optional
|
503 |
| - Working directory for the new session (``-c`` flag). |
| 529 | + Working directory for the session |
504 | 530 | window_name : str, optional
|
505 |
| - If given, creates the session's first window with this name (``-n``). |
| 531 | + Name of the initial window |
506 | 532 | window_command : str, optional
|
507 |
| - A shell command to run immediately in the new window; the window |
508 |
| - closes when the command exits. |
| 533 | + Command to run in the initial window |
509 | 534 | x : int or "-", optional
|
510 |
| - Forces the specified width for the new session if detached (``-x``). |
| 535 | + Width of new window |
511 | 536 | y : int or "-", optional
|
512 |
| - Forces the specified height for the new session if detached (``-y``). |
513 |
| - environment : dict of str to str, optional |
514 |
| - Environment variables to set for the session (tmux 3.2+). |
515 |
| -
|
516 |
| - Returns |
517 |
| - ------- |
518 |
| - Session |
519 |
| - The newly created :class:`Session`. |
520 |
| -
|
521 |
| - Raises |
522 |
| - ------ |
523 |
| - exc.TmuxSessionExists |
524 |
| - If a session with the given `session_name` already exists and |
525 |
| - `kill_session` is False. |
526 |
| - exc.BadSessionName |
527 |
| - If `session_name` is invalid. |
528 |
| - exc.LibTmuxException |
529 |
| - If tmux reports an error (stderr output). |
| 537 | + Height of new window |
| 538 | + environment : dict, optional |
| 539 | + Dictionary of environment variables to set |
530 | 540 |
|
531 | 541 | Examples
|
532 | 542 | --------
|
533 |
| - Sessions can be created without a session name: |
534 |
| -
|
535 |
| - >>> server.new_session() |
536 |
| - Session($2 2) |
537 |
| -
|
538 |
| - With a session name: |
| 543 | + >>> server = Server() |
| 544 | + >>> # Clean up any existing sessions first |
| 545 | + >>> for name in ["basic", "custom", "env_test"]: |
| 546 | + ... if server.has_session(name): |
| 547 | + ... server.kill_session(name) |
| 548 | + >>> # Create a basic session |
| 549 | + >>> session1 = server.new_session(session_name="basic") |
| 550 | + >>> session1.name |
| 551 | + 'basic' |
| 552 | +
|
| 553 | + >>> # Create session with custom window name |
| 554 | + >>> session2 = server.new_session( |
| 555 | + ... session_name="custom", |
| 556 | + ... window_name="editor" |
| 557 | + ... ) |
| 558 | + >>> session2.windows[0].name |
| 559 | + 'editor' |
539 | 560 |
|
540 |
| - >>> server.new_session(session_name='my session') |
541 |
| - Session($3 my session) |
| 561 | + >>> # Create session with environment variables |
| 562 | + >>> session3 = server.new_session( |
| 563 | + ... session_name="env_test", |
| 564 | + ... environment={"TEST_VAR": "test_value"} |
| 565 | + ... ) |
| 566 | + >>> session3.name |
| 567 | + 'env_test' |
| 568 | +
|
| 569 | + >>> # Clean up |
| 570 | + >>> for name in ["basic", "custom", "env_test"]: |
| 571 | + ... server.kill_session(name) |
| 572 | + Server(socket_path=/tmp/tmux-.../default) |
| 573 | + Server(socket_path=/tmp/tmux-.../default) |
| 574 | + Server(socket_path=/tmp/tmux-.../default) |
542 | 575 | """
|
543 | 576 | if session_name is not None:
|
544 | 577 | session_check_name(session_name)
|
@@ -598,11 +631,27 @@ def new_session(
|
598 | 631 |
|
599 | 632 | @property
|
600 | 633 | def sessions(self) -> QueryList[Session]:
|
601 |
| - """Return a :class:`QueryList` of all :class:`Session` objects in this server. |
| 634 | + """Return list of sessions. |
602 | 635 |
|
603 |
| - Access advanced filtering and retrieval with: |
604 |
| - :meth:`.sessions.get() <libtmux._internal.query_list.QueryList.get()>` and |
605 |
| - :meth:`.sessions.filter() <libtmux._internal.query_list.QueryList.filter()>` |
| 636 | + Examples |
| 637 | + -------- |
| 638 | + >>> server = Server() |
| 639 | + >>> # Clean up any existing test sessions first |
| 640 | + >>> for name in ["test1", "test2"]: |
| 641 | + ... if server.has_session(name): |
| 642 | + ... server.kill_session(name) |
| 643 | + >>> # Create some test sessions |
| 644 | + >>> session1 = server.new_session(session_name="test1") |
| 645 | + >>> session2 = server.new_session(session_name="test2") |
| 646 | + >>> len(server.sessions) >= 2 # May have other sessions |
| 647 | + True |
| 648 | + >>> sorted([s.name for s in server.sessions if s.name in ["test1", "test2"]]) |
| 649 | + ['test1', 'test2'] |
| 650 | + >>> # Clean up |
| 651 | + >>> server.kill_session("test1") |
| 652 | + Server(socket_path=/tmp/tmux-.../default) |
| 653 | + >>> server.kill_session("test2") |
| 654 | + Server(socket_path=/tmp/tmux-.../default) |
606 | 655 | """
|
607 | 656 | sessions: list[Session] = []
|
608 | 657 | with contextlib.suppress(Exception):
|
|
0 commit comments