如何获得命令别名的 bash 完成?

lev*_*que 96 bash alias autocomplete

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

alias apt-inst='sudo aptitude install'
Run Code Online (Sandbox Code Playgroud)

当我按下 Tab 键时,有没有办法获得 aptitude 提供的补全?即,当我编写“sudo aptitude install gnumer”并点击选项卡时,aptitude 会将其完成为 gnumeric,或者如果存在不确定性,则会列出所有以 gnumer 开头的可用软件包。如果我使用我的别名,什么都没有 - 没有完成。

Cyk*_*ker 62

试试complete-alias,它正好解决了这个问题。(免责声明:我是作者complete_alias

安装后,您可以使用一个通用函数来完成许多别名,如下所示:

complete -F _complete_alias <myalias1>
complete -F _complete_alias <myalias2>
complete -F _complete_alias <myalias3>
Run Code Online (Sandbox Code Playgroud)

您可能希望complete_alias通过.bash_profile或类似方式在每个 bash 实例中获取文件。

安装

mkdir ~/.bash_completion.d
curl https://raw.githubusercontent.com/cykerway/complete-alias/master/complete_alias \
     > ~/.bash_completion.d/complete_alias
Run Code Online (Sandbox Code Playgroud)

应用

source ~/.bash_completion.d/complete_alias

alias container=docker\ container
complete -F _complete_alias container
Run Code Online (Sandbox Code Playgroud)

container现在可以由原始_docker()完成处理程序自动完成;

$ container l<Tab>
logs  ls    

$ container s<Tab>
start  stats  stop   
Run Code Online (Sandbox Code Playgroud)

  • 这是一个出色且非常全面的答案,效果很好,谢谢!它可能已经更新,因为@muru 遇到了问题。 (6认同)
  • @muru 我想在这里粘贴一些代码,但它可能比这里接受的要长。我假设人们阅读 README 文件中的 *Install* 部分没有问题,在这种情况下,它只有几行。 (4认同)
  • 这是一个足够的答案,它完全解决了问题。 (3认同)
  • 鉴于该软件似乎是您的,您可以做得比这更好。添加安装说明。描述它的作用以及如何使用它。否则这只是垃圾邮件。 (2认同)
  • 关键是能够判断访问所述自述文件是否值得,仅从答案即可。 (2认同)

Sha*_*off 43

在 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))
      COMP_WORDS=( "$@" \${COMP_WORDS[@]:1} )
      "$comp_function_name"
      return 0
    }"
  eval "$function"
  echo $function_name
  echo "$function"
}
Run Code Online (Sandbox Code Playgroud)

使用它来定义别名的完成函数,然后将该函数指定为别名的完成函数:

make-completion-wrapper _apt_get _apt_get_install apt-get install
complete -F _apt_get_install apt-inst
Run Code Online (Sandbox Code Playgroud)

我更喜欢使用别名向现有程序添加始终使用的参数。例如,对于grep,我总是想跳过设备和二进制文件,所以我为grep. 为了添加诸如 之类的新命令grepbin,我在我的~/bin文件夹中使用了一个 shell 脚本。如果该文件夹在您的路径中,它将自动完成。

  • 太棒了,我怕这是不可能的。 (2认同)

小智 8

通过谷歌搜索这个问题,我最终到了这里,所以我尝试了其他答案中的方法。由于各种原因,我实际上并不理解,它们在我的 Ubuntu 16.04 中从未表现得很好。

最终对我有用的东西比预期的要琐碎得多。我想使用与rsyncfor相同的自动完成功能mycommand。因此,我查找了自动完成功能,然后相应地调用了它complete

# Lookup of name of autocompletion function used for 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
Run Code Online (Sandbox Code Playgroud)

免责声明:与其他方法相比,我不确定我的方法的缺点是什么。我主要写这个是因为它可以帮助人们使用这种微不足道的方法可能就足够了。

  • 事实证明,执行此操作的方法是首先调用`_completion_loader rsync`,以确保完成函数已加载。有时(总是?)仅当您第一次尝试使用该函数自动完成时才会加载它。这个答案还有另一个问题:它无法根据提供的参数上下文自动完成。例如,它不能像“pass -c”那样为“pass -c”自动完成创建别名,只能像“pass”那样。这些是不同的。 (4认同)
  • bash 似乎会说“bash:完整:XYZ:没有完成规范”,直到您第一次真正尝试使用“XYZ”完成。我认为编辑用户 `.bash_completion` 文件是正确的方法,尽管我仍然不确定如何...... (2认同)