Shell completion
Cliffy supports shell completion out of the box. To enable shell completions it is required to register the completions command.
The completions command generates a shell completions script for your specific shell environment. Currently supported shells are:
The completions command enables completions for all sub-commands, options and arguments.
Adding shell completions
There are three ways to add shell completions to types which are explained in the following sections.
Enum type
One way is to use the EnumType. All values defined with the EnumType will be
used for shell completions. Read more about the enum type
here.
import { Command, EnumType } from "@cliffy/command";
const colorType = new EnumType(["red", "blue", "yellow"]);
await new Command()
.type("color", colorType)
.arguments("[color-name:color]")
.option("-c, --color <name:color>", "Choose a color.")
.parse();
Complete method
Another way to add completions is by registering a completions action with the
.complete() or .globalComplete() method. The values returned by the callback
method from the.complete() or .globalComplete() method will be used for
shell completions.
To use these completions you can add the name of the action after the type separated by colon.
iNOTE
Completions defined with the
.complete()or.globalComplete()method will override completions defined with the.type()or.globalType()method.
import { Command } from "@cliffy/command";
await new Command()
.complete("color", () => ["red", "blue", "yellow"])
.arguments("[color-name:string:color]")
.option("-c, --color <name:string:color>", "Choose a color.")
.parse();
Custom type
The 3rd way to add shell completions is by creating a custom type with a
.complete() method. The values returned by the .complete() method will be
used for shell completions. You can read more about custom types
here.
import { Command, StringType } from "@cliffy/command";
class ColorType extends StringType {
override complete(): Array<string> {
return ["red", "blue", "yellow"];
}
}
await new Command()
.type("color", new ColorType())
.option("-c, --color <name:color>", "Choose a color.")
.parse();
Dynamically generating shell completions
You can also dynamically generate the completions shell script. To do this you
can call the generateShellCompletions() function. The function accepts the
command instance and the shell name as arguments and returns the generated shell
completions script as string.
Optionally you can also pass a third argument to the
generateShellCompletions() function. The third argument is an options object
with the following properties:
name: The name of the binary. Default is the name of the command.
import { Command, generateShellCompletions } from "@cliffy/command";
const cmd = await new Command()
.name("mycmd")
.complete("color", () => ["red", "blue", "yellow"])
.arguments("[color-name:string:color]")
.parse();
const bashCompletions = generateShellCompletions(cmd, "bash");
console.log(bashCompletions);