docs/src/shell-completion.md
Miller can generate tab-completion scripts for bash and zsh. Once installed,
pressing <b>TAB</b> completes Miller's main flags, verb names, subcommands like
help and version, each verb's own flags, the then keyword, and filenames
-- and it does so in a way that understands Miller's
then-chains.
Most command-line tools have a single set of flags: prog --flag1 --flag2 file.
Miller's command line, by contrast, is instead a sequence of contexts:
<pre class="pre-non-highlight-non-pair"> mlr {main flags} verb1 {verb1 flags} then verb2 {verb2 flags} {filenames} </pre>So the same word can mean different things depending on where it sits. Miller's completion walks the command line left-to-right and offers candidates appropriate to the cursor's position:
--icsv), verb names (e.g. cat),
and subcommands (e.g. help, version, repl).then and filenames.then: verb names.mlr --ifs): the flag's
values where these are a known set, otherwise filenames.Add this to your ~/.bashrc:
Or install it system-wide (loaded by the bash-completion package):
Prefer eval "$(mlr completion bash)" over source <(mlr completion bash). The
latter silently does nothing on the bash 3.2 that ships with macOS, where
sourcing from a process-substitution file descriptor can read no data.
Add this to your ~/.zshrc:
Or place the script on your $fpath so zsh autoloads it:
The generated script initializes zsh's completion system (compinit) if your
startup files have not already done so, so it works even with a minimal
~/.zshrc.
Before the first verb, <b>TAB</b> offers verb names along with subcommands like
help and version:
The top-level help and version flags are offered too:
<pre class="pre-non-highlight-non-pair"> mlr --v<b>TAB</b> --value-color --version --vflatsep </pre>The help subcommand completes its topics, and topics that take a name
argument complete that too:
A leading dash offers main flags, including the format-conversion
keystroke-savers (--c2j, --x2y, and so on):
Inside a verb, <b>TAB</b> offers that verb's flags:
<pre class="pre-non-highlight-non-pair"> mlr cat -<b>TAB</b> -n -N -g --filename --filenum </pre>After then, <b>TAB</b> offers verb names again:
For flags whose argument is a known set of values, <b>TAB</b> offers those
values. Format flags (-i, -o, --io) offer file-format names:
and separator flags (--ifs, --ofs, --ips, and so on) offer the named
separator aliases:
The mlr completion command prints the scripts, and mlr completion --help
describes the options:
Completion candidates are produced by Miller itself: the shell scripts simply
forward the current command-line words to mlr and render what it returns.
This means completion stays in sync with Miller's flags and verbs
automatically -- there is no separate list to maintain.
Value completion is offered for flags with a known set of values (file
formats for -i/-o/--io, separator aliases for --ifs and friends).
Other arg-taking flags fall back to filename completion; per-verb argument
values (such as field names) are not yet completed.
The mlr completion complete ... subcommand is an internal interface used by
the generated scripts; it is not intended to be run directly.