@@ -42,6 +42,18 @@ def get_cwd():
42
42
return os .getcwd ()
43
43
44
44
45
+ def tmuxp_echo (message = None , log_level = 'INFO' , style_log = False , ** click_kwargs ):
46
+ """
47
+ Combines logging.log and click.echo
48
+ """
49
+ if style_log :
50
+ logger .log (log .LOG_LEVELS [log_level ], message )
51
+ else :
52
+ logger .log (log .LOG_LEVELS [log_level ], click .unstyle (message ))
53
+
54
+ click .echo (message , ** click_kwargs )
55
+
56
+
45
57
def get_config_dir ():
46
58
"""
47
59
Return tmuxp configuration directory.
@@ -246,8 +258,8 @@ def scan_config_argument(ctx, param, value, config_dir=None):
246
258
config_dir = config_dir ()
247
259
248
260
if not config :
249
- click . echo ("Enter at least one CONFIG" )
250
- click . echo (ctx .get_help (), color = ctx .color )
261
+ tmuxp_echo ("Enter at least one CONFIG" )
262
+ tmuxp_echo (ctx .get_help (), color = ctx .color )
251
263
ctx .exit ()
252
264
253
265
if isinstance (value , string_types ):
@@ -357,11 +369,14 @@ def scan_config(config, config_dir=None):
357
369
]
358
370
359
371
if len (candidates ) > 1 :
360
- click .secho (
361
- 'Multiple .tmuxp.{yml,yaml,json} configs in %s' % dirname (config ),
362
- fg = "red" ,
372
+ tmuxp_echo (
373
+ click .style (
374
+ 'Multiple .tmuxp.{yml,yaml,json} configs in %s'
375
+ % dirname (config ),
376
+ fg = "red" ,
377
+ )
363
378
)
364
- click . echo (
379
+ tmuxp_echo (
365
380
click .wrap_text (
366
381
'This is undefined behavior, use only one. '
367
382
'Use file names e.g. myproject.json, coolproject.yaml. '
@@ -505,6 +520,11 @@ def load_workspace(
505
520
# get the canonical path, eliminating any symlinks
506
521
config_file = os .path .realpath (config_file )
507
522
523
+ tmuxp_echo (
524
+ click .style ('[Loading] ' , fg = 'green' )
525
+ + click .style (config_file , fg = 'blue' , bold = True )
526
+ )
527
+
508
528
# kaptan allows us to open a yaml or json file as a dict
509
529
sconfig = kaptan .Kaptan ()
510
530
sconfig = sconfig .import_config (config_file ).get ()
@@ -525,7 +545,7 @@ def load_workspace(
525
545
try : # load WorkspaceBuilder object for tmuxp config / tmux server
526
546
builder = WorkspaceBuilder (sconf = sconfig , server = t )
527
547
except exc .EmptyConfigException :
528
- click . echo ('%s is empty or parsed no config data' % config_file , err = True )
548
+ tmuxp_echo ('%s is empty or parsed no config data' % config_file , err = True )
529
549
return
530
550
531
551
session_name = sconfig ['session_name' ]
@@ -545,11 +565,6 @@ def load_workspace(
545
565
return
546
566
547
567
try :
548
- click .echo (
549
- click .style ('[Loading] ' , fg = 'green' )
550
- + click .style (config_file , fg = 'blue' , bold = True )
551
- )
552
-
553
568
builder .build () # load tmux session via workspace builder
554
569
555
570
if 'TMUX' in os .environ : # tmuxp ran from inside tmux
@@ -586,8 +601,8 @@ def load_workspace(
586
601
except exc .TmuxpException as e :
587
602
import traceback
588
603
589
- click . echo (traceback .format_exc (), err = True )
590
- click . echo (e , err = True )
604
+ tmuxp_echo (traceback .format_exc (), err = True )
605
+ tmuxp_echo (e , err = True )
591
606
592
607
choice = click .prompt (
593
608
'Error loading workspace. (k)ill, (a)ttach, (d)etach?' ,
@@ -597,7 +612,7 @@ def load_workspace(
597
612
598
613
if choice == 'k' :
599
614
builder .session .kill_session ()
600
- click . echo ('Session killed.' )
615
+ tmuxp_echo ('Session killed.' )
601
616
elif choice == 'a' :
602
617
if 'TMUX' in os .environ :
603
618
builder .session .switch_client ()
@@ -612,7 +627,7 @@ def load_workspace(
612
627
@click .group (context_settings = {'obj' : {}})
613
628
@click .version_option (__version__ , '-V' , '--version' , message = '%(prog)s %(version)s' )
614
629
@click .option (
615
- '--log_level ' ,
630
+ '--log-level ' ,
616
631
default = 'INFO' ,
617
632
help = 'Log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)' ,
618
633
)
@@ -625,12 +640,12 @@ def cli(log_level):
625
640
try :
626
641
has_minimum_version ()
627
642
except TmuxCommandNotFound :
628
- click . echo ('tmux not found. tmuxp requires you install tmux first.' )
643
+ tmuxp_echo ('tmux not found. tmuxp requires you install tmux first.' )
629
644
sys .exit ()
630
645
except exc .TmuxpException as e :
631
- click . echo (e , err = True )
646
+ tmuxp_echo (e , err = True )
632
647
sys .exit ()
633
- setup_logger (level = log_level .upper ())
648
+ setup_logger (logger = logger , level = log_level .upper ())
634
649
635
650
636
651
def setup_logger (logger = None , level = 'INFO' ):
@@ -649,12 +664,12 @@ def setup_logger(logger=None, level='INFO'):
649
664
logger = logging .getLogger ()
650
665
651
666
if not logger .handlers : # setup logger handlers
652
- channel = logging .StreamHandler ()
653
- channel .setFormatter (log .DebugLogFormatter ())
654
-
667
+ # channel = logging.StreamHandler()
668
+ # channel.setFormatter(log.DebugLogFormatter())
655
669
# channel.setFormatter(log.LogFormatter())
670
+
656
671
logger .setLevel (level )
657
- logger .addHandler (channel )
672
+ # logger.addHandler(channel)
658
673
659
674
660
675
def startup (config_dir ):
@@ -875,6 +890,7 @@ def command_freeze(session_name, socket_name, socket_path, force):
875
890
flag_value = 88 ,
876
891
help = 'Like -2, but indicates that the terminal supports 88 colours.' ,
877
892
)
893
+ @click .option ('--log-file' , help = 'File to log errors/output to' )
878
894
def command_load (
879
895
ctx ,
880
896
config ,
@@ -884,6 +900,7 @@ def command_load(
884
900
answer_yes ,
885
901
detached ,
886
902
colors ,
903
+ log_file ,
887
904
):
888
905
"""Load a tmux workspace from each CONFIG.
889
906
@@ -908,6 +925,10 @@ def command_load(
908
925
detached mode.
909
926
"""
910
927
util .oh_my_zsh_auto_title ()
928
+ if log_file :
929
+ logfile_handler = logging .FileHandler (log_file )
930
+ logfile_handler .setFormatter (log .LogFormatter ())
931
+ logger .addHandler (logfile_handler )
911
932
912
933
tmux_options = {
913
934
'socket_name' : socket_name ,
@@ -919,8 +940,8 @@ def command_load(
919
940
}
920
941
921
942
if not config :
922
- click . echo ("Enter at least one CONFIG" )
923
- click . echo (ctx .get_help (), color = ctx .color )
943
+ tmuxp_echo ("Enter at least one CONFIG" )
944
+ tmuxp_echo (ctx .get_help (), color = ctx .color )
924
945
ctx .exit ()
925
946
926
947
if isinstance (config , string_types ):
@@ -962,7 +983,7 @@ def import_config(configfile, importfunc):
962
983
else :
963
984
sys .exit ('Unknown config format.' )
964
985
965
- click . echo (
986
+ tmuxp_echo (
966
987
newconfig + '---------------------------------------------------------------'
967
988
'\n '
968
989
'Configuration import does its best to convert files.\n '
@@ -984,9 +1005,9 @@ def import_config(configfile, importfunc):
984
1005
buf .write (newconfig )
985
1006
buf .close ()
986
1007
987
- click . echo ('Saved to %s.' % dest )
1008
+ tmuxp_echo ('Saved to %s.' % dest )
988
1009
else :
989
- click . echo (
1010
+ tmuxp_echo (
990
1011
'tmuxp has examples in JSON and YAML format at '
991
1012
'<http://tmuxp.git-pull.com/examples.html>\n '
992
1013
'View tmuxp docs at <http://tmuxp.git-pull.com/>'
@@ -1125,4 +1146,4 @@ def format_tmux_resp(std_resp):
1125
1146
% format_tmux_resp (tmux_cmd ('show-window-options' , '-g' )),
1126
1147
]
1127
1148
1128
- click . echo ('\n ' .join (output ))
1149
+ tmuxp_echo ('\n ' .join (output ))
0 commit comments