cmdr
Hex Artifact Content
Not logged in
Bounty program for improvements to Tcl and certain Tcl packages.
Tcl 2019 Conference, Houston/TX, US, Nov 4-8
Send your abstracts to tclconference@googlegroups.com
or submit via the online form by Sep 9.

Artifact 22ec78cd80157bde97cdfdf8dd67f360d335626d:


0000: 23 23 20 2d 2a 2d 20 74 63 6c 20 2d 2a 2d 0a 23  ## -*- tcl -*-.#
0010: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20   # ## ### ##### 
0020: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23  ######## #######
0030: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23  ###### #########
0040: 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 20  ############.## 
0050: 43 4d 44 52 20 2d 20 48 65 6c 70 20 2d 20 54 43  CMDR - Help - TC
0060: 4c 20 66 6f 72 6d 61 74 2e 20 4e 6f 74 20 61 76  L format. Not av
0070: 61 69 6c 61 62 6c 65 20 62 79 20 64 65 66 61 75  ailable by defau
0080: 6c 74 2e 0a 23 23 20 52 65 71 75 69 72 65 20 74  lt..## Require t
0090: 68 69 73 20 70 61 63 6b 61 67 65 20 62 65 66 6f  his package befo
00a0: 72 65 20 63 72 65 61 74 69 6f 6e 20 61 20 63 6f  re creation a co
00b0: 6d 6d 61 6e 64 65 72 2c 20 73 6f 20 74 68 61 74  mmander, so that
00c0: 20 74 68 65 0a 23 23 20 6d 64 72 3a 3a 68 65 6c   the.## mdr::hel
00d0: 70 20 68 65 75 72 69 73 74 69 63 73 20 73 65 65  p heuristics see
00e0: 20 61 6e 64 20 61 75 74 6f 6d 61 74 69 63 61 6c   and automatical
00f0: 6c 79 20 69 6e 74 65 67 72 61 74 65 20 74 68 65  ly integrate the
0100: 20 66 6f 72 6d 61 74 2e 0a 0a 23 20 40 40 20 4d   format...# @@ M
0110: 65 74 61 20 42 65 67 69 6e 0a 23 20 50 61 63 6b  eta Begin.# Pack
0120: 61 67 65 20 63 6d 64 72 3a 3a 68 65 6c 70 3a 3a  age cmdr::help::
0130: 74 63 6c 20 31 2e 30 2e 31 0a 23 20 4d 65 74 61  tcl 1.0.1.# Meta
0140: 20 61 75 74 68 6f 72 20 20 20 7b 41 6e 64 72 65   author   {Andre
0150: 61 73 20 4b 75 70 72 69 65 73 7d 0a 23 20 4d 65  as Kupries}.# Me
0160: 74 61 20 6c 6f 63 61 74 69 6f 6e 20 68 74 74 70  ta location http
0170: 73 3a 2f 2f 63 6f 72 65 2e 74 63 6c 2e 74 6b 2f  s://core.tcl.tk/
0180: 61 6b 75 70 72 69 65 73 2f 63 6d 64 72 0a 23 20  akupries/cmdr.# 
0190: 4d 65 74 61 20 70 6c 61 74 66 6f 72 6d 20 74 63  Meta platform tc
01a0: 6c 0a 23 20 4d 65 74 61 20 73 75 6d 6d 61 72 79  l.# Meta summary
01b0: 20 20 20 20 20 46 6f 72 6d 61 74 74 69 6e 67 20       Formatting 
01c0: 68 65 6c 70 20 61 73 20 54 43 4c 20 64 61 74 61  help as TCL data
01d0: 20 73 74 72 75 63 74 75 72 65 20 28 6e 65 73 74   structure (nest
01e0: 65 64 20 64 69 63 74 2f 6c 69 73 74 29 2e 0a 23  ed dict/list)..#
01f0: 20 4d 65 74 61 20 64 65 73 63 72 69 70 74 69 6f   Meta descriptio
0200: 6e 20 46 6f 72 6d 61 74 74 69 6e 67 20 68 65 6c  n Formatting hel
0210: 70 20 61 73 20 54 43 4c 20 64 61 74 61 20 73 74  p as TCL data st
0220: 72 75 63 74 75 72 65 20 28 6e 65 73 74 65 64 20  ructure (nested 
0230: 64 69 63 74 2f 6c 69 73 74 29 2e 0a 23 20 4d 65  dict/list)..# Me
0240: 74 61 20 73 75 62 6a 65 63 74 20 7b 63 6f 6d 6d  ta subject {comm
0250: 61 6e 64 20 6c 69 6e 65 7d 0a 23 20 4d 65 74 61  and line}.# Meta
0260: 20 72 65 71 75 69 72 65 20 7b 54 63 6c 20 38 2e   require {Tcl 8.
0270: 35 2d 7d 0a 23 20 4d 65 74 61 20 72 65 71 75 69  5-}.# Meta requi
0280: 72 65 20 64 65 62 75 67 0a 23 20 4d 65 74 61 20  re debug.# Meta 
0290: 72 65 71 75 69 72 65 20 64 65 62 75 67 3a 3a 63  require debug::c
02a0: 61 6c 6c 65 72 0a 23 20 4d 65 74 61 20 72 65 71  aller.# Meta req
02b0: 75 69 72 65 20 7b 63 6d 64 72 3a 3a 68 65 6c 70  uire {cmdr::help
02c0: 20 31 7d 0a 23 20 4d 65 74 61 20 72 65 71 75 69   1}.# Meta requi
02d0: 72 65 20 7b 63 6d 64 72 3a 3a 75 74 69 6c 20 31  re {cmdr::util 1
02e0: 7d 0a 23 20 40 40 20 4d 65 74 61 20 45 6e 64 0a  }.# @@ Meta End.
02f0: 0a 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23  .# # ## ### ####
0300: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23  # ######## #####
0310: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23  ######## #######
0320: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23  ##############.#
0330: 23 20 52 65 71 75 69 73 69 74 65 73 0a 0a 70 61  # Requisites..pa
0340: 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 54 63  ckage require Tc
0350: 6c 20 38 2e 35 0a 70 61 63 6b 61 67 65 20 72 65  l 8.5.package re
0360: 71 75 69 72 65 20 64 65 62 75 67 0a 70 61 63 6b  quire debug.pack
0370: 61 67 65 20 72 65 71 75 69 72 65 20 64 65 62 75  age require debu
0380: 67 3a 3a 63 61 6c 6c 65 72 0a 70 61 63 6b 61 67  g::caller.packag
0390: 65 20 72 65 71 75 69 72 65 20 63 6d 64 72 3a 3a  e require cmdr::
03a0: 68 65 6c 70 20 31 0a 70 61 63 6b 61 67 65 20 72  help 1.package r
03b0: 65 71 75 69 72 65 20 63 6d 64 72 3a 3a 75 74 69  equire cmdr::uti
03c0: 6c 20 31 0a 0a 23 20 23 20 23 23 20 23 23 23 20  l 1..# # ## ### 
03d0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23  ##### ######## #
03e0: 23 23 23 23 23 23 23 23 23 23 23 23 20 23 23 23  ############ ###
03f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0400: 23 23 0a 0a 64 65 62 75 67 20 64 65 66 69 6e 65  ##..debug define
0410: 20 63 6d 64 72 2f 68 65 6c 70 2f 74 63 6c 0a 64   cmdr/help/tcl.d
0420: 65 62 75 67 20 6c 65 76 65 6c 20 20 63 6d 64 72  ebug level  cmdr
0430: 2f 68 65 6c 70 2f 74 63 6c 0a 64 65 62 75 67 20  /help/tcl.debug 
0440: 70 72 65 66 69 78 20 63 6d 64 72 2f 68 65 6c 70  prefix cmdr/help
0450: 2f 74 63 6c 20 7b 5b 64 65 62 75 67 20 63 61 6c  /tcl {[debug cal
0460: 6c 65 72 5d 20 7c 20 7d 0a 0a 23 20 23 20 23 23  ler] | }..# # ##
0470: 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23   ### ##### #####
0480: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23  ### ############
0490: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23  # ##############
04a0: 23 23 23 23 23 23 23 0a 23 23 20 44 65 66 69 6e  #######.## Defin
04b0: 69 74 69 6f 6e 0a 0a 23 20 23 20 23 23 20 23 23  ition..# # ## ##
04c0: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23  # ##### ########
04d0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20 23   ############# #
04e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
04f0: 23 23 23 23 0a 0a 6e 61 6d 65 73 70 61 63 65 20  ####..namespace 
0500: 65 76 61 6c 20 3a 3a 63 6d 64 72 3a 3a 68 65 6c  eval ::cmdr::hel
0510: 70 3a 3a 66 6f 72 6d 61 74 20 7b 0a 20 20 20 20  p::format {.    
0520: 6e 61 6d 65 73 70 61 63 65 20 65 78 70 6f 72 74  namespace export
0530: 20 74 63 6c 0a 20 20 20 20 6e 61 6d 65 73 70 61   tcl.    namespa
0540: 63 65 20 65 6e 73 65 6d 62 6c 65 20 63 72 65 61  ce ensemble crea
0550: 74 65 0a 0a 20 20 20 20 6e 61 6d 65 73 70 61 63  te..    namespac
0560: 65 20 69 6d 70 6f 72 74 20 3a 3a 63 6d 64 72 3a  e import ::cmdr:
0570: 3a 68 65 6c 70 3a 3a 71 75 65 72 79 0a 7d 0a 0a  :help::query.}..
0580: 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23  # # ## ### #####
0590: 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23   ######## ######
05a0: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23  ####### ########
05b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a 70  #############..p
05c0: 72 6f 63 20 3a 3a 63 6d 64 72 3a 3a 68 65 6c 70  roc ::cmdr::help
05d0: 3a 3a 66 6f 72 6d 61 74 3a 3a 74 63 6c 20 7b 72  ::format::tcl {r
05e0: 6f 6f 74 20 77 69 64 74 68 20 68 65 6c 70 7d 20  oot width help} 
05f0: 7b 0a 20 20 20 20 64 65 62 75 67 2e 63 6d 64 72  {.    debug.cmdr
0600: 2f 68 65 6c 70 2f 74 63 6c 20 7b 7d 0a 20 20 20  /help/tcl {}.   
0610: 20 23 20 68 65 6c 70 20 3d 20 64 69 63 74 20 28   # help = dict (
0620: 6e 61 6d 65 20 2d 3e 20 63 6f 6d 6d 61 6e 64 29  name -> command)
0630: 0a 0a 20 20 20 20 23 20 53 74 65 70 20 31 2e 20  ..    # Step 1. 
0640: 43 6f 6d 6d 61 6e 64 20 6d 61 70 70 69 6e 67 2e  Command mapping.
0650: 0a 20 20 20 20 73 65 74 20 63 6f 6d 6d 61 6e 64  .    set command
0660: 73 20 7b 7d 0a 20 20 20 20 64 69 63 74 20 66 6f  s {}.    dict fo
0670: 72 20 7b 63 6d 64 20 64 65 73 63 7d 20 24 68 65  r {cmd desc} $he
0680: 6c 70 20 7b 0a 09 6c 61 70 70 65 6e 64 20 63 6f  lp {..lappend co
0690: 6d 6d 61 6e 64 73 20 24 63 6d 64 20 5b 54 43 4c  mmands $cmd [TCL
06a0: 20 24 64 65 73 63 5d 0a 20 20 20 20 7d 0a 0a 20   $desc].    }.. 
06b0: 20 20 20 23 20 53 74 65 70 20 32 2e 20 53 65 63     # Step 2. Sec
06c0: 74 69 6f 6e 20 54 72 65 65 2e 20 54 68 69 73 20  tion Tree. This 
06d0: 69 73 20 76 65 72 79 20 73 69 6d 69 6c 61 72 20  is very similar 
06e0: 74 6f 0a 20 20 20 20 23 20 63 6d 64 72 3a 3a 68  to.    # cmdr::h
06f0: 65 6c 70 3a 3a 66 6f 72 6d 61 74 3a 3a 62 79 2d  elp::format::by-
0700: 63 61 74 65 67 6f 72 79 2c 20 61 6e 64 20 72 65  category, and re
0710: 2d 75 73 65 73 20 69 74 73 20 66 72 6f 6e 74 65  -uses its fronte
0720: 6e 64 20 68 65 6c 70 65 72 0a 20 20 20 20 23 20  nd helper.    # 
0730: 63 6f 6d 6d 61 6e 64 73 2e 0a 0a 20 20 20 20 6c  commands...    l
0740: 61 73 73 69 67 6e 20 5b 53 65 63 74 69 6f 6e 54  assign [SectionT
0750: 72 65 65 20 24 68 65 6c 70 20 5c 30 30 30 20 30  ree $help \000 0
0760: 5d 20 73 75 62 63 20 63 6d 64 73 0a 20 20 20 20  ] subc cmds.    
0770: 66 6f 72 65 61 63 68 20 63 20 5b 53 65 63 74 69  foreach c [Secti
0780: 6f 6e 4f 72 64 65 72 20 24 72 6f 6f 74 20 24 73  onOrder $root $s
0790: 75 62 63 5d 20 7b 0a 09 6c 61 70 70 65 6e 64 20  ubc] {..lappend 
07a0: 73 65 63 74 69 6f 6e 73 20 5b 54 43 4c 3a 3a 61  sections [TCL::a
07b0: 63 61 74 65 67 6f 72 79 20 5b 3a 3a 6c 69 73 74  category [::list
07c0: 20 24 63 5d 20 24 63 6d 64 73 20 24 73 75 62 63   $c] $cmds $subc
07d0: 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74  ].    }..    ret
07e0: 75 72 6e 20 5b 64 69 63 74 20 63 72 65 61 74 65  urn [dict create
07f0: 20 5c 0a 09 09 63 6f 6d 6d 61 6e 64 73 20 24 63   \...commands $c
0800: 6f 6d 6d 61 6e 64 73 20 5c 0a 09 09 73 65 63 74  ommands \...sect
0810: 69 6f 6e 73 20 24 73 65 63 74 69 6f 6e 73 5d 0a  ions $sections].
0820: 7d 0a 0a 23 20 23 20 23 23 20 23 23 23 20 23 23  }..# # ## ### ##
0830: 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23  ### ######## ###
0840: 23 23 23 23 23 23 23 23 23 23 20 23 23 23 23 23  ########## #####
0850: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0860: 0a 0a 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c  ..namespace eval
0870: 20 3a 3a 63 6d 64 72 3a 3a 68 65 6c 70 3a 3a 66   ::cmdr::help::f
0880: 6f 72 6d 61 74 3a 3a 54 43 4c 20 7b 7d 0a 0a 70  ormat::TCL {}..p
0890: 72 6f 63 20 3a 3a 63 6d 64 72 3a 3a 68 65 6c 70  roc ::cmdr::help
08a0: 3a 3a 66 6f 72 6d 61 74 3a 3a 54 43 4c 3a 3a 61  ::format::TCL::a
08b0: 63 61 74 65 67 6f 72 79 20 7b 70 61 74 68 20 63  category {path c
08c0: 6d 64 73 20 73 75 62 63 7d 20 7b 0a 20 20 20 20  mds subc} {.    
08d0: 73 65 74 20 6e 61 6d 65 20 5b 6c 69 6e 64 65 78  set name [lindex
08e0: 20 24 70 61 74 68 20 65 6e 64 5d 0a 0a 20 20 20   $path end]..   
08f0: 20 23 20 57 69 74 68 20 73 74 72 75 63 74 3a 3a   # With struct::
0900: 6c 69 73 74 20 6d 61 70 20 77 65 20 63 6f 75 6c  list map we coul
0910: 64 20 74 68 65 6e 20 61 6c 73 6f 20 72 65 2d 75  d then also re-u
0920: 73 65 20 61 6c 69 73 74 2e 0a 20 20 20 20 73 65  se alist..    se
0930: 74 20 63 6f 6d 6d 61 6e 64 73 20 7b 7d 0a 20 20  t commands {}.  
0940: 20 20 69 66 20 7b 5b 64 69 63 74 20 65 78 69 73    if {[dict exis
0950: 74 73 20 24 63 6d 64 73 20 24 70 61 74 68 5d 7d  ts $cmds $path]}
0960: 20 7b 0a 09 66 6f 72 65 61 63 68 20 64 65 66 20   {..foreach def 
0970: 5b 6c 73 6f 72 74 20 2d 64 69 63 74 20 2d 75 6e  [lsort -dict -un
0980: 69 71 75 65 20 5b 64 69 63 74 20 67 65 74 20 24  ique [dict get $
0990: 63 6d 64 73 20 24 70 61 74 68 5d 5d 20 7b 0a 09  cmds $path]] {..
09a0: 20 20 20 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d      lappend comm
09b0: 61 6e 64 73 20 5b 6c 69 6e 64 65 78 20 24 64 65  ands [lindex $de
09c0: 66 20 30 5d 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  f 0]..}.    }.. 
09d0: 20 20 20 73 65 74 20 73 65 63 74 69 6f 6e 73 20     set sections 
09e0: 7b 7d 0a 20 20 20 20 69 66 20 7b 5b 64 69 63 74  {}.    if {[dict
09f0: 20 65 78 69 73 74 73 20 24 73 75 62 63 20 24 70   exists $subc $p
0a00: 61 74 68 5d 7d 20 7b 0a 09 23 20 41 64 64 20 74  ath]} {..# Add t
0a10: 68 65 20 73 75 62 2d 63 61 74 65 67 6f 72 69 65  he sub-categorie
0a20: 73 2c 20 69 66 20 61 6e 79 2e 0a 09 66 6f 72 65  s, if any...fore
0a30: 61 63 68 20 63 20 5b 6c 73 6f 72 74 20 2d 64 69  ach c [lsort -di
0a40: 63 74 20 2d 75 6e 69 71 75 65 20 5b 64 69 63 74  ct -unique [dict
0a50: 20 67 65 74 20 24 73 75 62 63 20 24 70 61 74 68   get $subc $path
0a60: 5d 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e  ]] {..    lappen
0a70: 64 20 73 65 63 74 69 6f 6e 73 20 5b 61 63 61 74  d sections [acat
0a80: 65 67 6f 72 79 20 5b 6c 69 6e 73 65 72 74 20 24  egory [linsert $
0a90: 70 61 74 68 20 65 6e 64 20 24 63 5d 20 24 63 6d  path end $c] $cm
0aa0: 64 73 20 24 73 75 62 63 5d 0a 09 7d 0a 20 20 20  ds $subc]..}.   
0ab0: 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 5b   }..    return [
0ac0: 64 69 63 74 20 63 72 65 61 74 65 20 5c 0a 09 09  dict create \...
0ad0: 6e 61 6d 65 20 20 20 20 20 24 6e 61 6d 65 20 5c  name     $name \
0ae0: 0a 09 09 63 6f 6d 6d 61 6e 64 73 20 24 63 6f 6d  ...commands $com
0af0: 6d 61 6e 64 73 20 5c 0a 09 09 73 65 63 74 69 6f  mands \...sectio
0b00: 6e 73 20 24 73 65 63 74 69 6f 6e 73 5d 0a 7d 0a  ns $sections].}.
0b10: 0a 70 72 6f 63 20 3a 3a 63 6d 64 72 3a 3a 68 65  .proc ::cmdr::he
0b20: 6c 70 3a 3a 66 6f 72 6d 61 74 3a 3a 54 43 4c 20  lp::format::TCL 
0b30: 7b 63 6f 6d 6d 61 6e 64 7d 20 7b 0a 20 20 20 20  {command} {.    
0b40: 23 20 44 61 74 61 20 73 74 72 75 63 74 75 72 65  # Data structure
0b50: 3a 20 73 65 65 20 63 6f 6e 66 69 67 2e 74 63 6c  : see config.tcl
0b60: 2c 20 20 6d 65 74 68 6f 64 20 27 68 65 6c 70 27  ,  method 'help'
0b70: 2e 0a 20 20 20 20 23 20 44 61 74 61 20 73 74 72  ..    # Data str
0b80: 75 63 74 75 72 65 3a 20 73 65 65 20 70 72 69 76  ucture: see priv
0b90: 61 74 65 2e 74 63 6c 2c 20 6d 65 74 68 6f 64 20  ate.tcl, method 
0ba0: 27 68 65 6c 70 27 2e 0a 0a 20 20 20 20 64 69 63  'help'...    dic
0bb0: 74 20 77 69 74 68 20 63 6f 6d 6d 61 6e 64 20 7b  t with command {
0bc0: 7d 0a 20 20 20 20 23 20 2d 3e 20 61 63 74 69 6f  }.    # -> actio
0bd0: 6e 2c 20 64 65 73 63 2c 20 6f 70 74 69 6f 6e 73  n, desc, options
0be0: 2c 20 61 72 67 75 6d 65 6e 74 73 2c 20 70 61 72  , arguments, par
0bf0: 61 6d 65 74 65 72 73 2c 20 73 74 61 74 65 73 2c  ameters, states,
0c00: 20 73 65 63 74 69 6f 6e 73 0a 0a 20 20 20 20 69   sections..    i
0c10: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
0c20: 61 63 74 69 6f 6e 5d 7d 20 7b 0a 09 23 20 4d 69  action]} {..# Mi
0c30: 73 73 69 6e 67 20 66 6f 72 20 6f 66 66 69 63 65  ssing for office
0c40: 72 73 2e 0a 09 6c 61 70 70 65 6e 64 20 64 69 63  rs...lappend dic
0c50: 74 20 61 63 74 69 6f 6e 20 24 61 63 74 69 6f 6e  t action $action
0c60: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 61 70 70 65  .    }.    lappe
0c70: 6e 64 20 64 69 63 74 20 61 72 67 75 6d 65 6e 74  nd dict argument
0c80: 73 20 20 20 24 61 72 67 75 6d 65 6e 74 73 0a 20  s   $arguments. 
0c90: 20 20 20 6c 61 70 70 65 6e 64 20 64 69 63 74 20     lappend dict 
0ca0: 64 65 73 63 72 69 70 74 69 6f 6e 20 5b 54 43 4c  description [TCL
0cb0: 3a 3a 61 73 74 72 69 6e 67 20 24 64 65 73 63 5d  ::astring $desc]
0cc0: 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 64 69 63  .    lappend dic
0cd0: 74 20 6f 70 74 32 70 61 72 61 20 20 20 20 5b 3a  t opt2para    [:
0ce0: 3a 63 6d 64 72 20 75 74 69 6c 20 64 69 63 74 73  :cmdr util dicts
0cf0: 6f 72 74 20 24 6f 70 74 32 70 61 72 61 5d 0a 20  ort $opt2para]. 
0d00: 20 20 20 6c 61 70 70 65 6e 64 20 64 69 63 74 20     lappend dict 
0d10: 6f 70 74 69 6f 6e 73 20 20 20 20 20 5b 3a 3a 63  options     [::c
0d20: 6d 64 72 20 75 74 69 6c 20 64 69 63 74 73 6f 72  mdr util dictsor
0d30: 74 20 24 6f 70 74 69 6f 6e 73 5d 0a 20 20 20 20  t $options].    
0d40: 6c 61 70 70 65 6e 64 20 64 69 63 74 20 70 61 72  lappend dict par
0d50: 61 6d 65 74 65 72 73 20 20 5b 54 43 4c 3a 3a 70  ameters  [TCL::p
0d60: 61 72 61 6d 65 74 65 72 73 20 24 70 61 72 61 6d  arameters $param
0d70: 65 74 65 72 73 5d 0a 20 20 20 20 6c 61 70 70 65  eters].    lappe
0d80: 6e 64 20 64 69 63 74 20 73 65 63 74 69 6f 6e 73  nd dict sections
0d90: 20 20 20 20 24 73 65 63 74 69 6f 6e 73 0a 20 20      $sections.  
0da0: 20 20 6c 61 70 70 65 6e 64 20 64 69 63 74 20 73    lappend dict s
0db0: 74 61 74 65 73 20 20 20 20 20 20 24 73 74 61 74  tates      $stat
0dc0: 65 73 0a 20 20 20 20 0a 20 20 20 20 72 65 74 75  es.    .    retu
0dd0: 72 6e 20 24 64 69 63 74 0a 7d 0a 0a 70 72 6f 63  rn $dict.}..proc
0de0: 20 3a 3a 63 6d 64 72 3a 3a 68 65 6c 70 3a 3a 66   ::cmdr::help::f
0df0: 6f 72 6d 61 74 3a 3a 54 43 4c 3a 3a 70 61 72 61  ormat::TCL::para
0e00: 6d 65 74 65 72 73 20 7b 70 61 72 61 6d 65 74 65  meters {paramete
0e10: 72 73 7d 20 7b 0a 20 20 20 20 73 65 74 20 64 69  rs} {.    set di
0e20: 63 74 20 7b 7d 0a 20 20 20 20 66 6f 72 65 61 63  ct {}.    foreac
0e30: 68 20 7b 6e 61 6d 65 20 64 65 66 7d 20 5b 3a 3a  h {name def} [::
0e40: 63 6d 64 72 20 75 74 69 6c 20 64 69 63 74 73 6f  cmdr util dictso
0e50: 72 74 20 24 70 61 72 61 6d 65 74 65 72 73 5d 20  rt $parameters] 
0e60: 7b 0a 09 73 65 74 20 74 6d 70 20 7b 7d 0a 09 66  {..set tmp {}..f
0e70: 6f 72 65 61 63 68 20 7b 78 6e 61 6d 65 20 78 64  oreach {xname xd
0e80: 65 66 7d 20 5b 3a 3a 63 6d 64 72 20 75 74 69 6c  ef} [::cmdr util
0e90: 20 64 69 63 74 73 6f 72 74 20 24 64 65 66 5d 20   dictsort $def] 
0ea0: 7b 0a 09 20 20 20 20 73 77 69 74 63 68 20 2d 67  {..    switch -g
0eb0: 6c 6f 62 20 2d 2d 20 24 78 6e 61 6d 65 20 7b 0a  lob -- $xname {.
0ec0: 09 09 63 6d 64 6c 69 6e 65 20 2d 0a 09 09 64 65  ..cmdline -...de
0ed0: 66 65 72 65 64 20 2d 0a 09 09 64 6f 63 75 6d 65  fered -...docume
0ee0: 6e 74 65 64 20 2d 0a 09 09 69 6e 74 65 72 61 63  nted -...interac
0ef0: 74 69 76 65 20 2d 0a 09 09 69 73 62 6f 6f 6c 20  tive -...isbool 
0f00: 2d 0a 09 09 6c 69 73 74 20 2d 0a 09 09 6f 72 64  -...list -...ord
0f10: 65 72 65 64 20 2d 0a 09 09 70 72 65 73 65 6e 63  ered -...presenc
0f20: 65 20 2d 0a 09 09 72 65 71 75 69 72 65 64 20 2d  e -...required -
0f30: 0a 09 09 40 62 6f 6f 6c 20 7b 0a 09 09 20 20 20  ...@bool {...   
0f40: 20 23 20 6e 6f 72 6d 61 6c 69 7a 65 20 74 6f 20   # normalize to 
0f50: 62 6f 6f 6c 65 61 6e 0a 09 09 20 20 20 20 73 65  boolean...    se
0f60: 74 20 76 61 6c 75 65 20 5b 65 78 70 72 20 7b 21  t value [expr {!
0f70: 21 24 78 64 65 66 7d 5d 0a 09 09 7d 0a 09 09 74  !$xdef}]...}...t
0f80: 68 72 65 73 68 6f 6c 64 20 7b 0a 09 09 20 20 20  hreshold {...   
0f90: 20 23 20 6e 75 6c 6c 7c 69 6e 74 65 67 65 72 0a   # null|integer.
0fa0: 09 09 20 20 20 20 73 65 74 20 76 61 6c 75 65 20  ..    set value 
0fb0: 5b 65 78 70 72 20 7b 28 24 78 64 65 66 20 65 71  [expr {($xdef eq
0fc0: 20 7b 7d 29 20 3f 20 22 6e 75 6c 6c 22 20 3a 20   {}) ? "null" : 
0fd0: 24 78 64 65 66 7d 5d 0a 09 09 7d 0a 09 09 63 6f  $xdef}]...}...co
0fe0: 64 65 20 2d 0a 09 09 64 65 66 61 75 6c 74 20 2d  de -...default -
0ff0: 0a 09 09 64 65 73 63 72 69 70 74 69 6f 6e 20 2d  ...description -
1000: 0a 09 09 70 72 6f 6d 70 74 20 2d 0a 09 09 74 79  ...prompt -...ty
1010: 70 65 20 2d 0a 09 09 6c 61 62 65 6c 20 2d 0a 09  pe -...label -..
1020: 09 61 72 67 6c 61 62 65 6c 20 2d 0a 09 09 40 73  .arglabel -...@s
1030: 74 72 69 6e 67 20 7b 0a 09 09 20 20 20 20 73 65  tring {...    se
1040: 74 20 76 61 6c 75 65 20 5b 61 73 74 72 69 6e 67  t value [astring
1050: 20 24 78 64 65 66 5d 0a 09 09 7d 0a 09 09 67 65   $xdef]...}...ge
1060: 6e 65 72 61 74 6f 72 20 2d 0a 09 09 76 61 6c 69  nerator -...vali
1070: 64 61 74 6f 72 20 2d 0a 09 09 40 63 6d 64 70 72  dator -...@cmdpr
1080: 65 66 69 78 20 7b 20 0a 09 09 20 20 20 20 73 65  efix { ...    se
1090: 74 20 76 61 6c 75 65 20 24 78 64 65 66 0a 09 09  t value $xdef...
10a0: 7d 0a 09 09 66 6c 61 67 73 20 2d 0a 09 09 40 64  }...flags -...@d
10b0: 69 63 74 20 7b 0a 09 09 20 20 20 20 73 65 74 20  ict {...    set 
10c0: 76 61 6c 75 65 20 5b 3a 3a 63 6d 64 72 20 75 74  value [::cmdr ut
10d0: 69 6c 20 64 69 63 74 73 6f 72 74 20 24 78 64 65  il dictsort $xde
10e0: 66 5d 0a 09 09 7d 0a 09 09 2a 20 7b 0a 09 09 20  f]...}...* {... 
10f0: 20 20 20 65 72 72 6f 72 20 22 55 6e 6b 6e 6f 77     error "Unknow
1100: 6e 20 6b 65 79 20 5c 22 24 78 6e 61 6d 65 5c 22  n key \"$xname\"
1110: 2c 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f  , do not know ho
1120: 77 20 74 6f 20 66 6f 72 6d 61 74 22 0a 09 09 20  w to format"... 
1130: 20 20 20 23 6c 61 70 70 65 6e 64 20 74 6d 70 20     #lappend tmp 
1140: 24 78 6e 61 6d 65 20 5b 61 73 74 72 69 6e 67 20  $xname [astring 
1150: 24 78 64 65 66 5d 0a 09 09 7d 0a 09 20 20 20 20  $xdef]...}..    
1160: 7d 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 74  }..    lappend t
1170: 6d 70 20 24 78 6e 61 6d 65 20 24 76 61 6c 75 65  mp $xname $value
1180: 0a 09 7d 0a 09 6c 61 70 70 65 6e 64 20 64 69 63  ..}..lappend dic
1190: 74 20 24 6e 61 6d 65 20 24 74 6d 70 0a 20 20 20  t $name $tmp.   
11a0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 24 64   }.    return $d
11b0: 69 63 74 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23  ict.}..# # ## ##
11c0: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23  # ##### ########
11d0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20 23   ############# #
11e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11f0: 23 23 23 23 0a 0a 70 72 6f 63 20 3a 3a 63 6d 64  ####..proc ::cmd
1200: 72 3a 3a 68 65 6c 70 3a 3a 66 6f 72 6d 61 74 3a  r::help::format:
1210: 3a 54 43 4c 3a 3a 61 73 74 72 69 6e 67 20 7b 73  :TCL::astring {s
1220: 74 72 69 6e 67 7d 20 7b 0a 20 20 20 20 72 65 67  tring} {.    reg
1230: 73 75 62 20 2d 61 6c 6c 20 2d 2d 20 7b 5b 20 5c  sub -all -- {[ \
1240: 6e 5c 74 5d 2b 7d 20 24 73 74 72 69 6e 67 20 7b  n\t]+} $string {
1250: 20 7d 20 73 74 72 69 6e 67 0a 20 20 20 20 72 65   } string.    re
1260: 74 75 72 6e 20 5b 73 74 72 69 6e 67 20 74 72 69  turn [string tri
1270: 6d 20 24 73 74 72 69 6e 67 5d 0a 7d 0a 0a 23 20  m $string].}..# 
1280: 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23  # ## ### ##### #
1290: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23  ####### ########
12a0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23  ##### ##########
12b0: 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 20 52  ###########.## R
12c0: 65 61 64 79 0a 70 61 63 6b 61 67 65 20 70 72 6f  eady.package pro
12d0: 76 69 64 65 20 63 6d 64 72 3a 3a 68 65 6c 70 3a  vide cmdr::help:
12e0: 3a 74 63 6c 20 31 2e 31 2e 31 0a                 :tcl 1.1.1.