디렉토리에서 파일 이름 자동 완성


16

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

다음에있는 디렉토리 목록을 자동 완성하려고합니다 /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 "

답변:


15

시험:

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

complete -F _codeComplete hi

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

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


6
공백 및 기타 특수 문자가 포함 된 파일 이름에서는 실패합니다.
Gilles 'SO- 악마 그만'

2
complete명령 이름을 모르고 검색하는 경우 명령 이름을 찾기가 이상하게 어렵습니다. autocomplete또는 tab-completion... 명령 이름을 찾은 첫 번째 위치였으며 ejectUbuntu로 업그레이드 할 때 수정해야하는 항목이었습니다 . 14.04는 ( $ complete -p ls-> complete -F _longopt ls수정이 그래서, : complete -F _longopt eject) (여기에서이 댓글을 바라고 다른 사람들이 그것을 찾을 수 있습니다!)
Izkata

1

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

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

IFS=$'\n'

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

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

complete -F _codeComplete hi

1

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

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


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

complete -o nospace -F _hi hi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.