디렉토리에서 파일 이름 자동 완성 이 튜토리얼 을 알고

이 질문은 매우 유사 이 하나 ,하지만 난 솔루션을 이해할 수 없습니다. 나는 또한 이 튜토리얼 을 알고 있지만 여전히 내가 뭘 잘못하고 있는지 이해할 수 없다.

다음에있는 디렉토리 목록을 자동 완성하려고합니다 /something/.

$ ls /something/

One    Other    Three

이것이 일어날 방식으로 :

$ hi [TAB]

One Other Three
$ hi O[TAB]

One Other

첫 단어가 hi오직 안에있을 때만 /something/.

이것이 내가하고있는 일입니다 .profile.

_codeComplete()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=( $(compgen `ls /something/` -- $cur) )

}
complete -F _codeComplete "hi "


답변

시험:

_codeComplete()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=( $(compgen -W "$(ls /something/)" -- $cur) )
}

complete -F _codeComplete hi

-W옵션 을 지정 compgen하고 단어 목록을 생성하는 명령을 인용해야합니다.

이 블로그에서 완성 함수를 작성하는 방법에 대한 추가 정보 : 고유 한 Bash 완성 함수 작성


답변

허용 된 답변을 개선하려고 노력하겠습니다.

원래 답변은 공백이 포함 된 파일 이름으로 실패합니다. 조사가 끝나면 입력 구분 기호를 줄 끝으로 변경할 수 있습니다.

IFS=$'\n'

함수가 공백을 올바르게 처리하도록합니다.

_codeComplete()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    IFS=$'\n' tmp=( $(compgen -W "$(ls ~/something/ )" -- $cur))
    COMPREPLY=( "${tmp[@]// /\ }" )
}

complete -F _codeComplete hi

답변

다음은 공백을 처리 할뿐만 아니라 이스케이프 처리하는 버전입니다.

_codeComplete()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    local AUTO_COMPLETE_DIRS=$(ls /something/)

    IFS=$'\n' COMPREPLY1=( $(compgen -W "$AUTO_COMPLETE_DIRS" -- $cur))
    COMPREPLY2=( "${COMPREPLY1[@]// /\ }" )
    COMPREPLY=($(printf "%q\n" "${COMPREPLY2[@]}"))

}
complete -F _codeComplete "hi "

( dogbaneEduardo Almeida dos Santos 의 답변을 기반으로 하지만 SO에서 antak이 제공 한대로 탈출 하십시오 : /programming//a/11536437/1536933 )


답변

_hi() {
    COMPREPLY=(cd /something/ && compgen -A directory -S / -- $2)
}

complete -o nospace -F _hi hi