TabComplete: type: procedure debug: false definitions: command|data|raw_args script: - define raw_args <[raw_args].if_null[]> - define newArg '<[raw_args].ends_with[ ].or[<[raw_args].equals[]>]>' - define path <[command]> - define script ]> - define args - if <[raw_args]> != : - define 'args:|:<[raw_args].split[ ]>' - define argsSize <[args].size> - if <[newArg]>: - define argsSize:+:1 - repeat <[argsSize].sub[1]> as:index: - define value <[args].get[<[index]>]> - if <[value]> == : - foreach next - define keys <[script].list_keys[<[path]>]> - define permLockedKeys <[keys].filter[starts_with[?]]> - define keys:<-:<[permLockedKeys]> - if <[keys].contains[<[value]>]>: - define path <[path]>.<[value]> - else: - if <[permLockedKeys].size> > 0: - define perm '<[permLockedKeys].filter[ends_with[ <[value]>]]>' - if !<[perm].is_empty> && ']>': - define path <[path]>.<[perm].first> - repeat next - define default <[keys].filter[starts_with[_]]> - if <[default].is_empty>: - determine - define path <[path]>.<[default].first> - if <[script].data_key[<[path]>]> == end: - determine - foreach <[script].list_keys[<[path]>]>: - if <[value].starts_with[_]>: - define value <[value].after[_]> - if <[value].starts_with[*]>: - define ret:|:_<[value].after[*]>].context[<[args]>]> - else if <[value].starts_with[?]>: - define perm '<[value].before[ ].after[?]>' - if ]>: - define 'ret:|:<[value].after[ ]>' - else: - define ret:->:<[value]> - if !<[ret].exists>: - determine - if <[newArg]>: - determine <[ret]> - determine <[ret].filter[starts_with[<[args].last>]]>