Shell completion

Goal is to provide tool to define shell completion through modulefile. Need comes from the ability of the source-sh modulefile command to reproduce the shell changes made by a sourced shell script. Completion definitions are part of those shell changes, so there is a need to be able to define them through modulefile command.

complete and uncomplete modulefile commands are introduced to give this ability to define or unset completion for commands in shell that provides a command to define such completion. Such shells are:

  • bash
  • tcsh
  • fish

No shell command to setup completion has been found on other shells. For instance on zsh, completion is made through files saved in specific directories.

complete

complete takes as argument:

  • shell: name of the shell this completion definition should be applied to
  • command: name of the command the completion targets
  • completion arguments aka body: parameter to define completion on shell

Shell should correspond to one of the supported shell name. When modulefile is evaluated, the complete command will produce shell code as output only if shell name corresponds to the shell the modulecmd.tcl script has been initialized for.

If an unsupported shell name is set, complete command is simply ignored. No error is produced as the shell specified may be supported on a latter version of the modulecmd.tcl script and the modulefile may be provided for use by different version of this script.

Command name should be a non-empty string. Otherwise an evaluation error is returned.

Body is shell-specific. When modulefile is evaluated the body defined on a complete command is not checked by module. Possible options are numerous and really different from one shell to another so it is up to the modulefile author to ensure the body definition used is correctly supported on targeted shell.

Body value is not escaped to fit shell evaluation. Defined syntax should be compatible with this evaluation. It is up to the modulefile writer to use the correct syntax as it cannot be guessed depending on what writer wants to achieve.

For shells like fish:

  • Completion definition consist of multiple complete commands for a single command name.
  • Prior applying completion definition, any previous completion is cleared for command. We ensure modulefile provides the full completion definition for command this way.

Note: when loading module on fish shell, completion is first fully removed for command. It is expected that modulefile provides the full completion definition for command and not rely on previous definition made elsewhere.

complete is evaluated on load but also refresh mode. Important on the later to get completion correctly redefined when initializing sub-shells. On unload mode, complete becomes uncomplete.

uncomplete

uncomplete is evaluated on unload mode. Like other undo command, it is ignored when unloading a modulefile.

uncomplete does not require a shell name as argument. Only the command name is expected.

Command name should be a non-empty string. Otherwise an evaluation error is returned.

uncomplete command is provided in case of a need to specifically unset a defined completion. There should not be a lot of use case for this command, but it does not cost much to add as it is needed to undo the complete command when a modulefile is unloaded.