16
16
from libtmux ._internal .query_list import QueryList
17
17
from libtmux .common import has_gte_version , tmux_cmd
18
18
from libtmux .constants import (
19
- OPTION_SCOPE_FLAG_MAP ,
20
19
RESIZE_ADJUSTMENT_DIRECTION_FLAG_MAP ,
21
20
OptionScope ,
22
21
PaneDirection ,
27
26
from libtmux .pane import Pane
28
27
29
28
from . import exc
30
- from .options import handle_option_error
29
+ from .common import PaneDict , WindowOptionDict
30
+ from .options import OptionsMixin
31
31
32
32
if t .TYPE_CHECKING :
33
33
from .common import PaneDict , WindowOptionDict
38
38
39
39
40
40
@dataclasses .dataclass ()
41
- class Window (Obj ):
41
+ class Window (Obj , OptionsMixin ):
42
42
""":term:`tmux(1)` :term:`Window` [window_manual]_.
43
43
44
44
Holds :class:`Pane` objects.
@@ -86,6 +86,7 @@ class Window(Obj):
86
86
https://man.openbsd.org/tmux.1#DESCRIPTION. Accessed April 1st, 2018.
87
87
"""
88
88
89
+ default_option_scope : OptionScope | None = OptionScope .Window
89
90
server : Server
90
91
91
92
def refresh (self ) -> None :
@@ -390,230 +391,6 @@ def select_layout(self, layout: str | None = None) -> Window:
390
391
391
392
return self
392
393
393
- def set_option (
394
- self ,
395
- option : str ,
396
- value : int | str ,
397
- _format : bool | None = None ,
398
- unset : bool | None = None ,
399
- unset_panes : bool | None = None ,
400
- prevent_overwrite : bool | None = None ,
401
- suppress_warnings : bool | None = None ,
402
- append : bool | None = None ,
403
- g : bool | None = None ,
404
- scope : OptionScope | None = None ,
405
- ) -> Window :
406
- """Set option for tmux window.
407
-
408
- Wraps ``$ tmux set-option <option> <value>``.
409
-
410
- Parameters
411
- ----------
412
- option : str
413
- option to set, e.g. 'aggressive-resize'
414
- value : str
415
- window option value. True/False will turn in 'on' and 'off',
416
- also accepts string of 'on' or 'off' directly.
417
-
418
- Raises
419
- ------
420
- :exc:`exc.OptionError`, :exc:`exc.UnknownOption`,
421
- :exc:`exc.InvalidOption`, :exc:`exc.AmbiguousOption`
422
- """
423
- flags : list [str ] = []
424
- if isinstance (value , bool ) and value :
425
- value = "on"
426
- elif isinstance (value , bool ) and not value :
427
- value = "off"
428
-
429
- if unset is not None and unset :
430
- assert isinstance (unset , bool )
431
- flags .append ("-u" )
432
-
433
- if unset_panes is not None and unset_panes :
434
- assert isinstance (unset_panes , bool )
435
- flags .append ("-U" )
436
-
437
- if _format is not None and _format :
438
- assert isinstance (_format , bool )
439
- flags .append ("-F" )
440
-
441
- if prevent_overwrite is not None and prevent_overwrite :
442
- assert isinstance (prevent_overwrite , bool )
443
- flags .append ("-o" )
444
-
445
- if suppress_warnings is not None and suppress_warnings :
446
- assert isinstance (suppress_warnings , bool )
447
- flags .append ("-q" )
448
-
449
- if append is not None and append :
450
- assert isinstance (append , bool )
451
- flags .append ("-a" )
452
-
453
- if g is not None and g :
454
- assert isinstance (g , bool )
455
- flags .append ("-g" )
456
-
457
- if scope is not None :
458
- assert scope in OPTION_SCOPE_FLAG_MAP
459
- flags .append (
460
- OPTION_SCOPE_FLAG_MAP [scope ],
461
- )
462
-
463
- cmd = self .cmd (
464
- "set-option" ,
465
- "-w" ,
466
- * flags ,
467
- option ,
468
- value ,
469
- )
470
-
471
- if isinstance (cmd .stderr , list ) and len (cmd .stderr ):
472
- handle_option_error (cmd .stderr [0 ])
473
-
474
- return self
475
-
476
- @t .overload
477
- def show_options (
478
- self ,
479
- g : bool | None ,
480
- scope : OptionScope | None ,
481
- include_hooks : bool | None ,
482
- include_parents : bool | None ,
483
- values_only : t .Literal [True ],
484
- ) -> list [str ]: ...
485
-
486
- @t .overload
487
- def show_options (
488
- self ,
489
- g : bool | None ,
490
- scope : OptionScope | None ,
491
- include_hooks : bool | None ,
492
- include_parents : bool | None ,
493
- values_only : t .Literal [None ] = None ,
494
- ) -> WindowOptionDict : ...
495
-
496
- @t .overload
497
- def show_options (
498
- self ,
499
- g : bool | None = None ,
500
- scope : OptionScope | None = None ,
501
- include_hooks : bool | None = None ,
502
- include_parents : bool | None = None ,
503
- values_only : t .Literal [False ] = False ,
504
- ) -> WindowOptionDict : ...
505
-
506
- def show_options (
507
- self ,
508
- g : bool | None = False ,
509
- scope : OptionScope | None = OptionScope .Window ,
510
- include_hooks : bool | None = None ,
511
- include_parents : bool | None = None ,
512
- values_only : bool | None = False ,
513
- ) -> WindowOptionDict | list [str ]:
514
- """Return a dict of options for the window.
515
-
516
- Parameters
517
- ----------
518
- g : str, optional
519
- Pass ``-g`` flag for global variable, default False.
520
- """
521
- tmux_args : tuple [str , ...] = ()
522
-
523
- if g :
524
- tmux_args += ("-g" ,)
525
-
526
- if scope is not None :
527
- assert scope in OPTION_SCOPE_FLAG_MAP
528
- tmux_args += (OPTION_SCOPE_FLAG_MAP [scope ],)
529
-
530
- if include_parents is not None and include_parents :
531
- tmux_args += ("-A" ,)
532
-
533
- if include_hooks is not None and include_hooks :
534
- tmux_args += ("-H" ,)
535
-
536
- if values_only is not None and values_only :
537
- tmux_args += ("-v" ,)
538
-
539
- cmd = self .cmd ("show-options" , * tmux_args )
540
-
541
- output = cmd .stdout
542
-
543
- # The shlex.split function splits the args at spaces, while also
544
- # retaining quoted sub-strings.
545
- # shlex.split('this is "a test"') => ['this', 'is', 'a test']
546
-
547
- window_options : WindowOptionDict = {}
548
- for item in output :
549
- try :
550
- key , val = shlex .split (item )
551
- except ValueError :
552
- logger .exception (f"Error extracting option: { item } " )
553
- assert isinstance (key , str )
554
- assert isinstance (val , str )
555
-
556
- if isinstance (val , str ) and val .isdigit ():
557
- window_options [key ] = int (val )
558
-
559
- return window_options
560
-
561
- def show_option (
562
- self ,
563
- option : str ,
564
- g : bool = False ,
565
- scope : OptionScope | None = OptionScope .Window ,
566
- include_hooks : bool | None = None ,
567
- include_parents : bool | None = None ,
568
- ) -> str | int | None :
569
- """Return option value for the target window.
570
-
571
- todo: test and return True/False for on/off string
572
-
573
- Parameters
574
- ----------
575
- option : str
576
- g : bool, optional
577
- Pass ``-g`` flag, global. Default False.
578
-
579
- Raises
580
- ------
581
- :exc:`exc.OptionError`, :exc:`exc.UnknownOption`,
582
- :exc:`exc.InvalidOption`, :exc:`exc.AmbiguousOption`
583
- """
584
- tmux_args : tuple [str | int , ...] = ()
585
-
586
- if g :
587
- tmux_args += ("-g" ,)
588
-
589
- if scope is not None :
590
- assert scope in OPTION_SCOPE_FLAG_MAP
591
- tmux_args += (OPTION_SCOPE_FLAG_MAP [scope ],)
592
-
593
- if include_parents is not None and include_parents :
594
- tmux_args += ("-A" ,)
595
-
596
- if include_hooks is not None and include_hooks :
597
- tmux_args += ("-H" ,)
598
-
599
- tmux_args += (option ,)
600
-
601
- cmd = self .cmd ("show-options" , * tmux_args )
602
-
603
- if len (cmd .stderr ):
604
- handle_option_error (cmd .stderr [0 ])
605
-
606
- window_options_output = cmd .stdout
607
-
608
- if not len (window_options_output ):
609
- return None
610
-
611
- value_raw = next (shlex .split (item ) for item in window_options_output )
612
-
613
- value : str | int = int (value_raw [1 ]) if value_raw [1 ].isdigit () else value_raw [1 ]
614
-
615
- return value
616
-
617
394
def rename_window (self , new_name : str ) -> Window :
618
395
"""Rename window.
619
396
@@ -632,8 +409,6 @@ def rename_window(self, new_name: str) -> Window:
632
409
>>> window.rename_window('New name')
633
410
Window(@1 1:New name, Session($1 ...))
634
411
"""
635
- import shlex
636
-
637
412
lex = shlex .shlex (new_name )
638
413
lex .escape = " "
639
414
lex .whitespace_split = False
0 commit comments