假设 bash 配置了以下别名:
alias up="git --git-dir /path/to/backup/.git"
并且该特定存储库 - 并且只有该存储库 - 具有以下 git 别名:
[alias]
backup = commit --allow-empty-message
如何up
自动完成backup
?
这会自动完成backup
但不会up
:
cd /a/different/dir
git --git-dir=/path/to/backup/.git ba
这会使用标准 git 命令自动完成up
,但不backup
:
complete -o bashdefault -o default -o nospace -F __git_wrap__git_main up
编辑:Etan是对的,完成函数需要看到扩展的别名,所以我创建了以下内容:
CompletableAlias() {
if (($#<2)); then
return 1
fi
source_c="$1"
target_c="$2"
target_a=( "${@:2}" )
target_s="${target_a[*]}"
alias "${source_c}=${target_s}"
completion_modifier="__${source_c}_completion"
completion_original="$( complete -p "$target_c" 2>/dev/null |
sed 's/.*-FW+(w+).*/1/'
)"
if [[ -n "$completion_original" ]]; then
read -r -d '' completion_function <<-EOF
function $completion_modifier() {
COMP_LINE="${COMP_LINE/#${source_c}/${target_s}}"
((COMP_POINT+=${#target_s}-${#source_c}))
((COMP_CWORD+=${#target_a[@]}-1))
COMP_WORDS=( ${target_a[@]} ${COMP_WORDS[@]:1} )
$completion_original
}
EOF
eval "$completion_function"
completion_command="$( complete -p "$target_c" |
sed "s/${completion_original}/${completion_modifier}/;
s/w+$/${source_c}/"
)"
$completion_command
fi
}
source "/usr/share/bash-completion/completions/git"
CompletableAlias "up" "git" "--git-dir" "/path/to/backup/.git"
但有莫名其妙的问题:
-
up bac<Tab>
不起作用 -
up <Tab>
使用默认补全,不列出 git 子命令 - 还有更多...
编辑 2:更新了脚本以使用别名命令的 Re:Bash 完成中的建议修复上述问题。显然,这是一项非常常见的任务。但是现在我遇到了此错误消息:
$ cd /a/different/dir
$ up backup<Tab> fatal: Not a git repository (or any of the parent directories): .git
在如此复杂的情况下,你不应该真的使用别名,使用 bash 函数。别名更像是 C 中的预处理器(在使用意义上),当函数更像是......代码函数。而且我发现它们也更"自动完成"。
您还可以查看如何在其他贝壳(如鱼)上解决此问题。