bash-completion - completion function defined the first time a command is invoked

后端 未结 3 2008
醉梦人生
醉梦人生 2020-12-09 23:46

I\'ve added a new alias scp_using_rsync, which uses rsync to copy files over SSH with certain options. I wanted to link the bash completion for scp to this alia

相关标签:
3条回答
  • 2020-12-10 00:06

    Bash 4.1 added a new -D option for complete, compgen and compopt:

    New complete/compgen/compopt -D option to define a `default' completion: a completion to be invoked on command for which no completion has been defined. If this function returns 124, programmable completion is attempted again, allowing a user to dynamically build a set of completions as completion is attempted by having the default completion function install individual completion functions each time it is invoked.

    There's an example from bash's manual:

    _completion_loader()
    {
         . "/etc/bash_completion.d/$1.sh" >/dev/null 2>&1 && return 124
    }
    complete -D -F _completion_loader
    
    0 讨论(0)
  • 2020-12-10 00:07

    I had an issue applying whjm's answer. As Tuxdude noticed, there was already a function _completion_loader defined in my distribution (Ubuntu 14.04). The function was defined as follows:

    _completion_loader () 
    { 
        local compfile=./completions;
        [[ $BASH_SOURCE == */* ]] && compfile="${BASH_SOURCE%/*}/completions";
        compfile+="/${1##*/}";
        [[ -f "$compfile" ]] && . "$compfile" &> /dev/null && return 124;
        complete -F _minimal "$1" && return 124
    }
    

    I wanted to make keep the maintenance of the completions all in one place, so I added a file to /usr/share/bash-completion/completions/ with the name of the command I wanted to add completion for. For your case, you could add a file called scp_using_rsync containing this:

    cfile="${compfile%/*}/scp"
    cmd="${1##*/}"
    . "$cfile" 
    complete -F _scp $cmd
    

    This will source the file that defines completions for scp, including the _scp function, and then add the completion for your command. I felt this is a more direct and consistent way (though of course to do this, you must be ok with changing this behavior for all users.)

    0 讨论(0)
  • 2020-12-10 00:10

    Some completion functions are dynamically loaded. You can manually load them so that they will work with aliases. For example, you can add this to your ~/.bashrc so that completion will work with your alias.

    _completion_loader docker

    0 讨论(0)
提交回复
热议问题