举个例子:
我是一个在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>时,我没有得到自动完成的分支名称。
理想情况下,我想自动完成只是神奇地为我所有的别名工作。这可能吗?如果做不到这一点,我想为每个别名手动定制它。那么,我该怎么做呢?
当前回答
您只需要找到完整的命令并复制具有别名的行即可。
我有别名d-m=“码头机”。d-m是docker-machine的别名。
所以在Mac上(通过brew),补全文件在cd ' brew——prefix ' /etc/bash_completion.d/。 对于我的案例,我编辑了名为docker-machine的文件。 在最下面是:
complete -F _docker_machine docker-machine
所以我添加了另一行,用我的别名:
complete -F _docker_machine docker-machine
complete -F _docker_machine d-m
其他回答
我知道这个问题是关于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文件中
您可以将Tab绑定到alias-expand-line并在~/.inputrc中完成(它的默认动作)。要做到这一点,你首先需要将每个动作绑定到一个键,然后将它们链接在一起:
"\M-z":alias-expand-line
"\M-x":complete
TAB:"\M-z\M-x"
你可以使用任何你喜欢的组合键,我使用元键,因为它是免费的。更多信息见男子3阅读线。
现在,如果你打开一个新终端,输入别名:
gco m<TAB>
线路将被改造成
git checkout master
当然,即使不涉及别名,Tab也将照常工作。
理想情况下,我想自动完成只是神奇地为我所有的别名工作。这可能吗?
是的,对于complete-alias项目(在Linux上),这是可能的。对Mac的支持是实验性的,但用户已经报告成功。
您只需要找到完整的命令并复制具有别名的行即可。
我有别名d-m=“码头机”。d-m是docker-machine的别名。
所以在Mac上(通过brew),补全文件在cd ' brew——prefix ' /etc/bash_completion.d/。 对于我的案例,我编辑了名为docker-machine的文件。 在最下面是:
complete -F _docker_machine docker-machine
所以我添加了另一行,用我的别名:
complete -F _docker_machine docker-machine
complete -F _docker_machine d-m
如果你使用别名g='git',我将这行代码添加到.bash_aliases中
complete -o default -o nospace -F _git g