Add hand-written bash completion for ollama CLI
Ollama doesn't expose a "completion" subcommand yet, so this provides manual completions for subcommands, flags, model names (from ollama list), running models (from ollama ps), and launch integrations. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
3672d1463d
commit
9262c06ae9
1 changed files with 149 additions and 0 deletions
149
50-ollama-completion
Executable file
149
50-ollama-completion
Executable file
|
|
@ -0,0 +1,149 @@
|
||||||
|
# shellcheck shell=bash
|
||||||
|
# shellcheck disable=SC2207 # Standard pattern for bash completions
|
||||||
|
# Bash completion for Ollama CLI
|
||||||
|
# Hand-written because ollama does not yet expose a "completion" subcommand.
|
||||||
|
# TODO: Replace with cached_completion once "ollama completion bash" is available.
|
||||||
|
|
||||||
|
command -v ollama &>/dev/null || return
|
||||||
|
|
||||||
|
_ollama_models() {
|
||||||
|
# List locally available model names (NAME column, strip tag if ":latest")
|
||||||
|
ollama list 2>/dev/null | awk 'NR>1 {print $1}'
|
||||||
|
}
|
||||||
|
|
||||||
|
_ollama_running_models() {
|
||||||
|
# List currently running model names
|
||||||
|
ollama ps 2>/dev/null | awk 'NR>1 {print $1}'
|
||||||
|
}
|
||||||
|
|
||||||
|
_ollama_launch_integrations() {
|
||||||
|
printf '%s\n' claude cline codex droid opencode openclaw clawdbot moltbot pi
|
||||||
|
}
|
||||||
|
|
||||||
|
_ollama_completions() {
|
||||||
|
local cur prev
|
||||||
|
COMPREPLY=()
|
||||||
|
cur="${COMP_WORDS[COMP_CWORD]}"
|
||||||
|
prev="${COMP_WORDS[COMP_CWORD-1]}"
|
||||||
|
|
||||||
|
local commands="serve create show run stop pull push signin signout list ls ps cp rm launch help"
|
||||||
|
|
||||||
|
local global_opts="--help --nowordwrap --verbose --version"
|
||||||
|
|
||||||
|
# Subcommand-specific flags
|
||||||
|
case "${prev}" in
|
||||||
|
run)
|
||||||
|
COMPREPLY=( $(compgen -W "$(_ollama_models)" -- "${cur}") )
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
show)
|
||||||
|
COMPREPLY=( $(compgen -W "$(_ollama_models)" -- "${cur}") )
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
stop)
|
||||||
|
COMPREPLY=( $(compgen -W "$(_ollama_running_models)" -- "${cur}") )
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
rm)
|
||||||
|
COMPREPLY=( $(compgen -W "$(_ollama_models)" -- "${cur}") )
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
cp)
|
||||||
|
COMPREPLY=( $(compgen -W "$(_ollama_models)" -- "${cur}") )
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
push)
|
||||||
|
COMPREPLY=( $(compgen -W "$(_ollama_models)" -- "${cur}") )
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
pull)
|
||||||
|
# No local completions useful for pull (user types a registry name)
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
launch)
|
||||||
|
COMPREPLY=( $(compgen -W "$(_ollama_launch_integrations)" -- "${cur}") )
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
help)
|
||||||
|
COMPREPLY=( $(compgen -W "${commands}" -- "${cur}") )
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
# Flag-specific value completions
|
||||||
|
--format)
|
||||||
|
COMPREPLY=( $(compgen -W "json" -- "${cur}") )
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
--quantize|-q)
|
||||||
|
COMPREPLY=( $(compgen -W "q4_0 q4_1 q4_K_S q4_K_M q5_0 q5_1 q5_K_S q5_K_M q8_0" -- "${cur}") )
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
--file|-f)
|
||||||
|
COMPREPLY=( $(compgen -f -- "${cur}") )
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
--model)
|
||||||
|
COMPREPLY=( $(compgen -W "$(_ollama_models)" -- "${cur}") )
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Determine which subcommand we're in (if any)
|
||||||
|
local subcmd=""
|
||||||
|
local i
|
||||||
|
for (( i=1; i < COMP_CWORD; i++ )); do
|
||||||
|
case "${COMP_WORDS[i]}" in
|
||||||
|
run|show|stop|pull|push|cp|rm|create|serve|list|ls|ps|launch|signin|signout|help)
|
||||||
|
subcmd="${COMP_WORDS[i]}"
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# Per-subcommand flag completion
|
||||||
|
if [[ "${cur}" == -* ]]; then
|
||||||
|
local sub_opts=""
|
||||||
|
case "${subcmd}" in
|
||||||
|
run)
|
||||||
|
sub_opts="--format --insecure --keepalive --nowordwrap --verbose
|
||||||
|
--hidethinking --think --experimental --experimental-websearch
|
||||||
|
--experimental-yolo --dimensions --truncate
|
||||||
|
--width --height --steps --seed --negative"
|
||||||
|
;;
|
||||||
|
show)
|
||||||
|
sub_opts="--license --modelfile --parameters --system --template --verbose"
|
||||||
|
;;
|
||||||
|
pull|push)
|
||||||
|
sub_opts="--insecure"
|
||||||
|
;;
|
||||||
|
create)
|
||||||
|
sub_opts="--file --quantize --experimental"
|
||||||
|
;;
|
||||||
|
launch)
|
||||||
|
sub_opts="--config --model --yes"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
COMPREPLY=( $(compgen -W "${sub_opts} --help" -- "${cur}") )
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Handle model-name completion for rm (supports multiple models)
|
||||||
|
if [[ "${subcmd}" == "rm" ]]; then
|
||||||
|
COMPREPLY=( $(compgen -W "$(_ollama_models)" -- "${cur}") )
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Handle second argument for cp (destination)
|
||||||
|
if [[ "${subcmd}" == "cp" && ${COMP_CWORD} -ge 3 ]]; then
|
||||||
|
COMPREPLY=( $(compgen -W "$(_ollama_models)" -- "${cur}") )
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Top-level: complete subcommands and global options
|
||||||
|
if [[ ${COMP_CWORD} -eq 1 ]]; then
|
||||||
|
COMPREPLY=( $(compgen -W "${commands} ${global_opts}" -- "${cur}") )
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
complete -F _ollama_completions ollama
|
||||||
Loading…
Add table
Add a link
Reference in a new issue