이 질문은 다음과 관련이 있습니다.이것, 그러나 해결책을 이해할 수 없습니다. 나도 알아이 튜토리얼, 하지만 여전히 내가 뭘 잘못하고 있는지 이해할 수 없습니다.
다음 위치에 있는 디렉토리 목록을 자동 완성하려고 합니다 /something/
.
$ ls /something/
One Other Three
어떻게든 이런 일이 일어날 것입니다:
$ hi [TAB]
One Other Three
$ hi O[TAB]
One Other
첫 번째 단어가 hi
only inside 인 경우에만 해당됩니다 /something/
.
이것이 내가 하는 일이다 .profile
:
_codeComplete()
{
local cur=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=( $(compgen `ls /something/` -- $cur) )
}
complete -F _codeComplete "hi "
답변1
노력하다:
_codeComplete()
{
local cur=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=( $(compgen -W "$(ls /something/)" -- $cur) )
}
complete -F _codeComplete hi
-W
옵션을 지정 compgen
하고 단어 목록을 생성한 명령을 인용해야 합니다.
완성 함수를 작성하는 방법에 대한 자세한 내용은 다음 블로그를 참조하세요.나만의 Bash 완성 함수 작성
답변2
허용되는 답변을 개선하려고 노력하겠습니다.
파일 이름에 공백이 포함되어 있기 때문에 원래 답변이 실패합니다. 몇 가지 조사 끝에 입력 구분 기호를 줄 끝으로 변경할 수 있다는 것을 깨달았습니다.
IFS=$'\n'
함수가 공백을 올바르게 처리하도록 하세요.
_codeComplete()
{
local cur=${COMP_WORDS[COMP_CWORD]}
IFS=$'\n' tmp=( $(compgen -W "$(ls ~/something/ )" -- $cur))
COMPREPLY=( "${tmp[@]// /\ }" )
}
complete -F _codeComplete hi
답변3
다음은 공백을 처리할 뿐만 아니라 이를 이스케이프 처리하는 버전입니다.
_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 "
(기준으로개 헛간'모래에두아르도 알메이다 도스 산토스' 대답하지만 제공된 이스케이프에 따라안타크그게 다야:https://stackoverflow.com/a/11536437/1536933)
답변4
_hi() {
COMPREPLY=(cd /something/ && compgen -A directory -S / -- $2)
}
complete -o nospace -F _hi hi