bash_completion 的不同目录(自动完成指定目录下的子文件夹)

Jen*_*ens 3 bash-completion

能够进入dev my-[tab]我系统上的任何地方并接收自动完成,例如

$ dev my-[tab]
my-project
my-awesome-project
Run Code Online (Sandbox Code Playgroud)

我创建了一个包含/etc/bash_completion.d/以下内容的文件:

_dev()
{
    PROJECTS=$(ls /development)
    local cur=${COMP_WORDS[COMP_CWORD]}

    COMPREPLY=( $(compgen -W "${PROJECTS}" -- $cur) )
}

complete -F _dev dev
Run Code Online (Sandbox Code Playgroud)

这工作得很好,但我也希望能够自动完成子文件夹:

[~] $ dev my-p[tab]
[~] $ dev my-project/[tab][tab]
src    doc
[~] $ dev my-project/s[tab][enter]
[/development/my-project/src] $
Run Code Online (Sandbox Code Playgroud)

所以基本上,我希望以devcd.

dev 只是一个别名:

alias dev='gotodev'
gotodev ()
{ 
    cd /development/$1
}
Run Code Online (Sandbox Code Playgroud)

pyn*_*exj 7

刚刚写了一个例子:

[/tmp] # cat compspec
g_proj_dir=/tmp/projects

dev()
{
    cd $g_proj_dir/$1
}

_dev()
{
    local cmd=$1 cur=$2 pre=$3
    local _cur compreply

    _cur=$g_proj_dir/$cur
    compreply=( $( compgen -d "$_cur" ) )
    COMPREPLY=( ${compreply[@]#$g_proj_dir/} )
    if [[ ${#COMPREPLY[@]} -eq 1 ]]; then
        COMPREPLY[0]=${COMPREPLY[0]}/
    fi
}

complete -F _dev -o nospace dev
[/tmp] # source ./compspec
[/tmp] #
[/tmp] # cd /tmp/
[/tmp] # mkdir -p projects/{bar,foo}{1,2}/mod{1,2}/submod{1,2}
[/tmp] # touch    projects/{bar,foo}{1,2}/mod{1,2}/submod{1,2}/file{1,2}
[/tmp] # dev <TAB><TAB>
bar1  bar2  foo1  foo2
[/tmp] # dev f<TAB>
[/tmp] # dev foo
[/tmp] # dev foo<TAB><TAB>
foo1  foo2
[/tmp] # dev foo2<TAB>
[/tmp] # dev foo2/
[/tmp] # dev foo2/<TAB>
[/tmp] # dev foo2/mod
[/tmp] # dev foo2/mod<TAB><TAB>
foo2/mod1  foo2/mod2
[/tmp] # dev foo2/mod2<TAB>
[/tmp] # dev foo2/mod2/
... ...
Run Code Online (Sandbox Code Playgroud)

  • @nexayq,或者只是“完整的-o文件名...”?我没有明白将它放入 func 中的意义。 (2认同)