1
0
mirror of https://github.com/ohmyzsh/ohmyzsh.git synced 2025-12-12 15:34:50 +08:00
This commit is contained in:
Daniel Isnardo 2025-12-08 16:58:00 +01:00 committed by GitHub
commit 5628cefa32
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 287 additions and 0 deletions

28
plugins/claude/README.md Normal file
View File

@ -0,0 +1,28 @@
## Zsh completion function `_claude`
This version aims to be:
- Pure zsh (no jq, sed, awk, etc.).
- Generous with known subcommands and options from public Claude Code CLI docs/cheatsheets.[2][3]
- Extensible via simple arrays.
## How to enable in Oh My Zsh
1. In `~/.zshrc`, add `claude` to plugins:
```zsh
plugins=(
git
claude
)
```
2. Reload your shell:
```zsh
exec zsh
```
Now `claude <TAB>` will complete subcommands and flags on macOS, Linux, *BSD, and WSL2, because it relies only on zshs built-in completion engine and standard shell constructs.
***

249
plugins/claude/_claude Normal file
View File

@ -0,0 +1,249 @@
# Zsh completion for the `claude` CLI.
# Guard multiple loads
(( $+functions[_claude] )) && return 0
_claude() {
local curcontext="$curcontext" state line
typeset -A opt_args
_arguments -C \
'(-h --help)'{-h,--help}'[Show help information]' \
'(-V --version)'{-V,--version}'[Show CLI version]' \
'(-v --verbose)'{-v,--verbose}'[Increase verbosity]' \
'(-q --quiet)'{-q,--quiet}'[Reduce output]' \
'(-c --continue)'{-c,--continue}'[Continue most recent conversation]' \
'(-p --print)'{-p,--print}'[Print-only mode (no streaming)]' \
'(-y --yes)'{-y,--yes}'[Assume yes for all prompts]' \
'(-n --no-color)'{-n,--no-color}'[Disable colored output]' \
'(-C --config)'{-C,--config}'[Specify config file]:config file:_files' \
'(-o --output)'{-o,--output}'[Write response to file]:output file:_files' \
'(-m --model)'{-m,--model}'[Select Claude model]:model name:->model' \
'(-s --session)'{-s,--session}'[Use or resume session by ID]:session id: ' \
'(-i --input)'{-i,--input}'[Send file(s) as input]:input file(s):_files' \
'(-I --stdin)'{-I,--stdin}'[Read prompt from stdin]' \
'(-d --directory)'{-d,--directory}'[Working directory for context]:directory:_files -/' \
'(-)'{-,-\-}'[End of options]' \
'1:subcommand:->subcmd' \
'*::args:->args' && return 0
case $state in
model)
# Common Claude models easy to tweak/extend.
local -a models
models=(
'claude-4.1:General-purpose, high capability'
'claude-4.1-sonnet:Fast, strong reasoning'
'claude-4.1-haiku:Cheaper, very fast'
'claude-3.7-sonnet:Previous-gen balanced model'
)
_describe -t models 'Claude model' models
return
;;
subcmd)
_claude_subcommands
return
;;
args)
_claude_dispatch_subcommand
return
;;
esac
}
# Known subcommands & short descriptions
_claude_subcommands() {
local -a subcmds
subcmds=(
'chat:Start a new interactive chat'
'c:Continue the most recent conversation'
'r:Resume a conversation by ID'
'commit:Generate and apply a Git commit'
'review:Review a diff, PR, or file'
'edit:Edit file(s) using Claude'
'explore:Explore and summarize a codebase'
'mcp:Manage MCP servers and config'
'config:Show or edit CLI configuration'
'update:Update the Claude CLI'
'help:Show help for a subcommand'
)
_describe -t commands 'claude subcommand' subcmds
}
# Route completion based on subcommand
_claude_dispatch_subcommand() {
local -a words
words=(${words[@]}) # defensive copy
# First non-option word after 'claude'
local subcmd
for w in ${words[@]:1}; do
[[ $w == -* ]] && continue
subcmd=$w
break
done
[[ -z $subcmd ]] && { _claude_subcommands; return; }
case $subcmd in
chat)
_claude_chat
;;
c|continue)
_claude_continue
;;
r|resume)
_claude_resume
;;
commit)
_claude_commit
;;
review)
_claude_review
;;
edit)
_claude_edit
;;
explore)
_claude_explore
;;
mcp)
_claude_mcp
;;
config)
_claude_config
;;
update)
_claude_update
;;
help)
_claude_help
;;
*)
_message "No additional completions for: $subcmd"
;;
esac
}
# ---- Subcommand completion functions ----
_claude_chat() {
_arguments -C \
'(-m --model)'{-m,--model}'[Claude model]:model name:->model' \
'(-i --input)'{-i,--input}'[Attach file(s) as context]:file:_files' \
'(-p --print)'{-p,--print}'[Print full response when done]' \
'1:prompt text: ' \
'*:extra arguments: '
}
_claude_continue() {
_arguments -C \
'(-p --print)'{-p,--print}'[Print full response when done]' \
'1:optional prompt to continue with: ' \
'*:extra arguments: '
}
_claude_resume() {
_arguments -C \
'(-p --print)'{-p,--print}'[Print full response when done]' \
'1:session id: ' \
'2:prompt text: ' \
'*:extra arguments: '
}
_claude_commit() {
_arguments -C \
'--amend[Amend the previous commit]' \
'--no-verify[Skip pre-commit hooks]' \
'--all[Stage all modified files]' \
'--staged[Use only staged changes]' \
'--message=-[Override generated message]:message: ' \
'--branch=-[Describe current branch]:branch name: ' \
'*:file:_files'
}
_claude_review() {
_arguments -C \
'--staged[Review only staged changes]' \
'--patch[Review current diff/patch]' \
'--file=-[Review a specific file]:file:_files' \
'--pr=-[Review a pull request id or URL]:PR id or URL: ' \
'*:additional files or args:_files'
}
_claude_edit() {
_arguments -C \
'--in-place[Apply edits directly to files]' \
'--dry-run[Show changes without writing files]' \
'--diff[Show unified diff of edits]' \
'1:file to edit:_files' \
'*:additional files:_files'
}
_claude_explore() {
_arguments -C \
'--root=-[Root directory of project]:directory:_files -/' \
'--summary[Summarize the project structure]' \
'--map[Create or update a code map]' \
'*:paths to include:_files'
}
_claude_mcp() {
local -a mcp_sub
mcp_sub=(
'list:List configured MCP servers'
'add:Add a new MCP server'
'remove:Remove an MCP server'
'test:Test connectivity to a server'
'open:Open MCP config in editor'
)
_arguments -C \
'1:subcommand:->mcp_sub' \
'*::args:->mcp_args'
case $state in
mcp_sub)
_describe -t subcmds 'mcp subcommand' mcp_sub
;;
mcp_args)
local sub=${words[2]}
case $sub in
add)
_arguments -C \
'1:server name: ' \
'2:server URL: ' \
'*:extra options: '
;;
remove|test|open)
_arguments -C \
'1:server name: '
;;
list|*)
;;
esac
;;
esac
}
_claude_config() {
_arguments -C \
'1:action:(show edit path doctor)' \
'*:args: '
}
_claude_update() {
_arguments -C \
'--preview[Update to latest preview or beta]' \
'--force[Force re-install even if up to date]' \
'*:args: '
}
_claude_help() {
_arguments -C \
'1:command to show help for:->cmd' \
'*:args: '
[[ $state == cmd ]] && _claude_subcommands
}
# End of file

View File

@ -0,0 +1,10 @@
# Ensure compinit is available
autoload -Uz compinit
if ! typeset -f _completion_loader >/dev/null; then
compinit -u
fi
# Load our completion function
fpath=(${0:A:h} $fpath)
autoload -Uz _claude
compdef _claude claude