将自动完成功能与getopts结合使用

时间:2015-02-26 16:02:26

标签: macos bash shell

在使用git checkout功能时,我创建了一个名为“gc”的脚本来自动填充git分支名称,例如键入gc mob-102然后按两次选项卡将显示匹配的分支名称,例如mob-1025-a,mob-1025-b,mob-1021-end等。

function gc() {
  git checkout "$1"
}

_gc() {
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    local branch_names=$(git branch|xargs basename|grep -v '*')
    local tag_names=$(git tag)
    local remote_branch_names=$(git branch -r|xargs basename|grep -Ev "HEAD|->")
    local all_branch_and_tag_names=${branch_names}${remote_branch_names}${tag_names}
    COMPREPLY=($(compgen -W "${all_branch_and_tag_names}" $cur))
}
complete -F _gc gc

我把它放到我的.bash_profile中,这很好。但是,现在我正在尝试添加一个可选的“-b”选项,这样你就可以拥有git checkout -b <new branch name>功能,即从当前分支创建一个新的分支,例如 gc -b my_new_branch。如果你没有传递“-b”选项,我希望自动完成功能像以前一样工作。

之前我在其他脚本中使用过getopts,但我似乎无法让它工作。我试过的一种方法是:

    function gc() {
        if [[ $# -gt 1 ]]
        then
          echo "There is more than one argument on the command line"
          while getopts ":b:" opt; do
            echo "Got an option: $OPTARG"
            case $opt in
              b)
                echo "Got the -b option with $OPTARG"
                git checkout -b "$OPTARG"
                ;;
             \?)
               echo "Invalid option: -$OPTARG" >&2
               exit 1
               ;;
            esac
          done
       else
          gc_branch_complete "$1"
       fi
    }

function gc_branch_complete() {
    git checkout "$1"
}

_gc() {
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    local branch_names=$(git branch|xargs basename|grep -v '*')
    local tag_names=$(git tag)
    local remote_branch_names=$(git branch -r|xargs basename|grep -Ev "HEAD|->")
    local all_branch_and_tag_names=${branch_names}${remote_branch_names}${tag_names}
    COMPREPLY=($(compgen -W "${all_branch_and_tag_names}" $cur))
}
complete -F _gc gc_branch_complete

奇怪的是,这似乎在第一次运行时起作用,但在随后的调用中却没有。

有没有比这更好的方法?

0 个答案:

没有答案