29
說bash的配置有以下別名:擊完成:別名完成榮譽庫特定的Git的別名
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
這種自動完成up
標準Git命令而不是backup
:
complete -o bashdefault -o default -o nospace -F __git_wrap__git_main up
編輯:伊坦是正確的,完成功能需要看到擴大的別名,所以我創建了以下內容:
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/.*-F\W\+\(\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 completion of aliased commands。顯然這是一個相當普遍的任務。但是現在我遇到了這樣的錯誤消息:
$ cd /a/different/dir
$ up backup<Tab> fatal: Not a git repository (or any of the parent directories): .git
完成函數看到「up」還是擴展的別名? –
如果完成函數在命令中讀入'up',它不會像預期的那樣運行,則使用輔助函數展開爲'backup',以便確保將確切的命令發送到完成函數。這就是許多完成者功能的方式,他們期望(或假設)命令是他們編程的。因此,如果你去附加一個其他命令的完成者,它不會工作(因此中間人功能)。要開始你可能會顯示一些調用-xv的輸出,以確保你的函數正在做你期望的(或者它的差異) – osirisgothra