2012-11-07 5 views
4

vim을 완성하기위한 작은 bash 함수를 작성했습니다. 이 함수는 다음과 같다 : 나는 그것이 _VIM_IGNORE 변수를 정의하고 그에게 FIGNORE를 설정하여 확장 PDF, DVI 등의 파일을 무시하도록 노력했다vim을위한 bash 완성에서 파일 확장자를 무시하십시오

# completion for vim 
_vim() 
{ 
    local cur prev 

    COMPREPLY=() 
    _get_comp_words_by_ref cur prev 

    case $prev in 
     -h|--help|-v|--version) 
      return 0 
      ;; 
    esac 

    if [[ "$cur" == -* ]] ; then 
     local _vopts='-v -e -E -s -d -y -R -Z -m -M -b -l -C' 
     _vopts="${_vopts} -N -V -D -n -r -r -L -A -H -F -T -u" 
     _vopts="${_vopts} --noplugin -p -o -O --cmd -c -S -s -w -W" 
     _vopts="${_vopts} -x -X --remote --remote-silent --remote-wait" 
     _vopts="${_vopts} --remote-wait-silent --remote-tab --remote-send" 
     _vopts="${_vopts} --remote-expr --serverlist --servername" 
     _vopts="${_vopts} --startuptime -i -h --help --version" 
     COMPREPLY=($(compgen -W "${_vopts}" \ 
      -- "$cur")) 
     return 0 
    fi 

    local _VIM_IGNORE=".pdf:.dvi:.jpg:.pyc:.exe:.tar:.zip:.ps" 
    FIGNORE="${_VIM_IGNORE}" _filedir 
} && 
complete -F _vim vim vi v gv vd 

하지만이 작동하지 않습니다.

어떤 방법을 생각 하나?

감사합니다.

+0

그 뒤에'_filedir'을 제거해 보셨습니까? – Conner

+0

_filedir는 실제로 파일과 디렉토리의 완성을 반환하는 함수이므로 파일과 폴더의 이름과 완전히 일치하지는 않습니다. – skeept

답변

2

내가 어떤 문서를 찾았지만, 내 실험에 근거하지 않은, FIGNORE이 영향을주지 않는 것으로 보인다 compgen()/_filedir() 자체 처리 (구 주변 단지 래퍼입니다). 완료가 트리거되는 쉘에서 완료 될 때 만 완료에 영향을줍니다 (그러나 전역 적으로 원하는 것은 아닙니다).

이 똑똑한 방식으로 FIGNORE을 사용할 수 없으므로 직접 배열 COMPREPLY의 필터를 구현해야합니다. 파일이 배열에서 삭제 무시 된 확장 중 하나에 끝나는 경우

function _vim() 
{ 
    local cur prev idx ext 

    COMPREPLY=() 
    _get_comp_words_by_ref cur prev 

    case $prev in 
    -h|--help|-v|--version) 
     return 0 
     ;; 
    esac 

    if [[ "$cur" == -* ]] ; then 
    local _vopts='-v -e -E -s -d -y -R -Z -m -M -b -l -C' 
    _vopts="${_vopts} -N -V -D -n -r -r -L -A -H -F -T -u" 
    _vopts="${_vopts} --noplugin -p -o -O --cmd -c -S -s -w -W" 
    _vopts="${_vopts} -x -X --remote --remote-silent --remote-wait" 
    _vopts="${_vopts} --remote-wait-silent --remote-tab --remote-send" 
    _vopts="${_vopts} --remote-expr --serverlist --servername" 
    _vopts="${_vopts} --startuptime -i -h --help --version" 
    COMPREPLY=($(compgen -W "${_vopts}" \ 
     -- "$cur")) 
    return 0 
    fi 

    local _VIM_IGNORE=(pdf xdvi jpg pyc exe tar zip ps) 
    _filedir 
    for idx in ${!COMPREPLY[@]}; do 
    ext=${COMPREPLY[$idx]} 
    ext=${ext##*.} 
    for iext in ${_VIM_IGNORE[@]}; do 
     if test "$ext" = "$iext"; then 
     unset -v COMPREPLY[$idx] 
     break 
     fi 
    done 
    done 
    return 0 
} 

:

1

잉고에 의해 제안에 감사합니다, 이것은 내가 가지고있는 솔루션입니다.