2016-06-01 10 views
4

Ich bin auf der Suche nach einer Möglichkeit, Abschluss für Datei-/Verzeichnisnamen der ArtBash Abschluss für Camel.CaseNames (cd CCN <tab> => cd Camel.CaseName)

Foo.Bar.Baz/ 
Foo.Bar.QuickBrown.Fox/ 
Foo.Bar.QuickBrown.Interface/ 
Foo.Bar.Query.Impl/ 

wo die Fertigstellung funktionieren würde, zu implementieren wie

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

jedoch mein stark vereinfachten Ansatz ein glob Musters aus dem Eingang des Gebäudes (zB QIm -.>*Q*I*m) funktioniert nicht genau für Dateien/Verzeichnisse des gleichen Präfix teilen. In dem Fall, der oben erhalte 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/ 

d.h. bash das aktuelle Wort mit dem längsten gemeinsamen Präfix der möglichen Vervollständigungen, die in diesem Fall führt zu einem größeren Abschluss Satz ersetzt.

Hier ist meine Vervollständigungsfunktion:

_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 
} 

Irgendwelche Hinweise, wie dieses Problem zu beheben, ohne die normalen Dateinamen/Verzeichnis Abschluss zu brechen?

Antwort

1

Siehe folgendes Beispiel:

% 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>