Tab completion#
Interfaces built with tyro.cli()
can be tab completed in interactive
shells without any source code modification.
Completion scripts can be generated by passing the
--tyro-write-completion {bash/zsh/tcsh} PATH
flag to a tyro CLI. This
generates a completion script via shtab and
writes it to a specified file. To set up tab completion, the printed script simply
needs to be written somewhere where your shell will find it.
Zsh#
For zsh, one option is to emulate the pattern used for completions in poetry:
# Set up zsh autocompletion for 01_functions.py, which is located in
# tyro/examples.
# (1) Make directory for local completions.
mkdir -p ~/.zfunc
# (2) Write completion script. The name here (_01_functions_py) doesn't matter,
# as long as it's prefixed with an underscore.
python 01_functions.py --tyro-write-completion zsh ~/.zfunc/_01_functions_py
And if it’s not in your .zshrc
already:
# (3) Add .zfunc to our function search path, then initialize completions.
# Ideally this should go in your .zshrc!
fpath+=~/.zfunc
autoload -Uz compinit && compinit
Bash#
Local completion scripts for bash can be written as described in the bash-complete documentation.
Q. Where should I install my own local completions?
A. Put them in the completions subdir of
$BASH_COMPLETION_USER_DIR
(defaults to$XDG_DATA_HOME/bash-completion
or~/.local/share/bash-completion
if$XDG_DATA_HOME
is not set) to have them loaded automatically on demand when the respective command is being completed […]
Borrowing from the bash-completion
source[1], we can run:
# Set up bash autocompletion for 01_functions.py, which is located in
# tyro/examples.
# (1) Find and make completion directory.
completion_dir=${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions/
mkdir -p $completion_dir
# (2) Write completion scripts. Note that the name of the completion script must
# match the name of the file.
python 01_functions.py --tyro-write-completion bash ${completion_dir}/01_functions.py
In contrast to zsh, tab completion in bash requires that scripts are either set
up as an entry point or run as ./01_functions.py <TAB>
, as opposed to
with the python
command, python 01_functions.py <TAB>
.
Making a script directly executable typically requires:
A permissions update:
chmod +x ./01_functions.py
.A shebang as the first line of your script:
#!/usr/bin/env python