- `completion_algorithm` - Set this to `prefix`, `substring`, or `fuzzy` to choose how your completions are matched against the typed text. Used for overriding `$env.config.completions.algorithm`.
Here's an example demonstrating how to set these options:
```nu
def animals [] {
{
options: {
case_sensitive: false,
completion_algorithm: substring,
sort: false,
},
completions: [cat, rat, bat]
}
}
def my-command [animal: string@animals] { print $animal }
```
Now, if you try to complete `A`, you get the following completions:
```nu
>| my-command A
cat rat bat
```
Because we made matching case-insensitive, Nushell will find the substring "a" in all of the completion suggestions. Additionally, because we set `sort: false`, the completions will be left in their original order. This is useful if your completions are already sorted in a particular order unrelated to their text (e.g. by date).
## Modules and Custom Completions
Since completion commands aren't meant to be called directly, it's common to define them in modules.
Extending the above example with a module:
```nu
module commands {
def animals [] {
["cat", "dog", "eel" ]
}
export def my-command [animal: string@animals] {
print $animal
}
}
```
In this module, only the the custom command `my-command` is exported. The `animals` completion is not exported. This allows users of this module to call the command, and even use the custom completion logic, without having access to the completion command itself. This results in a cleaner and more maintainable API.
::: tip
Completers are attached to custom commands using `@` at parse time. This means that, in order for a change to the completion command to take effect, the public custom command must be reparsed as well. Importing a module satisfies both of these requirements at the same time with a single `use` statement.
:::
## Context Aware Custom Completions
It is possible to pass the context to the completion command. This is useful in situations where it is necessary to know previous arguments or flags to generate accurate completions.
Applying this concept to the previous example:
```nu
module commands {
def animals [] {
["cat", "dog", "eel" ]
}
def animal-names [context: string] {
match ($context | split words | last) {
cat => ["Missy", "Phoebe"]
dog => ["Lulu", "Enzo"]
eel => ["Eww", "Slippy"]
}
}
export def my-command [
animal: string@animals
name: string@animal-names
] {
print $"The ($animal) is named ($name)."
}
}
```
Here, the command `animal-names` returns the appropriate list of names. `$context` is a string where the value is the command-line that has been typed so far.
```nu
>| my-command
cat dog eel
>| my-command dog
Lulu Enzo
>my-command dog enzo
The dog is named Enzo
```
On the second line, after pressing the <kbd>tab</kbd> key, the argument `"my-command dog"` is passed to the `animal-names` completer as context.
::: tip
Completers can also obtain the current cursor position on the command-line using:
```nu
def completer [context:string, position:int] {}
```
:::
## Custom Completion and [`extern`](/commands/docs/extern.md)
A powerful combination is adding custom completions to [known `extern` commands](externs.md). These work the same way as adding a custom completion to a custom command: by creating the custom completion and then attaching it with a `@` to the type of one of the positional or flag arguments of the `extern`.