我正在将go
用作简单的bash别名git checkout branchname
。我想念的是自动完成功能,可与完整git checkout branchna...
命令一起使用,但不能在别名中使用。
有没有一种方法可以指示Bash为另一个命令“继承”自动完成的“驱动程序”?
我正在将go
用作简单的bash别名git checkout branchname
。我想念的是自动完成功能,可与完整git checkout branchna...
命令一起使用,但不能在别名中使用。
有没有一种方法可以指示Bash为另一个命令“继承”自动完成的“驱动程序”?
git-dir
则使用this。
Answers:
如果可以找到原始命令使用的完成功能,则可以使用将其分配给别名complete -F
。
例如,在我的ubuntu框上,所使用的完成函数git checkout
是_git_checkout
(位于中/etc/bash_complete.d/git
)。
运行之前complete -F
:
[me@home]$ git checkout <TAB><TAB>
HEAD master origin/HEAD origin/master
[me@home]$ alias go="git checkout"
[me@home]$$ go <TAB><TAB>
.git/ precommit_config.py README.md SvnSentinel/
.gitignore precommit.py startcommit.py tests/
后:
[me@home]$$ complete -F _git_checkout go
[me@home]$$ go <TAB><TAB>
HEAD master origin/HEAD origin/master
使用后complete -F
:
complete -F _git_checkout go
跳完后go
可能会导致:
bash: [: 1: unary operator expected
complete
使用__git_complete
这是git bash补全的内置功能。
声明别名后,将正确的自动完成功能绑定到该别名:
alias g="git"
__git_complete g _git
alias go="git checkout"
__git_complete go _git_checkout
alias gp="git push"
__git_complete gp _git_push
__git_complete
bash-completion程序包中有此功能(使用brew install bash-completion
,通过homebrew安装),该功能当前未包含在我的bash配置文件中。必须将此行添加到〜/ .bash_profile:[ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion
git checkout
别名下添加__git_complete就像魅力一样!
__git_main
,不是_git
。_git
存在的原因仅是为了向后兼容,它基本上是__git_main
包装好的。
在Ubuntu 16.04.3 LTS中,我需要提供的文件是/usr/share/bash-completion/completions/git
。所以在.bash_custom
(或.bashrc,无论如何)中:
[ -f /usr/share/bash-completion/completions/git ] && . /usr/share/bash-completion/completions/git
__git_complete g __git_main
.bashrc
在读取时已经太迟了。
在Ubuntu 18.04(Bionic)上,以下工作正常。加入这样的片段(与你的别名)为您的首选bash的配置文件,例如.bashrc
,.bash_aliases
.bash_profile
。
# define aliases
alias gc='git checkout'
alias gp='git pull'
# setup autocompletion
if [ -f "/usr/share/bash-completion/completions/git" ]; then
source /usr/share/bash-completion/completions/git
__git_complete gc _git_checkout
__git_complete gp _git_pull
else
echo "Error loading git completions"
fi
通常,__git_complete
伪指令的格式如下:
__git_complete <YOUR ALIAS> _git_<GIT COMMAND NAME>
这将现有答案中的智慧整合到一个最新的答案中,谢谢大家。
echo "profile"
/ echo "rc"
,我才算出那个。
要添加其他出色的答案:通常,您有很多Git别名,为所有别名手动转发完成内容可能很繁琐。这是自动执行此操作的一个小技巧:
if [ -f "/usr/share/bash-completion/completions/git" ]; then
# Enable Git completions for aliases
. /usr/share/bash-completion/completions/git
for a in $(alias | sed -n 's/^alias \(g[^=]*\)=.git .*/\1/p'); do
c=$(alias $a | sed 's/^[^=]*=.git \([a-z0-9\-]\+\).*/\1/' | tr '-' '_')
if set | grep -q "^_git_$c *()"; then
eval "__git_complete $a _git_$c"
fi
done
fi
在Linux Mint上,这对我不起作用。我正在bash: [: 1: unary operator expected
。
我发现以下响应效果很好-用户提供的“疑难解答”部分非常有帮助。 /superuser/436314/how-can-i-get-bash-to-perform-tab-completion-for-my-aliases
在Ubuntu 20.04上,我将其添加到 ~/.bashrc
source /usr/share/bash-completion/completions/git
alias g='git'
__git_complete g _git
alias go='git checkout'
__git_complete go _git_checkout
正如其他人回答的那样,您应该使用__git_complete
,否则脚本将失败。
alias g="git"
__git_complete g __git_main
alias g="gl"
__git_complete gl _git_log
但是您不应该使用_git
main命令,它是__git_main
。
不幸的是,许多关于完成的信息被隐藏了,但是您可以在我的fork的自述文件中找到更多信息:git-completion。
我意识到您是在专门询问bash别名,但是对于那些来这里寻找复杂git别名的bash自动完成功能的人,请参见此处。
尤其是:
# If you use complex aliases of form '!f() { ... }; f', you can use the null
# command ':' as the first command in the function body to declare the desired
# completion style. For example '!f() { : git commit ; ... }; f' will
# tell the completion to use commit completion. This also works with aliases
# of form "!sh -c '...'". For example, "!sh -c ': git commit ; ... '".