举个例子:
我是一个在mac上的bash v3.2.17,我使用的git安装通过macports与bash_completion变体。
当我输入git checkout m<tab>。例如,我把它完成了。
然而,我有一个别名git结帐,gco。当我输入gco m<tab>时,我没有得到自动完成的分支名称。
理想情况下,我想自动完成只是神奇地为我所有的别名工作。这可能吗?如果做不到这一点,我想为每个别名手动定制它。那么,我该怎么做呢?
举个例子:
我是一个在mac上的bash v3.2.17,我使用的git安装通过macports与bash_completion变体。
当我输入git checkout m<tab>。例如,我把它完成了。
然而,我有一个别名git结帐,gco。当我输入gco m<tab>时,我没有得到自动完成的分支名称。
理想情况下,我想自动完成只是神奇地为我所有的别名工作。这可能吗?如果做不到这一点,我想为每个别名手动定制它。那么,我该怎么做呢?
当前回答
我知道这个问题是关于bash的,但如果你使用zsh,这个改变@hesky-fisher回答将修复它。
From
# For each defined alias, extract the necessary elements and use them
# to call wrap_alias.
eval "$(alias -p | sed -e 's/alias \([^=][^=]*\)='\''\([^ ][^ ]*\) *\(.*\)'\''/wrap_alias \1 \2 '\''\3'\'' /')"
to:
# For each defined alias, extract the necessary elements and use them
# to call wrap_alias.
eval "$(alias | sd '^([^=]+)=(.+)' 'wrap_alias $1=$2')"
你需要sd(这可以用sed代替,但sd在我看来更好)
这样做是因为zsh没有别名-p,并且zsh中的别名输出不输出
alias <something>=<value>
就像在狂欢,但是
<something>=<value>
顺便说一下,我把初始化代码放在。zlogin文件中
其他回答
在git-completion。Bash有一行:
complete -o default -o nospace -F _git git
查看这一行(和_git函数),你可以将这一行添加到你的.bash_profile:
complete -o default -o nospace -F _git_checkout gco
这个论坛页面展示了一个解决方案。
把这些行放到你的.bashrc或.bash_profile中:
# Author.: Ole J
# Date...: 23.03.2008
# License: Whatever
# Wraps a completion function
# make-completion-wrapper <actual completion function> <name of new func.>
# <command name> <list supplied arguments>
# eg.
# alias agi='apt-get install'
# make-completion-wrapper _apt_get _apt_get_install apt-get install
# defines a function called _apt_get_install (that's $2) that will complete
# the 'agi' alias. (complete -F _apt_get_install agi)
#
function make-completion-wrapper () {
local function_name="$2"
local arg_count=$(($#-3))
local comp_function_name="$1"
shift 2
local function="
function $function_name {
((COMP_CWORD+=$arg_count))
COMP_WORDS=( "$@" \${COMP_WORDS[@]:1} )
"$comp_function_name"
return 0
}"
eval "$function"
}
# and now the commands that are specific to this SO question
alias gco='git checkout'
# we create a _git_checkout_mine function that will do the completion for "gco"
# using the completion function "_git"
make-completion-wrapper _git _git_checkout_mine git checkout
# we tell bash to actually use _git_checkout_mine to complete "gco"
complete -o bashdefault -o default -o nospace -F _git_checkout_mine gco
这个解决方案类似于balshetzer的脚本,但只有这个对我有效。(巴尔谢策的脚本对我的一些别名有问题。)
如果你使用别名g='git',我将这行代码添加到.bash_aliases中
complete -o default -o nospace -F _git g
我知道这个问题是关于bash的,但如果你使用zsh,这个改变@hesky-fisher回答将修复它。
From
# For each defined alias, extract the necessary elements and use them
# to call wrap_alias.
eval "$(alias -p | sed -e 's/alias \([^=][^=]*\)='\''\([^ ][^ ]*\) *\(.*\)'\''/wrap_alias \1 \2 '\''\3'\'' /')"
to:
# For each defined alias, extract the necessary elements and use them
# to call wrap_alias.
eval "$(alias | sd '^([^=]+)=(.+)' 'wrap_alias $1=$2')"
你需要sd(这可以用sed代替,但sd在我看来更好)
这样做是因为zsh没有别名-p,并且zsh中的别名输出不输出
alias <something>=<value>
就像在狂欢,但是
<something>=<value>
顺便说一下,我把初始化代码放在。zlogin文件中
我有一个别名g='git',结合我的git别名,我键入如下内容
$ g co <branchname>
对于我的特定用例,更简单的解决方法是在git-completion中添加一行代码。
就在这条线下面:
__git_complete git _git
我添加了这一行来处理我的单个'g'别名:
__git_complete g _git