2016-06-01 8 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>