如何在不破坏原功能的前提下扩展Git commit命令的补全?
扩展Git Commit的-m/--message补全(不破坏原有功能)
问题背景
想要为git commit -m或git commit --message添加自定义补全选项,同时保留git commit原有的所有补全功能。最初尝试直接覆盖系统的_git-commit补全函数,结果触发无限递归错误:
_git-commit:1: maximum nested function level reached; increase FUNCNEST?
错误原因
直接定义新的_git-commit函数并在内部调用原_git-commit时,会导致函数无限递归调用自己,超出Zsh的嵌套层级限制。
解决方案
通过备份原补全函数的方式避免递归,同时在原补全逻辑之后追加自定义补全规则:
- 创建(或修改)
~/.zsh/completions/_git-commit文件,内容如下:
#compdef git-commit # 备份系统原有的_git-commit函数 _original_git-commit="$functions[_git-commit]" _git-commit() { # 先执行原有的补全逻辑 $_original_git-commit "$@" # 定义自定义补全选项 local -a custom_messages custom_messages=( 'hello-git:our first autocompletion function.' 'version:show the used gem version.' ) # 处理`git commit -m `或`git commit --message `的补全场景 if (( CURRENT == 3 )); then case $words[2] in -m|--message|--message=) _describe -t custom_messages 'custom commit messages' custom_messages ;; esac fi # 处理`git commit --message=`后直接补全的场景(光标在=后) if (( CURRENT == 2 )) && [[ $words[2] == --message=* ]]; then _describe -t custom_messages 'custom commit messages' custom_messages fi return 0 }
确保
~/.zsh/completions已加入fpath(若未添加,在~/.zshrc中追加:fpath+=~/.zsh/completions)重新加载Zsh配置:
source ~/.zshrc
效果验证
执行git commit -m (留空格后按Tab),会同时显示原有补全建议和自定义的hello-git、version选项;git commit的其他参数补全完全保留原有功能。
内容的提问来源于stack exchange,提问作者ahmetkca
相关产品推荐
相关产品推荐

