当前位置: 首页>>技术问答>>正文


如何使用auto-complete创建脚本?

,

问题描述

当我使用svn这样的程序时,我在Gnome Terminal中输入:

svn upd

并打Tab它自动完成:

svn update

是否有可能在我的自定义bash脚本中做这样的事情?

最佳解决方法

您可以使用Programmable Completion。例如,请查看/etc/bash_completion/etc/bash_completion.d/*

次佳解决方法

我迟了六个月,但我正在寻找同样的事情,并发现这一点:

你将不得不创建一个新文件:

/etc/bash_completion.d/foo

对于静态自动完成(例如--help /--verbose),添加以下内容:

_foo() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts="--help --verbose --version"

    if [[ ${cur} == -* ]] ; then
        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
        return 0
    fi
}
complete -F _foo foo
  • COMP_WORDS是包含当前命令行中所有单个单词的数组。

  • COMP_CWORD是包含当前光标位置的单词的索引。

  • COMPREPLY是Bas​​h读取可能的完成数组的变量。 compgen -W“–help –verbose –version” – “”

此命令返回与当前字"${cur}"匹配的--help--verbose--version中的元素数组

来源:http://www.debian-administration.org/articles/316

第三种解决方法

这是一个完整的教程。

让我们有一个名为admin.sh的脚本示例,您希望自动完成工作。

#!/bin/bash

while [ $# -gt 0 ]; do
  arg=$1
  case $arg in
    option_1)
     # do_option_1
    ;;
    option_2)
     # do_option_1
    ;;
    shortlist)
      echo option_1 option_2 shortlist
    ;;
    *)
     echo Wrong option
    ;;
  esac
  shift
done

注意选项短名单。使用此选项调用脚本将打印出此脚本的所有可能选项。

在这里你有自动完成脚本:

_script()
{
  _script_commands=$(/path/to/your/script.sh shortlist)

  local cur
  COMPREPLY=()
  cur="${COMP_WORDS[COMP_CWORD]}"
  COMPREPLY=( $(compgen -W "${_script_commands}" -- ${cur}) )

  return 0
}
complete -o nospace -F _script ./admin.sh

请注意,要完成的最后一个参数是要添加自动完成的脚本的名称。您只需将自动完成脚本添加到bashrc中即可

source /path/to/your/autocomplete.sh

或将其复制到/etc/bash.completion.d

第四种方法

如果你想要的只是一个简单的基于auto-completion的单词(因此没有子命令完成或任何其他),complete命令有一个-W选项,只是做正确的事情。

例如,我的.bashrc中有以下行来自动完成名为jupyter的程序:

# gleaned from `jupyter --help`
_jupyter_options='console qtconsole notebook' # shortened for this answer
complete -W "${_jupyter_options}" 'jupyter'

现在jupyter <TAB> <TAB>自动为我完成。

gnu.org上的docs很有帮助。

它似乎依赖于正确设置IFS变量,但这对我没有任何问题。

要添加文件名完成和默认BASH完成,请使用-o选项:

complete -W "${_jupyter_options}" -o bashdefault -o default 'jupyter'

要在zsh中使用它,请在~/.zshrc中运行complete命令之前添加以下代码:

# make zsh emulate bash if necessary
if [[ -n "$ZSH_VERSION" ]]; then
    autoload bashcompinit
    bashcompinit
fi

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/755.html,未经允许,请勿转载。