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 [email protected]
or submit via the online form by Sep 9.

Artifact 1c56ab8f0af6acfe324afd5cdda1e999f5f7910e:


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 41 63 74 6f 72 20 2d 20 43  CMDR - Actor - C
0060: 6f 6d 6d 61 6e 64 20 65 78 65 63 75 74 69 6f 6e  ommand execution
0070: 2e 20 42 61 73 65 2e 0a 23 23 20 20 20 20 20 20  . Base..##      
0080: 20 20 20 20 20 20 20 20 20 20 41 63 74 6f 72 73            Actors
0090: 20 6b 6e 6f 77 20 68 6f 77 20 74 6f 20 64 6f 20   know how to do 
00a0: 73 6f 6d 65 74 68 69 6e 67 2e 0a 0a 23 20 40 40  something...# @@
00b0: 20 4d 65 74 61 20 42 65 67 69 6e 0a 23 20 50 61   Meta Begin.# Pa
00c0: 63 6b 61 67 65 20 63 6d 64 72 3a 3a 61 63 74 6f  ckage cmdr::acto
00d0: 72 20 30 0a 23 20 4d 65 74 61 20 61 75 74 68 6f  r 0.# Meta autho
00e0: 72 20 20 20 7b 41 6e 64 72 65 61 73 20 4b 75 70  r   {Andreas Kup
00f0: 72 69 65 73 7d 0a 23 20 4d 65 74 61 20 6c 6f 63  ries}.# Meta loc
0100: 61 74 69 6f 6e 20 68 74 74 70 73 3a 2f 2f 63 6f  ation https://co
0110: 72 65 2e 74 63 6c 2e 74 6b 2f 61 6b 75 70 72 69  re.tcl.tk/akupri
0120: 65 73 2f 63 6d 64 72 0a 23 20 4d 65 74 61 20 70  es/cmdr.# Meta p
0130: 6c 61 74 66 6f 72 6d 20 74 63 6c 0a 23 20 4d 65  latform tcl.# Me
0140: 74 61 20 73 75 6d 6d 61 72 79 20 20 20 20 20 49  ta summary     I
0150: 6e 74 65 72 6e 61 6c 2e 20 42 61 73 65 20 63 6c  nternal. Base cl
0160: 61 73 73 20 66 6f 72 20 6f 66 66 69 63 65 72 73  ass for officers
0170: 20 61 6e 64 20 70 72 69 76 61 74 65 73 2e 0a 23   and privates..#
0180: 20 4d 65 74 61 20 64 65 73 63 72 69 70 74 69 6f   Meta descriptio
0190: 6e 20 49 6e 74 65 72 6e 61 6c 2e 20 42 61 73 65  n Internal. Base
01a0: 20 63 6c 61 73 73 20 66 6f 72 20 6f 66 66 69 63   class for offic
01b0: 65 72 73 20 61 6e 64 20 70 72 69 76 61 74 65 73  ers and privates
01c0: 2e 0a 23 20 4d 65 74 61 20 73 75 62 6a 65 63 74  ..# Meta subject
01d0: 20 7b 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 7d 0a   {command line}.
01e0: 23 20 4d 65 74 61 20 72 65 71 75 69 72 65 20 7b  # Meta require {
01f0: 54 63 6c 20 38 2e 35 2d 7d 0a 23 20 4d 65 74 61  Tcl 8.5-}.# Meta
0200: 20 72 65 71 75 69 72 65 20 64 65 62 75 67 0a 23   require debug.#
0210: 20 4d 65 74 61 20 72 65 71 75 69 72 65 20 64 65   Meta require de
0220: 62 75 67 3a 3a 63 61 6c 6c 65 72 0a 23 20 4d 65  bug::caller.# Me
0230: 74 61 20 72 65 71 75 69 72 65 20 54 63 6c 4f 4f  ta require TclOO
0240: 0a 23 20 40 40 20 4d 65 74 61 20 45 6e 64 0a 0a  .# @@ Meta End..
0250: 23 23 20 54 77 6f 20 74 79 70 65 73 3a 0a 23 23  ## Two types:.##
0260: 20 2d 20 50 72 69 76 61 74 65 73 20 6b 6e 6f 77   - Privates know
0270: 20 74 6f 20 64 6f 20 6f 6e 65 20 74 68 69 6e 67   to do one thing
0280: 2c 20 65 78 61 63 74 6c 79 2c 20 61 6e 64 20 6e  , exactly, and n
0290: 6f 74 68 69 6e 67 20 6d 6f 72 65 2e 0a 23 23 20  othing more..## 
02a0: 20 20 54 68 65 79 20 63 61 6e 20 70 72 6f 63 65    They can proce
02b0: 73 73 20 74 68 65 69 72 20 63 6f 6d 6d 61 6e 64  ss their command
02c0: 20 6c 69 6e 65 20 74 6f 20 65 78 74 72 61 63 74   line to extract
02d0: 2f 76 61 6c 69 64 61 74 65 0a 23 23 20 20 20 74  /validate.##   t
02e0: 68 65 20 69 6e 70 75 74 73 20 74 68 65 79 20 6e  he inputs they n
02f0: 65 65 64 20 66 6f 72 20 74 68 65 69 72 20 61 63  eed for their ac
0300: 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 61 72  tion from the ar
0310: 67 75 6d 65 6e 74 73 2e 0a 23 0a 23 23 20 2d 20  guments..#.## - 
0320: 4f 66 66 69 63 65 72 73 20 63 61 6e 20 6c 65 61  Officers can lea
0330: 72 6e 20 74 6f 20 64 6f 20 6d 61 6e 79 20 74 68  rn to do many th
0340: 69 6e 67 73 2c 20 62 79 20 64 65 6c 65 67 61 74  ings, by delegat
0350: 69 6e 67 20 74 68 69 6e 67 73 20 74 6f 20 74 68  ing things to th
0360: 65 0a 23 23 20 20 20 61 63 74 6f 72 73 20 61 63  e.##   actors ac
0370: 74 75 61 6c 6c 79 20 61 62 6c 65 20 74 6f 20 70  tually able to p
0380: 65 72 66 6f 72 6d 20 69 74 2e 0a 0a 23 20 23 20  erform it...# # 
0390: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23  ## ### ##### ###
03a0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23  ##### ##########
03b0: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23  ### ############
03c0: 23 23 23 23 23 23 23 23 23 0a 23 23 20 52 65 71  #########.## Req
03d0: 75 69 73 69 74 65 73 0a 0a 70 61 63 6b 61 67 65  uisites..package
03e0: 20 72 65 71 75 69 72 65 20 54 63 6c 20 38 2e 35   require Tcl 8.5
03f0: 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65  .package require
0400: 20 64 65 62 75 67 0a 70 61 63 6b 61 67 65 20 72   debug.package r
0410: 65 71 75 69 72 65 20 64 65 62 75 67 3a 3a 63 61  equire debug::ca
0420: 6c 6c 65 72 0a 70 61 63 6b 61 67 65 20 72 65 71  ller.package req
0430: 75 69 72 65 20 54 63 6c 4f 4f 0a 0a 23 20 23 20  uire TclOO..# # 
0440: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23  ## ### ##### ###
0450: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23  ##### ##########
0460: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23  ### ############
0470: 23 23 23 23 23 23 23 23 23 0a 0a 64 65 62 75 67  #########..debug
0480: 20 64 65 66 69 6e 65 20 63 6d 64 72 2f 61 63 74   define cmdr/act
0490: 6f 72 0a 64 65 62 75 67 20 6c 65 76 65 6c 20 20  or.debug level  
04a0: 63 6d 64 72 2f 61 63 74 6f 72 0a 64 65 62 75 67  cmdr/actor.debug
04b0: 20 70 72 65 66 69 78 20 63 6d 64 72 2f 61 63 74   prefix cmdr/act
04c0: 6f 72 20 7b 5b 64 65 62 75 67 20 63 61 6c 6c 65  or {[debug calle
04d0: 72 5d 20 7c 20 7d 0a 0a 23 20 23 20 23 23 20 23  r] | }..# # ## #
04e0: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23  ## ##### #######
04f0: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20  # ############# 
0500: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0510: 23 23 23 23 23 0a 23 23 20 44 65 66 69 6e 69 74  #####.## Definit
0520: 69 6f 6e 20 2d 20 53 69 6e 67 6c 65 20 70 75 72  ion - Single pur
0530: 70 6f 73 65 20 63 6f 6d 6d 61 6e 64 2e 0a 0a 6f  pose command...o
0540: 6f 3a 3a 63 6c 61 73 73 20 63 72 65 61 74 65 20  o::class create 
0550: 3a 3a 63 6d 64 72 3a 3a 61 63 74 6f 72 20 7b 0a  ::cmdr::actor {.
0560: 20 20 20 20 23 20 23 20 23 23 20 23 23 23 20 23      # # ## ### #
0570: 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23  #### ######## ##
0580: 23 23 23 23 23 23 23 23 23 23 23 0a 20 20 20 20  ###########.    
0590: 23 23 20 4c 69 66 65 63 79 63 6c 65 0a 0a 20 20  ## Lifecycle..  
05a0: 20 20 63 6f 6e 73 74 72 75 63 74 6f 72 20 7b 7d    constructor {}
05b0: 20 7b 0a 09 64 65 62 75 67 2e 63 6d 64 72 2f 61   {..debug.cmdr/a
05c0: 63 74 6f 72 20 7b 7d 0a 09 73 65 74 20 6d 79 6e  ctor {}..set myn
05d0: 61 6d 65 20 20 20 20 20 20 20 20 7b 7d 0a 09 73  ame        {}..s
05e0: 65 74 20 6d 79 64 65 73 63 72 69 70 74 69 6f 6e  et mydescription
05f0: 20 7b 7d 0a 09 73 65 74 20 6d 79 64 6f 63 75 6d   {}..set mydocum
0600: 65 6e 74 65 64 20 20 79 65 73 0a 09 73 65 74 20  ented  yes..set 
0610: 6d 79 73 75 70 65 72 20 20 20 20 20 20 20 7b 7d  mysuper       {}
0620: 0a 09 73 65 74 20 6d 79 73 74 6f 72 65 20 20 20  ..set mystore   
0630: 20 20 20 20 7b 7d 0a 0a 09 73 65 74 20 6d 79 68      {}...set myh
0640: 69 73 74 6f 72 79 20 20 20 20 20 7b 7d 20 3b 20  istory     {} ; 
0650: 23 20 48 69 73 74 6f 72 79 20 68 61 6e 64 6c 65  # History handle
0660: 72 2c 20 72 65 70 6f 72 74 69 6e 67 20 63 6f 6d  r, reporting com
0670: 6d 61 6e 64 73 20 6a 75 73 74 20 61 62 6f 75 74  mands just about
0680: 0a 09 23 20 20 20 20 20 20 20 20 20 20 20 20 20  ..#             
0690: 20 20 20 20 20 20 20 20 20 23 20 74 6f 20 62 65           # to be
06a0: 20 65 78 65 63 75 74 65 64 2c 20 61 6e 64 20 6f   executed, and o
06b0: 74 68 65 72 20 65 76 65 6e 74 73 20 72 65 6c 61  ther events rela
06c0: 74 65 64 20 74 6f 0a 09 23 20 20 20 20 20 20 20  ted to..#       
06d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
06e0: 20 68 69 73 74 6f 72 79 20 6d 61 6e 61 67 65 6d   history managem
06f0: 65 6e 74 2e 0a 09 72 65 74 75 72 6e 0a 20 20 20  ent...return.   
0700: 20 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23   }..    # # ## #
0710: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23  ## ##### #######
0720: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  # #############.
0730: 20 20 20 20 23 23 20 50 75 62 6c 69 63 20 41 50      ## Public AP
0740: 49 3a 20 43 6f 6d 6d 6f 6e 20 61 63 74 6f 72 20  I: Common actor 
0750: 61 74 74 72 69 62 75 74 65 73 20 61 6e 64 20 62  attributes and b
0760: 65 68 61 76 69 6f 75 72 0a 20 20 20 20 23 23 20  ehaviour.    ## 
0770: 2d 20 4e 61 6d 65 2e 0a 20 20 20 20 23 23 20 2d  - Name..    ## -
0780: 20 44 65 73 63 72 69 70 74 69 6f 6e 20 28 68 65   Description (he
0790: 6c 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 29 2e  lp information).
07a0: 0a 20 20 20 20 23 23 20 2d 20 43 68 61 69 6e 20  .    ## - Chain 
07b0: 6f 66 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20 20 20  of command..    
07c0: 23 23 20 2d 20 41 73 73 6f 63 69 61 74 69 76 65  ## - Associative
07d0: 20 64 61 74 61 20 73 74 6f 72 65 0a 0a 20 20 20   data store..   
07e0: 20 6d 65 74 68 6f 64 20 6e 61 6d 65 20 7b 7d 20   method name {} 
07f0: 7b 0a 09 72 65 74 75 72 6e 20 24 6d 79 6e 61 6d  {..return $mynam
0800: 65 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74  e.    }..    met
0810: 68 6f 64 20 64 6e 61 6d 65 20 7b 7d 20 7b 0a 09  hod dname {} {..
0820: 3a 3a 6c 69 73 74 20 7b 2a 7d 5b 6d 79 20 67 65  ::list {*}[my ge
0830: 74 20 2a 70 72 65 66 69 78 2a 5d 20 24 6d 79 6e  t *prefix*] $myn
0840: 61 6d 65 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d  ame.    }..    m
0850: 65 74 68 6f 64 20 66 75 6c 6c 6e 61 6d 65 20 7b  ethod fullname {
0860: 7d 20 7b 0a 09 73 65 74 20 72 65 73 75 6c 74 20  } {..set result 
0870: 7b 7d 0a 09 69 66 20 7b 24 6d 79 73 75 70 65 72  {}..if {$mysuper
0880: 20 6e 65 20 7b 7d 7d 20 7b 0a 09 20 20 20 20 6c   ne {}} {..    l
0890: 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 7b 2a  append result {*
08a0: 7d 5b 24 6d 79 73 75 70 65 72 20 66 75 6c 6c 6e  }[$mysuper fulln
08b0: 61 6d 65 5d 0a 09 7d 0a 09 6c 61 70 70 65 6e 64  ame]..}..lappend
08c0: 20 72 65 73 75 6c 74 20 24 6d 79 6e 61 6d 65 0a   result $myname.
08d0: 09 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0a  .return $result.
08e0: 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f      }..    metho
08f0: 64 20 6e 61 6d 65 3a 20 7b 74 68 65 6e 61 6d 65  d name: {thename
0900: 7d 20 7b 0a 09 64 65 62 75 67 2e 63 6d 64 72 2f  } {..debug.cmdr/
0910: 61 63 74 6f 72 20 7b 7d 0a 09 73 65 74 20 6d 79  actor {}..set my
0920: 6e 61 6d 65 20 24 74 68 65 6e 61 6d 65 0a 09 72  name $thename..r
0930: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20  eturn.    }..   
0940: 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69 70 74   method descript
0950: 69 6f 6e 20 7b 7d 20 7b 0a 09 6d 79 20 53 65 74  ion {} {..my Set
0960: 75 70 20 3b 20 23 20 43 61 6c 6c 73 20 69 6e 74  up ; # Calls int
0970: 6f 20 74 68 65 20 64 65 72 69 76 65 64 20 63 6c  o the derived cl
0980: 61 73 73 0a 09 72 65 74 75 72 6e 20 24 6d 79 64  ass..return $myd
0990: 65 73 63 72 69 70 74 69 6f 6e 0a 20 20 20 20 7d  escription.    }
09a0: 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 64 65 73  ..    method des
09b0: 63 72 69 70 74 69 6f 6e 3a 20 7b 74 65 78 74 7d  cription: {text}
09c0: 20 7b 0a 09 64 65 62 75 67 2e 63 6d 64 72 2f 61   {..debug.cmdr/a
09d0: 63 74 6f 72 20 7b 7d 0a 09 73 65 74 20 6d 79 64  ctor {}..set myd
09e0: 65 73 63 72 69 70 74 69 6f 6e 20 5b 73 74 72 69  escription [stri
09f0: 6e 67 20 74 72 69 6d 20 24 74 65 78 74 5d 0a 09  ng trim $text]..
0a00: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20  return.    }..  
0a10: 20 20 6d 65 74 68 6f 64 20 64 6f 63 75 6d 65 6e    method documen
0a20: 74 65 64 20 7b 7d 20 7b 0a 09 64 65 62 75 67 2e  ted {} {..debug.
0a30: 63 6d 64 72 2f 61 63 74 6f 72 20 7b 7d 0a 09 6d  cmdr/actor {}..m
0a40: 79 20 53 65 74 75 70 20 3b 20 23 20 43 61 6c 6c  y Setup ; # Call
0a50: 73 20 69 6e 74 6f 20 74 68 65 20 64 65 72 69 76  s into the deriv
0a60: 65 64 20 63 6c 61 73 73 0a 09 72 65 74 75 72 6e  ed class..return
0a70: 20 24 6d 79 64 6f 63 75 6d 65 6e 74 65 64 0a 20   $mydocumented. 
0a80: 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64     }..    method
0a90: 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 7b 7d   undocumented {}
0aa0: 20 7b 0a 09 64 65 62 75 67 2e 63 6d 64 72 2f 61   {..debug.cmdr/a
0ab0: 63 74 6f 72 20 7b 7d 0a 09 73 65 74 20 6d 79 64  ctor {}..set myd
0ac0: 6f 63 75 6d 65 6e 74 65 64 20 6e 6f 0a 09 72 65  ocumented no..re
0ad0: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  turn.    }..    
0ae0: 6d 65 74 68 6f 64 20 73 75 70 65 72 20 7b 7d 20  method super {} 
0af0: 7b 0a 09 72 65 74 75 72 6e 20 24 6d 79 73 75 70  {..return $mysup
0b00: 65 72 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65  er.    }..    me
0b10: 74 68 6f 64 20 73 75 70 65 72 3a 20 7b 74 68 65  thod super: {the
0b20: 73 75 70 65 72 7d 20 7b 0a 09 73 65 74 20 6d 79  super} {..set my
0b30: 73 75 70 65 72 20 24 74 68 65 73 75 70 65 72 0a  super $thesuper.
0b40: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
0b50: 20 20 20 6d 65 74 68 6f 64 20 72 6f 6f 74 20 7b     method root {
0b60: 7d 20 7b 0a 09 69 66 20 7b 24 6d 79 73 75 70 65  } {..if {$mysupe
0b70: 72 20 6e 65 20 7b 7d 7d 20 7b 0a 09 20 20 20 20  r ne {}} {..    
0b80: 72 65 74 75 72 6e 20 5b 24 6d 79 73 75 70 65 72  return [$mysuper
0b90: 20 72 6f 6f 74 5d 0a 09 7d 0a 09 72 65 74 75 72   root]..}..retur
0ba0: 6e 20 5b 73 65 6c 66 5d 0a 20 20 20 20 7d 0a 0a  n [self].    }..
0bb0: 20 20 20 20 6d 65 74 68 6f 64 20 6b 65 79 73 20      method keys 
0bc0: 7b 7d 20 7b 0a 09 64 65 62 75 67 2e 63 6d 64 72  {} {..debug.cmdr
0bd0: 2f 61 63 74 6f 72 20 7b 7d 0a 09 6d 79 20 53 65  /actor {}..my Se
0be0: 74 75 70 0a 09 73 65 74 20 72 65 73 75 6c 74 20  tup..set result 
0bf0: 5b 64 69 63 74 20 6b 65 79 73 20 24 6d 79 73 74  [dict keys $myst
0c00: 6f 72 65 5d 0a 09 69 66 20 7b 24 6d 79 73 75 70  ore]..if {$mysup
0c10: 65 72 20 6e 65 20 7b 7d 7d 20 7b 0a 09 20 20 20  er ne {}} {..   
0c20: 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20   lappend result 
0c30: 7b 2a 7d 5b 24 6d 79 73 75 70 65 72 20 6b 65 79  {*}[$mysuper key
0c40: 73 5d 0a 09 20 20 20 20 73 65 74 20 72 65 73 75  s]..    set resu
0c50: 6c 74 20 5b 6c 73 6f 72 74 20 2d 75 6e 69 71 75  lt [lsort -uniqu
0c60: 65 20 24 72 65 73 75 6c 74 5d 0a 09 7d 0a 09 72  e $result]..}..r
0c70: 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0a 20 20  eturn $result.  
0c80: 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20    }..    method 
0c90: 65 78 69 73 74 73 20 7b 6b 65 79 7d 20 7b 0a 09  exists {key} {..
0ca0: 64 65 62 75 67 2e 63 6d 64 72 2f 61 63 74 6f 72  debug.cmdr/actor
0cb0: 20 7b 7d 0a 09 6d 79 20 53 65 74 75 70 0a 09 73   {}..my Setup..s
0cc0: 65 74 20 6f 6b 20 5b 64 69 63 74 20 65 78 69 73  et ok [dict exis
0cd0: 74 73 20 24 6d 79 73 74 6f 72 65 20 24 6b 65 79  ts $mystore $key
0ce0: 5d 0a 09 69 66 20 7b 21 24 6f 6b 20 26 26 20 28  ]..if {!$ok && (
0cf0: 24 6d 79 73 75 70 65 72 20 6e 65 20 7b 7d 29 7d  $mysuper ne {})}
0d00: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 5b   {..    return [
0d10: 24 6d 79 73 75 70 65 72 20 65 78 69 73 74 73 20  $mysuper exists 
0d20: 24 6b 65 79 5d 0a 09 7d 0a 09 72 65 74 75 72 6e  $key]..}..return
0d30: 20 24 6f 6b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   $ok.    }..    
0d40: 6d 65 74 68 6f 64 20 67 65 74 20 7b 6b 65 79 7d  method get {key}
0d50: 20 7b 0a 09 64 65 62 75 67 2e 63 6d 64 72 2f 61   {..debug.cmdr/a
0d60: 63 74 6f 72 20 7b 7d 0a 09 6d 79 20 53 65 74 75  ctor {}..my Setu
0d70: 70 20 3b 20 23 20 43 61 6c 6c 20 69 6e 74 6f 20  p ; # Call into 
0d80: 64 65 72 69 76 65 64 20 63 6c 61 73 73 2e 0a 0a  derived class...
0d90: 09 23 20 53 61 74 69 73 66 79 20 66 72 6f 6d 20  .# Satisfy from 
0da0: 6c 6f 63 61 6c 20 73 74 6f 72 65 20 66 69 72 73  local store firs
0db0: 74 20 2e 2e 2e 0a 09 69 66 20 7b 5b 64 69 63 74  t .....if {[dict
0dc0: 20 65 78 69 73 74 73 20 24 6d 79 73 74 6f 72 65   exists $mystore
0dd0: 20 24 6b 65 79 5d 7d 20 7b 0a 09 20 20 20 20 72   $key]} {..    r
0de0: 65 74 75 72 6e 20 5b 64 69 63 74 20 67 65 74 20  eturn [dict get 
0df0: 24 6d 79 73 74 6f 72 65 20 24 6b 65 79 5d 0a 09  $mystore $key]..
0e00: 7d 0a 09 23 20 2e 2e 2e 20 74 68 65 6e 20 61 73  }..# ... then as
0e10: 6b 20 69 6e 20 74 68 65 20 63 68 61 69 6e 20 6f  k in the chain o
0e20: 66 20 63 6f 6d 6d 61 6e 64 20 2e 2e 2e 0a 09 69  f command .....i
0e30: 66 20 7b 24 6d 79 73 75 70 65 72 20 6e 65 20 7b  f {$mysuper ne {
0e40: 7d 7d 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  }} {..    return
0e50: 20 5b 24 6d 79 73 75 70 65 72 20 67 65 74 20 24   [$mysuper get $
0e60: 6b 65 79 5d 0a 09 7d 0a 09 23 20 2e 2e 2e 20 61  key]..}..# ... a
0e70: 6e 64 20 66 61 69 6c 20 69 66 20 77 65 20 61 72  nd fail if we ar
0e80: 65 20 61 74 20 74 68 65 20 74 6f 70 2e 0a 09 72  e at the top...r
0e90: 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f  eturn -code erro
0ea0: 72 20 2d 65 72 72 6f 72 63 6f 64 65 20 7b 43 4d  r -errorcode {CM
0eb0: 44 52 20 53 54 4f 52 45 20 55 4e 4b 4e 4f 57 4e  DR STORE UNKNOWN
0ec0: 7d 20 5c 0a 09 20 20 20 20 22 45 78 70 65 63 74  } \..    "Expect
0ed0: 65 64 20 6b 6e 6f 77 6e 20 6b 65 79 20 66 6f 72  ed known key for
0ee0: 20 67 65 74 2c 20 67 6f 74 20 5c 22 24 6b 65 79   get, got \"$key
0ef0: 5c 22 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d  \"".    }..    m
0f00: 65 74 68 6f 64 20 73 65 74 20 7b 6b 65 79 20 64  ethod set {key d
0f10: 61 74 61 7d 20 7b 0a 09 64 65 62 75 67 2e 63 6d  ata} {..debug.cm
0f20: 64 72 2f 61 63 74 6f 72 20 7b 7d 0a 09 64 69 63  dr/actor {}..dic
0f30: 74 20 73 65 74 20 6d 79 73 74 6f 72 65 20 24 6b  t set mystore $k
0f40: 65 79 20 24 64 61 74 61 0a 09 72 65 74 75 72 6e  ey $data..return
0f50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68  .    }..    meth
0f60: 6f 64 20 6c 61 70 70 65 6e 64 20 7b 6b 65 79 20  od lappend {key 
0f70: 64 61 74 61 7d 20 7b 0a 09 64 65 62 75 67 2e 63  data} {..debug.c
0f80: 6d 64 72 2f 61 63 74 6f 72 20 7b 7d 0a 09 63 61  mdr/actor {}..ca
0f90: 74 63 68 20 7b 20 73 65 74 20 76 61 6c 75 65 20  tch { set value 
0fa0: 5b 6d 79 20 67 65 74 20 24 6b 65 79 5d 20 7d 0a  [my get $key] }.
0fb0: 09 6c 61 70 70 65 6e 64 20 76 61 6c 75 65 20 24  .lappend value $
0fc0: 64 61 74 61 0a 09 64 69 63 74 20 73 65 74 20 6d  data..dict set m
0fd0: 79 73 74 6f 72 65 20 24 6b 65 79 20 24 76 61 6c  ystore $key $val
0fe0: 75 65 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d  ue..return.    }
0ff0: 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 75 6e 73  ..    method uns
1000: 65 74 20 7b 6b 65 79 7d 20 7b 0a 09 64 65 62 75  et {key} {..debu
1010: 67 2e 63 6d 64 72 2f 61 63 74 6f 72 20 7b 7d 0a  g.cmdr/actor {}.
1020: 09 64 69 63 74 20 75 6e 73 65 74 20 6d 79 73 74  .dict unset myst
1030: 6f 72 65 20 24 6b 65 79 0a 09 72 65 74 75 72 6e  ore $key..return
1040: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68  .    }..    meth
1050: 6f 64 20 68 69 73 74 6f 72 79 2d 76 69 61 20 7b  od history-via {
1060: 63 6d 64 7d 20 7b 0a 09 64 65 62 75 67 2e 63 6d  cmd} {..debug.cm
1070: 64 72 2f 61 63 74 6f 72 20 7b 7d 0a 09 73 65 74  dr/actor {}..set
1080: 20 6d 79 68 69 73 74 6f 72 79 20 24 63 6d 64 0a   myhistory $cmd.
1090: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
10a0: 20 20 20 6d 65 74 68 6f 64 20 68 69 73 74 6f 72     method histor
10b0: 79 2d 73 65 74 75 70 20 7b 7d 20 7b 0a 09 64 65  y-setup {} {..de
10c0: 62 75 67 2e 63 6d 64 72 2f 61 63 74 6f 72 20 7b  bug.cmdr/actor {
10d0: 7d 0a 09 69 66 20 7b 21 5b 6c 6c 65 6e 67 74 68  }..if {![llength
10e0: 20 24 6d 79 68 69 73 74 6f 72 79 5d 7d 20 7b 72   $myhistory]} {r
10f0: 65 74 75 72 6e 20 7b 7d 7d 0a 09 72 65 74 75 72  eturn {}}..retur
1100: 6e 20 5b 7b 2a 7d 24 6d 79 68 69 73 74 6f 72 79  n [{*}$myhistory
1110: 20 69 6e 69 74 69 61 6c 69 7a 65 20 5b 73 65 6c   initialize [sel
1120: 66 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d  f]].    }..    m
1130: 65 74 68 6f 64 20 68 69 73 74 6f 72 79 2d 61 64  ethod history-ad
1140: 64 20 7b 63 6d 64 7d 20 7b 0a 09 64 65 62 75 67  d {cmd} {..debug
1150: 2e 63 6d 64 72 2f 61 63 74 6f 72 20 7b 7d 0a 09  .cmdr/actor {}..
1160: 69 66 20 7b 21 5b 6c 6c 65 6e 67 74 68 20 24 6d  if {![llength $m
1170: 79 68 69 73 74 6f 72 79 5d 7d 20 72 65 74 75 72  yhistory]} retur
1180: 6e 0a 09 7b 2a 7d 24 6d 79 68 69 73 74 6f 72 79  n..{*}$myhistory
1190: 20 61 64 64 20 5b 73 74 72 69 6e 67 20 74 72 69   add [string tri
11a0: 6d 20 24 63 6d 64 5d 0a 09 72 65 74 75 72 6e 0a  m $cmd]..return.
11b0: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 20 23      }..    # # #
11c0: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23  # ### ##### ####
11d0: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
11e0: 23 23 0a 20 20 20 20 23 23 20 50 75 62 6c 69 63  ##.    ## Public
11f0: 20 41 50 49 73 3a 0a 20 20 20 20 23 23 20 4f 76   APIs:.    ## Ov
1200: 65 72 72 69 64 64 65 6e 20 62 79 20 73 75 62 2d  erridden by sub-
1210: 63 6c 61 73 73 65 73 2e 0a 0a 20 20 20 20 23 20  classes...    # 
1220: 2d 20 50 65 72 66 6f 72 6d 20 61 6e 20 61 63 74  - Perform an act
1230: 69 6f 6e 2e 0a 20 20 20 20 23 20 2d 20 52 65 74  ion..    # - Ret
1240: 75 72 6e 20 68 65 6c 70 20 69 6e 66 6f 72 6d 61  urn help informa
1250: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 61  tion about the a
1260: 63 74 69 6f 6e 2e 0a 0a 20 20 20 20 6d 65 74 68  ction...    meth
1270: 6f 64 20 64 6f 20 20 20 7b 61 72 67 73 7d 20 7b  od do   {args} {
1280: 7d 0a 20 20 20 20 6d 65 74 68 6f 64 20 68 65 6c  }.    method hel
1290: 70 20 7b 7b 70 72 65 66 69 78 20 7b 7d 7d 7d 20  p {{prefix {}}} 
12a0: 7b 7d 0a 0a 20 20 20 20 23 23 0a 20 20 20 20 23  {}..    ##.    #
12b0: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20   # ## ### ##### 
12c0: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23  ######## #######
12d0: 23 23 23 23 23 23 0a 0a 20 20 20 20 76 61 72 69  ######..    vari
12e0: 61 62 6c 65 20 6d 79 6e 61 6d 65 20 6d 79 64 65  able myname myde
12f0: 73 63 72 69 70 74 69 6f 6e 20 6d 79 64 6f 63 75  scription mydocu
1300: 6d 65 6e 74 65 64 20 5c 0a 09 6d 79 73 75 70 65  mented \..mysupe
1310: 72 20 6d 79 73 74 6f 72 65 20 6d 79 68 69 73 74  r mystore myhist
1320: 6f 72 79 0a 0a 20 20 20 20 23 20 23 20 23 23 20  ory..    # # ## 
1330: 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23  ### ##### ######
1340: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
1350: 0a 20 20 20 20 23 23 20 48 65 6c 70 65 72 20 6d  .    ## Helper m
1360: 65 74 68 6f 64 73 20 63 6f 6d 6d 6f 6e 20 74 6f  ethods common to
1370: 20 63 6f 6d 6d 61 6e 64 20 63 6f 6d 70 6c 65 74   command complet
1380: 69 6f 6e 20 69 6e 20 61 63 74 6f 72 73 2e 0a 0a  ion in actors...
1390: 20 20 20 20 6d 65 74 68 6f 64 20 51 75 6f 74 65      method Quote
13a0: 20 7b 77 6f 72 64 7d 20 7b 0a 09 23 20 43 68 65   {word} {..# Che
13b0: 63 6b 20 69 66 20 77 6f 72 64 20 63 6f 6e 74 61  ck if word conta
13c0: 69 6e 73 20 73 70 65 63 69 61 6c 20 63 68 61 72  ins special char
13d0: 61 63 74 65 72 73 2c 20 61 6e 64 20 71 75 6f 74  acters, and quot
13e0: 65 20 69 74 20 74 6f 0a 09 23 20 70 72 65 76 65  e it to..# preve
13f0: 6e 74 20 73 70 65 63 69 61 6c 20 69 6e 74 65 72  nt special inter
1400: 70 72 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  pretation of the
1410: 73 65 20 63 68 61 72 61 63 74 65 72 73 2c 20 69  se characters, i
1420: 66 20 73 6f 2e 0a 09 69 66 20 7b 0a 09 20 20 20  f so...if {..   
1430: 20 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 22   [string match "
1440: 2a 5c 5b 20 5c 22 27 28 29 5c 24 5c 7c 5c 7b 5c  *\[ \"'()\$\|\{\
1450: 7d 5c 5d 2a 22 20 24 77 6f 72 64 5d 20 7c 7c 0a  }\]*" $word] ||.
1460: 09 20 20 20 20 5b 73 74 72 69 6e 67 20 6d 61 74  .    [string mat
1470: 63 68 20 22 2a 5c 5d 2a 22 20 20 20 20 20 20 20  ch "*\]*"       
1480: 20 20 20 20 20 20 20 20 20 20 24 77 6f 72 64 5d            $word]
1490: 20 7c 7c 0a 09 20 20 20 20 5b 73 74 72 69 6e 67   ||..    [string
14a0: 20 6d 61 74 63 68 20 22 2a 5c 5b 5c 5b 5c 5d 2a   match "*\[\[\]*
14b0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 24 77  "             $w
14c0: 6f 72 64 5d 0a 09 7d 20 7b 0a 09 20 20 20 20 73  ord]..} {..    s
14d0: 65 74 20 6d 61 70 20 5b 6c 69 73 74 20 5c 22 20  et map [list \" 
14e0: 5c 5c 5c 22 5d 0a 09 20 20 20 20 72 65 74 75 72  \\\"]..    retur
14f0: 6e 20 5c 22 5b 73 74 72 69 6e 67 20 6d 61 70 20  n \"[string map 
1500: 24 6d 61 70 20 24 77 6f 72 64 5d 5c 22 0a 09 7d  $map $word]\"..}
1510: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74   else {..    ret
1520: 75 72 6e 20 24 77 6f 72 64 0a 09 7d 0a 20 20 20  urn $word..}.   
1530: 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 63   }..    method c
1540: 6f 6d 70 6c 65 74 69 6f 6e 73 20 7b 70 61 72 73  ompletions {pars
1550: 65 20 63 6d 64 6c 69 73 74 7d 20 7b 0a 09 64 65  e cmdlist} {..de
1560: 62 75 67 2e 63 6d 64 72 2f 61 63 74 6f 72 20 7b  bug.cmdr/actor {
1570: 7d 20 31 30 0a 09 23 20 51 75 69 63 6b 20 65 78  } 10..# Quick ex
1580: 69 74 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  it if there is n
1590: 6f 74 68 69 6e 67 20 74 6f 20 63 6f 6d 70 6c 65  othing to comple
15a0: 74 65 2e 0a 09 69 66 20 7b 21 5b 6c 6c 65 6e 67  te...if {![lleng
15b0: 74 68 20 24 63 6d 64 6c 69 73 74 5d 7d 20 7b 0a  th $cmdlist]} {.
15c0: 09 20 20 20 20 72 65 74 75 72 6e 20 24 63 6d 64  .    return $cmd
15d0: 6c 69 73 74 0a 09 7d 0a 0a 09 64 69 63 74 20 77  list..}...dict w
15e0: 69 74 68 20 70 61 72 73 65 20 7b 7d 0a 09 23 20  ith parse {}..# 
15f0: 2d 3e 20 6c 69 6e 65 2c 20 77 6f 72 64 73 20 28  -> line, words (
1600: 69 67 6e 6f 72 65 64 3a 20 6f 6b 2c 20 6e 77 6f  ignored: ok, nwo
1610: 72 64 73 2c 20 61 74 2c 20 64 6f 65 78 69 74 29  rds, at, doexit)
1620: 0a 0a 09 23 20 54 68 65 20 2d 3e 20 63 6d 64 20  ...# The -> cmd 
1630: 69 73 20 61 20 76 61 6c 69 64 20 63 6f 6d 70 6c  is a valid compl
1640: 65 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 6e  etion of the lin
1650: 65 2e 20 20 54 68 65 20 61 63 74 75 61 6c 0a 09  e.  The actual..
1660: 23 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 69 73 20  # completion is 
1670: 74 68 65 20 6c 69 6e 65 20 69 74 73 65 6c 66 2c  the line itself,
1680: 20 70 6c 75 73 20 74 68 65 20 63 6f 6d 6d 61 6e   plus the comman
1690: 64 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 09 23  d.  Note that..#
16a0: 20 77 65 20 68 61 76 65 20 74 6f 20 63 68 6f 70   we have to chop
16b0: 20 6f 66 66 20 74 68 65 20 69 6e 63 6f 6d 70 6c   off the incompl
16c0: 65 74 65 20 70 61 72 74 20 6f 66 20 63 6d 64 20  ete part of cmd 
16d0: 69 6e 20 74 68 65 20 6c 69 6e 65 0a 09 23 20 62  in the line..# b
16e0: 65 66 6f 72 65 20 61 64 64 69 6e 67 20 74 68 65  efore adding the
16f0: 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6d 6d 61 6e   complete comman
1700: 64 2e 0a 09 23 0a 09 23 20 45 78 61 6d 70 6c 65  d...#..# Example
1710: 3a 0a 09 23 20 6c 69 6e 65 20 20 20 20 20 20 20  :..# line       
1720: 3d 20 22 66 6f 6f 20 62 22 0a 09 23 20 63 6d 64  = "foo b"..# cmd
1730: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 22 62              = "b
1740: 61 72 22 0a 09 23 20 63 6f 6d 70 6c 65 74 69 6f  ar"..# completio
1750: 6e 20 3d 20 22 66 6f 6f 20 62 61 72 22 0a 0a 09  n = "foo bar"...
1760: 23 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  # Determine the 
1770: 63 68 6f 70 20 70 6f 69 6e 74 2c 20 74 68 65 6e  chop point, then
1780: 20 63 68 6f 70 3a 20 4a 75 73 74 20 62 65 66 6f   chop: Just befo
1790: 72 65 20 74 68 65 20 66 69 72 73 74 0a 09 23 20  re the first..# 
17a0: 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65  character of the
17b0: 20 6c 61 73 74 20 77 6f 72 64 2e 20 57 68 69 63   last word. Whic
17c0: 68 20 69 73 20 61 20 70 72 65 66 69 78 20 74 6f  h is a prefix to
17d0: 20 61 6c 6c 0a 09 23 20 63 6f 6d 6d 61 6e 64 73   all..# commands
17e0: 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 09 73   in the list...s
17f0: 65 74 20 20 63 68 6f 70 20 5b 6c 69 6e 64 65 78  et  chop [lindex
1800: 20 24 77 6f 72 64 73 20 65 6e 64 20 31 5d 0a 09   $words end 1]..
1810: 69 6e 63 72 20 63 68 6f 70 20 2d 31 0a 09 73 65  incr chop -1..se
1820: 74 20 6c 69 6e 65 20 5b 73 74 72 69 6e 67 20 72  t line [string r
1830: 61 6e 67 65 20 24 6c 69 6e 65 20 30 20 24 63 68  ange $line 0 $ch
1840: 6f 70 5d 0a 0a 09 73 65 74 20 63 6f 6d 70 6c 65  op]...set comple
1850: 74 69 6f 6e 73 20 7b 7d 0a 09 66 6f 72 65 61 63  tions {}..foreac
1860: 68 20 63 6d 64 20 24 63 6d 64 6c 69 73 74 20 7b  h cmd $cmdlist {
1870: 0a 09 20 20 20 20 73 65 74 20 63 6d 64 20 5b 6d  ..    set cmd [m
1880: 79 20 51 75 6f 74 65 20 24 63 6d 64 5d 0a 09 20  y Quote $cmd].. 
1890: 20 20 20 23 20 43 68 6f 70 20 61 6e 64 20 63 6f     # Chop and co
18a0: 6d 70 6c 65 74 65 2e 0a 09 20 20 20 20 6c 61 70  mplete...    lap
18b0: 70 65 6e 64 20 63 6f 6d 70 6c 65 74 69 6f 6e 73  pend completions
18c0: 20 24 6c 69 6e 65 24 63 6d 64 0a 09 7d 0a 09 72   $line$cmd..}..r
18d0: 65 74 75 72 6e 20 24 63 6f 6d 70 6c 65 74 69 6f  eturn $completio
18e0: 6e 73 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  ns.    }..    # 
18f0: 43 6f 75 6c 64 20 70 6f 73 73 69 62 6c 79 20 75  Could possibly u
1900: 73 65 20 27 73 74 72 75 63 74 3a 3a 6c 69 73 74  se 'struct::list
1910: 20 66 69 6c 74 65 72 27 2c 20 70 6c 75 73 20 61   filter', plus a
1920: 20 6c 61 6d 62 64 61 2e 0a 20 20 20 20 6d 65 74   lambda..    met
1930: 68 6f 64 20 6d 61 74 63 68 20 7b 70 61 72 73 65  hod match {parse
1940: 20 63 6d 64 6c 69 73 74 7d 20 7b 0a 09 64 65 62   cmdlist} {..deb
1950: 75 67 2e 63 6d 64 72 2f 61 63 74 6f 72 20 7b 7d  ug.cmdr/actor {}
1960: 20 31 30 0a 09 23 20 51 75 69 63 6b 20 65 78 69   10..# Quick exi
1970: 74 20 69 66 20 6e 6f 74 68 69 6e 67 20 63 61 6e  t if nothing can
1980: 20 6d 61 74 63 68 2e 0a 09 69 66 20 7b 21 5b 6c   match...if {![l
1990: 6c 65 6e 67 74 68 20 24 63 6d 64 6c 69 73 74 5d  length $cmdlist]
19a0: 7d 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  } {..    return 
19b0: 24 63 6d 64 6c 69 73 74 0a 09 7d 0a 0a 09 64 69  $cmdlist..}...di
19c0: 63 74 20 77 69 74 68 20 70 61 72 73 65 20 7b 7d  ct with parse {}
19d0: 0a 09 23 20 2d 3e 20 77 6f 72 64 73 2c 20 61 74  ..# -> words, at
19e0: 20 28 69 67 6e 6f 72 65 64 3a 20 6f 6b 2c 20 6e   (ignored: ok, n
19f0: 77 6f 72 64 73 2c 20 6c 69 6e 65 2c 20 64 6f 65  words, line, doe
1a00: 78 69 74 29 0a 0a 09 23 20 57 65 20 6e 65 65 64  xit)...# We need
1a10: 20 6a 75 73 74 20 74 68 65 20 74 65 78 74 20 6f   just the text o
1a20: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 77 6f  f the current wo
1a30: 72 64 2e 0a 09 73 65 74 20 63 75 72 72 65 6e 74  rd...set current
1a40: 20 5b 6c 69 6e 64 65 78 20 24 77 6f 72 64 73 20   [lindex $words 
1a50: 24 61 74 20 65 6e 64 5d 0a 0a 09 73 65 74 20 66  $at end]...set f
1a60: 69 6c 74 65 72 65 64 20 7b 7d 0a 09 66 6f 72 65  iltered {}..fore
1a70: 61 63 68 20 63 6d 64 20 24 63 6d 64 6c 69 73 74  ach cmd $cmdlist
1a80: 20 7b 0a 09 20 20 20 20 69 66 20 7b 21 5b 73 74   {..    if {![st
1a90: 72 69 6e 67 20 6d 61 74 63 68 20 24 7b 63 75 72  ring match ${cur
1aa0: 72 65 6e 74 7d 2a 20 24 63 6d 64 5d 7d 20 63 6f  rent}* $cmd]} co
1ab0: 6e 74 69 6e 75 65 0a 09 20 20 20 20 6c 61 70 70  ntinue..    lapp
1ac0: 65 6e 64 20 66 69 6c 74 65 72 65 64 20 24 63 6d  end filtered $cm
1ad0: 64 0a 09 7d 0a 09 72 65 74 75 72 6e 20 24 66 69  d..}..return $fi
1ae0: 6c 74 65 72 65 64 0a 20 20 20 20 7d 0a 0a 20 20  ltered.    }..  
1af0: 20 20 6d 65 74 68 6f 64 20 70 61 72 73 65 2d 6c    method parse-l
1b00: 69 6e 65 20 7b 6c 69 6e 65 7d 20 7b 0a 09 64 65  ine {line} {..de
1b10: 62 75 67 2e 63 6d 64 72 2f 61 63 74 6f 72 20 7b  bug.cmdr/actor {
1b20: 7d 20 31 30 0a 09 73 65 74 20 6f 6b 20 20 20 20  } 10..set ok    
1b30: 31 0a 09 73 65 74 20 77 6f 72 64 73 20 7b 7d 0a  1..set words {}.
1b40: 0a 09 74 72 79 20 7b 0a 09 20 20 20 20 73 65 74  ..try {..    set
1b50: 20 77 6f 72 64 73 20 5b 73 74 72 69 6e 67 20 74   words [string t
1b60: 6f 6b 65 6e 20 73 68 65 6c 6c 20 2d 70 61 72 74  oken shell -part
1b70: 69 61 6c 20 2d 69 6e 64 69 63 65 73 20 24 6c 69  ial -indices $li
1b80: 6e 65 5d 0a 09 7d 20 74 72 61 70 20 7b 53 54 52  ne]..} trap {STR
1b90: 49 4e 47 20 54 4f 4b 45 4e 20 53 48 45 4c 4c 20  ING TOKEN SHELL 
1ba0: 42 41 44 7d 20 7b 65 20 6f 7d 20 7b 0a 09 20 20  BAD} {e o} {..  
1bb0: 20 20 73 65 74 20 6f 6b 20 30 0a 09 7d 0a 0a 09    set ok 0..}...
1bc0: 73 65 74 20 6c 65 6e 20 5b 73 74 72 69 6e 67 20  set len [string 
1bd0: 6c 65 6e 67 74 68 20 24 6c 69 6e 65 5d 0a 0a 09  length $line]...
1be0: 69 66 20 7b 24 6f 6b 7d 20 7b 0a 09 20 20 20 20  if {$ok} {..    
1bf0: 23 20 6c 61 73 74 20 77 6f 72 64 2c 20 65 6e 64  # last word, end
1c00: 20 69 6e 64 65 78 0a 09 20 20 20 20 73 65 74 20   index..    set 
1c10: 6c 77 65 20 5b 6c 69 6e 64 65 78 20 24 77 6f 72  lwe [lindex $wor
1c20: 64 73 20 65 6e 64 20 32 5d 0a 09 20 20 20 20 23  ds end 2]..    #
1c30: 20 6c 61 73 74 20 77 6f 72 64 20 65 6e 64 73 20   last word ends 
1c40: 62 65 66 6f 72 65 20 65 6e 64 20 6f 66 20 6c 69  before end of li
1c50: 6e 65 20 2d 3e 20 74 72 61 69 6c 69 6e 67 20 77  ne -> trailing w
1c60: 68 69 74 65 73 70 61 63 65 0a 09 20 20 20 20 23  hitespace..    #
1c70: 20 61 64 64 20 74 68 65 20 69 6d 70 6c 69 65 64   add the implied
1c80: 20 65 6d 70 74 79 20 77 6f 72 64 20 66 6f 72 20   empty word for 
1c90: 74 68 65 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 70  the completion p
1ca0: 72 6f 63 65 73 73 69 6e 67 2e 0a 09 20 20 20 20  rocessing...    
1cb0: 69 66 20 7b 24 6c 77 65 20 3c 20 28 24 6c 65 6e  if {$lwe < ($len
1cc0: 2d 31 29 7d 20 7b 0a 09 09 6c 61 70 70 65 6e 64  -1)} {...lappend
1cd0: 20 77 6f 72 64 73 20 5b 6c 69 73 74 20 50 4c 41   words [list PLA
1ce0: 49 4e 20 24 6c 65 6e 20 24 6c 65 6e 20 7b 7d 5d  IN $len $len {}]
1cf0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 73 65 74 20  ..    }..}..set 
1d00: 70 61 72 73 65 20 5b 64 69 63 74 20 63 72 65 61  parse [dict crea
1d10: 74 65 20 5c 0a 09 09 20 20 20 20 20 20 20 64 6f  te \...       do
1d20: 65 78 69 74 20 31 20 5c 0a 09 09 20 20 20 20 20  exit 1 \...     
1d30: 20 20 61 74 20 20 20 20 20 30 20 5c 0a 09 09 20    at     0 \... 
1d40: 20 20 20 20 20 20 6c 69 6e 65 20 20 20 24 6c 69        line   $li
1d50: 6e 65 20 5c 0a 09 09 20 20 20 20 20 20 20 6f 6b  ne \...       ok
1d60: 20 20 20 20 20 24 6f 6b 20 5c 0a 09 09 20 20 20       $ok \...   
1d70: 20 20 20 20 77 6f 72 64 73 20 20 24 77 6f 72 64      words  $word
1d80: 73 20 5c 0a 09 09 20 20 20 20 20 20 20 6e 77 6f  s \...       nwo
1d90: 72 64 73 20 5b 6c 6c 65 6e 67 74 68 20 24 77 6f  rds [llength $wo
1da0: 72 64 73 5d 5d 0a 0a 09 72 65 74 75 72 6e 20 24  rds]]...return $
1db0: 70 61 72 73 65 0a 20 20 20 20 7d 0a 0a 20 20 20  parse.    }..   
1dc0: 20 23 23 0a 20 20 20 20 23 20 23 20 23 23 20 23   ##.    # # ## #
1dd0: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23  ## ##### #######
1de0: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  # #############.
1df0: 7d 0a 0a 23 20 23 20 23 23 20 23 23 23 20 23 23  }..# # ## ### ##
1e00: 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23  ### ######## ###
1e10: 23 23 23 23 23 23 23 23 23 23 20 23 23 23 23 23  ########## #####
1e20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1e30: 0a 23 23 20 52 65 61 64 79 0a 70 61 63 6b 61 67  .## Ready.packag
1e40: 65 20 70 72 6f 76 69 64 65 20 63 6d 64 72 3a 3a  e provide cmdr::
1e50: 61 63 74 6f 72 20 31 2e 32 0a                    actor 1.2.