【问题标题】:Different directory for bash_completion (auto-complete subfolders under specified directory)bash_completion 的不同目录(自动完成指定目录下的子文件夹)
【发布时间】:2016-08-03 07:57:49
【问题描述】:

能够在我的系统上的任何位置输入dev my-[tab] 并接收自动完成,例如

$ dev my-[tab]
my-project
my-awesome-project

我在/etc/bash_completion.d/ 中创建了一个文件,内容如下:

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

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

complete -F _dev dev

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

[~] $ dev my-p[tab]
[~] $ dev my-project/[tab][tab]
src    doc
[~] $ dev my-project/s[tab][enter]
[/development/my-project/src] $

所以基本上,我希望 dev 自动完成,就像 cd 一样。

dev 只是一个别名:

alias dev='gotodev'
gotodev ()
{ 
    cd /development/$1
}

【问题讨论】:

    标签: bash-completion


    【解决方案1】:

    刚刚写了一个例子:

    [/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/
    ... ...
    

    【讨论】:

    • 如果您只想在建议中显示最后一个目录而不是完整路径,您可以添加以下选项:在“_dev()”函数中添加以下选项:“compopt -o 文件名”。来源:stackoverflow.com/q/19752622/2450748
    • @nexayq,还是只是complete -o filenames ...?我没有把它放在函数中。
    • 你是对的,两种方法都达到了相同的结果。正如您所提到的,更多的用户可能更愿意在命令中添加一个选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    相关资源
    最近更新 更多