@@ -325,6 +325,155 @@ def cmd(self, *args: t.Any, **kwargs: t.Any) -> tmux_cmd:
325
325
#
326
326
# Commands (tmux-like)
327
327
#
328
+ def set_option (
329
+ self , option : str , value : t .Union [str , int ], _global : bool = False
330
+ ) -> "_Session" :
331
+ """
332
+ Set option ``$ tmux set-option <option> <value>``.
333
+
334
+ Parameters
335
+ ----------
336
+ option : str
337
+ the window option. such as 'default-shell'.
338
+ value : str, int, or bool
339
+ True/False will turn in 'on' and 'off'. You can also enter 'on' or
340
+ 'off' directly.
341
+ _global : bool, optional
342
+ check for option globally across all servers (-g)
343
+
344
+ Raises
345
+ ------
346
+ :exc:`exc.OptionError`, :exc:`exc.UnknownOption`,
347
+ :exc:`exc.InvalidOption`, :exc:`exc.AmbiguousOption`
348
+
349
+ Notes
350
+ -----
351
+ .. todo::
352
+
353
+ Needs tests
354
+ """
355
+ if isinstance (value , bool ) and value :
356
+ value = "on"
357
+ elif isinstance (value , bool ) and not value :
358
+ value = "off"
359
+
360
+ tmux_args : t .Tuple [t .Union [str , int ], ...] = tuple ()
361
+
362
+ if _global :
363
+ tmux_args += ("-g" ,)
364
+
365
+ assert isinstance (option , str )
366
+ assert isinstance (value , (str , int ))
367
+
368
+ tmux_args += (
369
+ option ,
370
+ value ,
371
+ )
372
+
373
+ proc = self .cmd ("set-option" , * tmux_args )
374
+
375
+ if isinstance (proc .stderr , list ) and len (proc .stderr ):
376
+ handle_option_error (proc .stderr [0 ])
377
+
378
+ return self
379
+
380
+ def show_options (
381
+ self , _global : t .Optional [bool ] = False
382
+ ) -> t .Dict [str , t .Union [str , int ]]:
383
+ """
384
+ Return a dict of options for the window.
385
+
386
+ For familiarity with tmux, the option ``option`` param forwards to pick
387
+ a single option, forwarding to :meth:`Session.show_option`.
388
+
389
+ Parameters
390
+ ----------
391
+ _global : bool, optional
392
+ Pass ``-g`` flag for global variable (server-wide)
393
+
394
+ Returns
395
+ -------
396
+ :py:obj:`dict`
397
+
398
+ Notes
399
+ -----
400
+ Uses ``_global`` for keyword name instead of ``global`` to avoid
401
+ colliding with reserved keyword.
402
+ """
403
+ tmux_args : t .Tuple [str , ...] = tuple ()
404
+
405
+ if _global :
406
+ tmux_args += ("-g" ,)
407
+
408
+ tmux_args += ("show-options" ,)
409
+ session_output = self .cmd (* tmux_args ).stdout
410
+
411
+ session_options : t .Dict [str , t .Union [str , int ]] = {}
412
+ for item in session_output :
413
+ key , val = item .split (" " , maxsplit = 1 )
414
+ assert isinstance (key , str )
415
+ assert isinstance (val , str )
416
+
417
+ if isinstance (val , str ) and val .isdigit ():
418
+ session_options [key ] = int (val )
419
+
420
+ return session_options
421
+
422
+ def show_option (
423
+ self , option : str , _global : bool = False
424
+ ) -> t .Optional [t .Union [str , int , bool ]]:
425
+ """Return a list of options for the window.
426
+
427
+ Parameters
428
+ ----------
429
+ option : str
430
+ option name
431
+ _global : bool, optional
432
+ use global option scope, same as ``-g``
433
+
434
+ Returns
435
+ -------
436
+ str, int, or bool
437
+
438
+ Raises
439
+ ------
440
+ :exc:`exc.OptionError`, :exc:`exc.UnknownOption`,
441
+ :exc:`exc.InvalidOption`, :exc:`exc.AmbiguousOption`
442
+
443
+ Notes
444
+ -----
445
+ Uses ``_global`` for keyword name instead of ``global`` to avoid
446
+ colliding with reserved keyword.
447
+
448
+ Test and return True/False for on/off string.
449
+ """
450
+
451
+ tmux_args : t .Tuple [str , ...] = tuple ()
452
+
453
+ if _global :
454
+ tmux_args += ("-g" ,)
455
+
456
+ tmux_args += (option ,)
457
+
458
+ cmd = self .cmd ("show-options" , * tmux_args )
459
+
460
+ if isinstance (cmd .stderr , list ) and len (cmd .stderr ):
461
+ handle_option_error (cmd .stderr [0 ])
462
+
463
+ if not len (cmd .stdout ):
464
+ return None
465
+
466
+ value_raw : t .List [str ] = [item .split (" " ) for item in cmd .stdout ][0 ]
467
+
468
+ assert isinstance (value_raw [0 ], str )
469
+ assert isinstance (value_raw [1 ], str )
470
+
471
+ value : t .Union [str , int ] = (
472
+ int (value_raw [1 ]) if value_raw [1 ].isdigit () else value_raw [1 ]
473
+ )
474
+
475
+ return value
476
+
328
477
def select_window (self , target_window : t .Union [str , int ]) -> "_Window" :
329
478
"""
330
479
Return :class:`Window` selected via ``$ tmux select-window``.
@@ -549,6 +698,15 @@ def kill_window(self, target_window: t.Optional[str] = None) -> None:
549
698
550
699
self .server ._update_windows ()
551
700
701
+ #
702
+ # Computed properties
703
+ #
704
+ @property
705
+ def attached_pane (self ) -> t .Optional ["_Pane" ]:
706
+ """Return active :class:`Pane` object."""
707
+
708
+ return self .attached_window .attached_pane
709
+
552
710
#
553
711
# Redundant stuff we want to remove
554
712
#
0 commit comments