이 질문은 매우 유사 이 하나 ,하지만 난 솔루션을 이해할 수 없습니다. 나는 또한 이 튜토리얼 을 알고 있지만 여전히 내가 뭘 잘못하고 있는지 이해할 수 없다.
다음에있는 디렉토리 목록을 자동 완성하려고합니다 /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 "
( dogbane 과 Eduardo Almeida dos Santos 의 답변을 기반으로 하지만 SO에서 antak이 제공 한대로 탈출 하십시오 : /programming//a/11536437/1536933 )
답변
_hi() {
COMPREPLY=(cd /something/ && compgen -A directory -S / -- $2)
}
complete -o nospace -F _hi hi