mirror of
https://github.com/ohmyzsh/ohmyzsh.git
synced 2025-12-12 15:34:50 +08:00
Merge e7bc587a0b into 72acd2ca90
This commit is contained in:
commit
5628cefa32
28
plugins/claude/README.md
Normal file
28
plugins/claude/README.md
Normal 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 zsh’s built-in completion engine and standard shell constructs.
|
||||
***
|
||||
249
plugins/claude/_claude
Normal file
249
plugins/claude/_claude
Normal 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
|
||||
10
plugins/claude/claude.plugin.zsh
Normal file
10
plugins/claude/claude.plugin.zsh
Normal 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
|
||||
Loading…
Reference in New Issue
Block a user