如何获得命令别名的 bash 补全?

如何获得命令别名的 bash 补全?

我希望在命令行别名上获得制表符补全功能,例如,假设我定义了以下别名:

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

相关内容