
foo:bar foo:foo bar:bar 또는 bar:foo 인수를 취하는 'command' 명령이 있다고 상상해 보십시오. 다음과 같은 완성 기능을 제공하기 위해 내 환경에 소스로 제공할 수 있는 명령줄 완성 스크립트를 작성할 수 있습니다.
function _command_opt()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="foo:bar foo:foo bar:bar bar:foo"
if [[ ${prev: -7} == 'command' ]]
then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) );
return 0;
fi
}
complete -F _command_opt -o bashdefault -o default 'command'
그러나 입력하면 command f[tab][tab]
foo:bar 및 foo:foo가 나열되지만 둘 다 명령줄에 완료되지 않습니다(아직 구별되지 않기 때문입니다. 제가 달성하고 싶은 것은 이것이 command foo:
커서를 생성하고 끝에 남겨두는 것입니다). (공백을 추가하는 대신) 현재 단어를 입력하거나 b
다시 f
탭하여 명령을 완료할 수 있습니다. 예제 문제는 단지 제가 의미하는 바를 보여주기 위한 것입니다... 실제 사례에서는 접두사:접미사 조합이 꽤 깁니다. , 따라서 부분 완성은 정말 유익할 것입니다. 예를 들어 모두 접두사로 시작하는 25개의 서로 다른 명령인 Translationupdateprocess: 그리고 Translationupdateprocess는 그만큼 많은 옵션이 있는 똑같이 긴 25개의 서로 다른 접두사 중 하나입니다.
bash를 이런 식으로 작동하도록 완료하는 방법을 아는 사람이 있습니까?
답변1
다음 코드를 사용할 수 있습니다( foo:baz foo:qux bar:eat bar:egg
명확하게 하기 위해 옵션을 다음으로 대체했습니다).
function _command_opt()
{
local cur cursec command opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
cursec=`echo ${cur} | awk -F ':' '{print $1}'`;
command="${COMP_WORDS[1]}"
opts="foo bar"
case "${command}" in
foo)
COMPREPLY=( $(compgen -W "baz qux" -- ${cursec}) ); return 0;;
bar)
COMPREPLY=( $(compgen -W "eat egg" -- ${cursec}) ); return 0;;
*) ;;
esac
COMPREPLY=( $(compgen -W "${opts}" -S ":" -- ${cur}) ); compopt -o nospace;
}
complete -F _command_opt -o bashdefault -o default 'command'
입력하면 command
tab첫 번째 수준 목록이 표시되고 foo: bar:
, 입력하면 f
tabtab두 번째 수준에 대한 완성 목록이 표시됩니다 baz qux
. 그런 다음 입력하여 q
tab전체 명령줄을 얻을 수 있습니다 command foo:qux
.
도움이 되길 바랍니다.