2016-06-01 9 views
4

私は一種バッシュ完了(CD CCN <tab> => CDのCamel.CaseName)

Foo.Bar.Baz/ 
Foo.Bar.QuickBrown.Fox/ 
Foo.Bar.QuickBrown.Interface/ 
Foo.Bar.Query.Impl/ 
完了が働くだろう

のファイル/ディレクトリ名の補完を実装する方法を探しています以下のような

~ $ cd QI<tab><tab> 
Foo.Bar.QuickBrown.Interface/ Foo.Bar.Query.Impl/ 
~ $ cd QIm<tab><enter> 
~/Foo.Bar.Query.Impl $ 

しかし、入力(例えばQIm。 - >*Q*I*m)からグロブパターンを構築する私の単純なアプローチはまったく同じプレフィックスを共有するファイル/ディレクトリでは動作しません。上記の場合、I、すなわちバッシュ

~ $ cd QI<tab><tab> 
Foo.Bar.QuickBrown.Interface/ Foo.Bar.Query.Impl/ 
~ $ cd Foo.Bar.Qu<tab><tab> 
Foo.Bar.QuickBrown.Fox/ Foo.Bar.QuickBrown.Interface/ Foo.Bar.Query.Impl/ 

を取得し、この場合、より大きな完成セットをもたらす可能補完の最長の共通のプレフィックスと現在の単語を置き換えます。

ここに私の補完機能があります:

_camel_case_complete() 
{ 
    local cur pat 
    COMPREPLY=() 
    cur="${COMP_WORDS[COMP_CWORD]}" 
    pat=$(sed -e 's/\([A-Z]\)/*\1*/g' -e 's/\*\+/*/g' <<< "$cur") 
    COMPREPLY=($(compgen -G "${pat}" -- $cur)) 
    return 0 
} 

任意のヒントは、通常のファイル名/ディレクトリの完了を壊すことなく、この問題を解決する方法?

答えて

1

次の例を参照してください。

% ls -l 
total 20 
-rw-r--r-- 1 root root 315 2016-06-02 18:30 compspec 
drwxr-xr-x 2 root root 4096 2016-06-02 17:56 Foo.Bar.Baz 
drwxr-xr-x 2 root root 4096 2016-06-02 17:56 Foo.Bar.Query.Impl 
drwxr-xr-x 2 root root 4096 2016-06-02 17:56 Foo.Bar.QuickBrown.Fox 
drwxr-xr-x 2 root root 4096 2016-06-02 17:56 Foo.Bar.QuickBrown.Interface 
% cat compspec 
_camel_case_complete() 
{ 
    local cur=$2 
    local pat 

    pat=$(sed -e 's/[A-Z]/*&/g' -e 's/$/*/' -e 's/\*\+/*/g' <<< "$cur") 
    COMPREPLY=($(compgen -G "${pat}")) 
    if [[ ${#COMPREPLY[@]} -gt 1 ]]; then 
     # Or use " " instead of "__" 
     COMPREPLY[${#COMPREPLY[@]}]="__" 
    fi 

    return 0 
} 

complete -F _camel_case_complete cd 
% . ./compspec 
% cd QI<TAB><TAB> 
__       Foo.Bar.QuickBrown.Interface 
Foo.Bar.Query.Impl 
% cd QIm<TAB> 
% cd Foo.Bar.Query.Impl<SPACE> 
関連する問題