@@ -535,57 +535,78 @@ def _strip_ansi(text):
535535 # Show welcome message
536536 print (WELCOME_MESSAGE )
537537
538- # Show Group header (to match normal help output)
539538 print ("\n Group" )
540539 print (" az" )
541540
541+ # Import knack's formatting functions
542+ from knack .help import _print_indent , FIRST_LINE_PREFIX , _get_hanging_indent
543+
542544 # Separate groups and commands
543- groups = help_index .get ('groups' , {})
544- commands = help_index .get ('commands' , {})
545+ groups_data = help_index .get ('groups' , {})
546+ commands_data = help_index .get ('commands' , {})
547+
548+ # Helper function matching knack's _get_line_len
549+ def _get_line_len (name , tags ):
550+ tags_len = len (_strip_ansi (tags ))
551+ return len (name ) + tags_len + (2 if tags_len else 1 )
552+
553+ # Helper function matching knack's _get_padding_len
554+ def _get_padding_len (max_len , name , tags ):
555+ line_len = _get_line_len (name , tags )
556+ if tags :
557+ pad_len = max_len - line_len + 1
558+ else :
559+ pad_len = max_len - line_len
560+ return pad_len
545561
546- # Display subgroups
547- if groups :
562+ # Build items lists and calculate max_line_len across ALL items (groups + commands)
563+ # This ensures colons align across both sections
564+ max_line_len = 0
565+ groups_items = []
566+ for name in sorted (groups_data .keys ()):
567+ item = groups_data [name ]
568+ tags = item .get ('tags' , '' )
569+ groups_items .append ((name , tags , item .get ('summary' , '' )))
570+ max_line_len = max (max_line_len , _get_line_len (name , tags ))
571+
572+ commands_items = []
573+ for name in sorted (commands_data .keys ()):
574+ item = commands_data [name ]
575+ tags = item .get ('tags' , '' )
576+ commands_items .append ((name , tags , item .get ('summary' , '' )))
577+ max_line_len = max (max_line_len , _get_line_len (name , tags ))
578+
579+ # Display groups
580+ if groups_items :
548581 print ("\n Subgroups:" )
549- # Calculate max line length for groups only (matching knack's logic)
550- max_len = 0
551- for name , item in groups .items ():
552- tags = item .get ('tags' , '' )
553- tags_len = len (_strip_ansi (tags ))
554- line_len = len (name ) + tags_len + (2 if tags_len else 1 )
555- max_len = max (max_len , line_len )
556-
557- for name in sorted (groups .keys ()):
558- item = groups [name ]
559- tags = item .get ('tags' , '' )
560- summary = item .get ('summary' , '' )
561- # Calculate padding (matching knack's _get_padding_len logic)
562- tags_len = len (_strip_ansi (tags ))
563- line_len = len (name ) + tags_len + (2 if tags_len else 1 )
564- pad_len = max_len - line_len + (1 if tags else 0 )
565- padding = ' ' * pad_len
566- # Format matches knack: name + padding + tags + " : " + summary
567- print (f" { name } { padding } { tags } : { summary } " )
582+ indent = 1
583+ LINE_FORMAT = '{name}{padding}{tags}{separator}{summary}'
584+ for name , tags , summary in groups_items :
585+ padding = ' ' * _get_padding_len (max_line_len , name , tags )
586+ line = LINE_FORMAT .format (
587+ name = name ,
588+ padding = padding ,
589+ tags = tags ,
590+ separator = FIRST_LINE_PREFIX if summary else '' ,
591+ summary = summary
592+ )
593+ _print_indent (line , indent , _get_hanging_indent (max_line_len , indent ))
568594
569595 # Display commands
570- if commands :
596+ if commands_items :
571597 print ("\n Commands:" )
572- # Calculate max line length for commands only
573- max_len = 0
574- for name , item in commands .items ():
575- tags = item .get ('tags' , '' )
576- tags_len = len (_strip_ansi (tags ))
577- line_len = len (name ) + tags_len + (2 if tags_len else 1 )
578- max_len = max (max_len , line_len )
579-
580- for name in sorted (commands .keys ()):
581- item = commands [name ]
582- tags = item .get ('tags' , '' )
583- summary = item .get ('summary' , '' )
584- tags_len = len (_strip_ansi (tags ))
585- line_len = len (name ) + tags_len + (2 if tags_len else 1 )
586- pad_len = max_len - line_len + (1 if tags else 0 )
587- padding = ' ' * pad_len
588- print (f" { name } { padding } { tags } : { summary } " )
598+ indent = 1
599+ LINE_FORMAT = '{name}{padding}{tags}{separator}{summary}'
600+ for name , tags , summary in commands_items :
601+ padding = ' ' * _get_padding_len (max_line_len , name , tags )
602+ line = LINE_FORMAT .format (
603+ name = name ,
604+ padding = padding ,
605+ tags = tags ,
606+ separator = FIRST_LINE_PREFIX if summary else '' ,
607+ summary = summary
608+ )
609+ _print_indent (line , indent , _get_hanging_indent (max_line_len , indent ))
589610
590611 print ("\n To search AI knowledge base for examples, use: az find \" az \" " )
591612
0 commit comments