我希望在命令行别名上获得制表符补全功能,例如,假设我定义了以下别名:
alias apt-inst='sudo aptitude install'
当我按下 Tab 键时,有没有办法获得 aptitude 提供的补全?即,当我编写“sudo aptitude install gnumer”并点击选项卡时,aptitude 会将其完成为 gnumeric,或者如果存在不确定性,则会列出以 gnumer 开头的所有可用软件包。如果我使用我的别名来执行此操作,则什么也没有 - 没有完成。
答案1
尝试完整别名,这正好解决了这个问题。 (免责声明complete_alias
: 我是)的作者
安装后,您可以使用一个通用函数来完成许多别名,如下所示:
complete -F _complete_alias <myalias1>
complete -F _complete_alias <myalias2>
complete -F _complete_alias <myalias3>
您可能希望complete_alias
通过或类似方式在每个 bash 实例中获取该文件.bash_profile
。
安装
mkdir ~/.bash_completion.d
curl https://raw.githubusercontent.com/cykerway/complete-alias/master/complete_alias \
> ~/.bash_completion.d/complete_alias
应用
source ~/.bash_completion.d/complete_alias
alias container=docker\ container
complete -F _complete_alias container
container
现在可以由原始_docker()
完成处理程序自动完成;
$ container l<Tab>
logs ls
$ container s<Tab>
start stats stop
答案2
有Ubuntu 论坛上有一个关于此问题的精彩帖子。 Ole J 提出以下别名补全定义函数:
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))
# Quotes here are important
COMP_WORDS=( "$@" \"\${COMP_WORDS[@]:1}\" )
"$comp_function_name"
return 0
}"
eval "$function"
echo $function_name
echo "$function"
}
使用它为别名定义补全函数,然后指定该函数作为别名的补全器:
make-completion-wrapper _apt_get _apt_get_install apt-get install
complete -F _apt_get_install apt-inst
我更喜欢使用别名将常用的参数添加到现有程序中。例如,对于grep
,我总是想跳过设备和二进制文件,因此我为 制作了一个别名grep
。为了添加新命令,例如grepbin
,我在文件夹中使用 shell 脚本~/bin
。如果该文件夹在您的路径中,它将自动完成。
答案3
通过谷歌搜索这个问题,我最终来到了这里,所以我尝试了其他答案中的方法。由于各种我实际上不明白的原因,它们在我的 Ubuntu 16.04 中从未正常运行。
最终对我有用的事情比预期的要微不足道。我想使用与 相同的自动完成rsync
功能mycommand
。因此,我查找了自动完成函数,然后进行了complete
相应的调用。
# Lookup of name of autocompletion function used for rsync
_completion_loader rsync; complete -p rsync
# Returns: complete -o nospace -F _rsync rsync
# Sourcing the rsync functions before, then using the same function for 'mycommand'
. /usr/share/bash-completion/completions/rsync
complete -o nospace -F _rsync mycommand
免责声明:我不确定我的方法与其他方法相比有什么缺点。我写这篇文章主要是因为它可以帮助人们,这种简单的方法可能就足够了。
答案4
2018年答案
您必须将别名添加到程序“完整”中。根据您想要实现的自动完成类型,您必须使用 -c 或 -F。
对于包自动完成:
complete -c name_of_your_alias
对于命令自动完成:
complete -F name_of_your_alias
要检查您的别名是否已正确添加:
complete | grep name_of_your_alias
最后,从“完整”中删除别名:
complete -r name_of_your_alias
在你的情况下:
complete -c apt-inst