2013-05-20 4 views
8

물고기와 함께 사용할 자동 완성 스크립트를 만들려고합니다. 나는 같은 프로그램에 대한 bash 완성 스크립트를 포팅하고있다.하위 명령으로 자동 완성 스크립트 만들기

이 프로그램은 세 최고 수준의 명령이는 foo, barbaz 말 각은 각각 abc 말, 일부 하위 명령이 있습니다.

내가보고 있어요 최상위 레벨이 자동 완성 확인 명령, 그래서 나는 그것이 하위 명령이 무엇을보고 다시 탭을 치면 그때하지만, 자동 완성 foo납니다 f를 입력하면, 내가 foo를 볼 수 있다는 것입니다 나는 참고로 사용하고 bar, baz, a, b, c하고 그냥 a, b해야한다, c

그 이후 git completion script 바로 작동하는 것 같다. 또한 git flow script을 참조로 사용하고 있습니다.

내가이가에 의해 자식 완료 스크립트에서 처리됩니다 생각 : 명령에 하나의 인수, 스크립트 자체가있을 경우 의미가

function __fish_git_needs_command 
    set cmd (commandline -opc) 
    if [ (count $cmd) -eq 1 -a $cmd[1] = 'git' ] 
    return 0 
    end 
    return 1 
end 

, 당신은 단지 완성을 사용할 수 있습니다; 최상위 명령을 완료하기위한 호출에 조건 (-n)을 사용하면 올바른 일이 일어날 것이라고 생각합니다.

그러나 내가보고있는 것은 사실이 아닙니다. 그 함수를 내 스크립트로 복사하고, "git"을 적절히 변경했으며, 행운이 없었습니다.

function __fish_prog_using_command 
    set cmd (commandline -opc) 
    set subcommands $argv 
    if [ (count $cmd) = (math (count $subcommands) + 1) ] 
    for i in (seq (count $subcommands)) 
     if not test $subcommands[$i] = $cmd[(math $i + 1)] 
     return 1 
     end 
    end 
    return 0 
    end 
    return 1 
end 

function __fish_git_needs_command 
    set cmd (commandline -opc) 
    set startsWith (echo "$cmd[1]" | grep -E 'prog$') 
    # there's got to be a better way to do this regex, fish newb alert 
    if [ (count $cmd) = 1 ] 
    # wtf, this is always false? it this the problem? 
    if [ $cmd[1] -eq $cmd[1] ] 
     return 1 
    end 
    end 

    return 0 
end 

complete --no-files -c prog -a bar -n "__fish_git_needs_command" 

complete --no-files -c prog -a foo -n "__fish_git_needs_command" 

complete --no-files -c prog -a a -n "__fish_prog_using_command foo" 
complete --no-files -c prog -a b -n "__fish_prog_using_command foo" 
complete --no-files -c prog -a c -n "__fish_prog_using_command foo" 

complete --no-files -c prog -a baz -n "__fish_git_needs_command" 

이 작품을 만드는 방법에 대한 어떤 제안이 많이 감사합니다 다음과 같이

다운 손질 스크립트입니다.

답변

7

return 0은 사실을 의미하고 return 1은 거짓이라는 것을 알고 계신 것 같습니까?

귀하의 출력에서 ​​귀하의 needs_command 기능이 제대로 작동하지 않아 하위 명령이 있어도 막대를 표시하는 것처럼 보입니다.

난 그냥 다음 코드를 시도하고 예상대로 작동 : 완료에서

function __fish_prog_needs_command 
    set cmd (commandline -opc) 
    if [ (count $cmd) -eq 1 -a $cmd[1] = 'prog' ] 
    return 0 
    end 
    return 1 
end 

function __fish_prog_using_command 
    set cmd (commandline -opc) 
    if [ (count $cmd) -gt 1 ] 
    if [ $argv[1] = $cmd[2] ] 
     return 0 
    end 
    end 
    return 1 
end 

complete -f -c prog -n '__fish_prog_needs_command' -a bar 

complete -f -c prog -n '__fish_prog_needs_command' -a foo 
complete -f -c prog -n '__fish_prog_using_command foo' -a a 
complete -f -c prog -n '__fish_prog_using_command foo' -a b 
complete -f -c prog -n '__fish_prog_using_command foo' -a c 

complete -f -c prog -n '__fish_prog_needs_command' -a baz 

출력 :

➤ prog <Tab> 
bar baz foo 
➤ prog foo <Tab> 
a b c 
➤ prog foo 

이 당신이 원하는 무엇입니까?

+0

그래, 고마워. – Michael

+0

위대한 예제 @terje 및 @Michael에 감사드립니다! '-f -c prog -n '__fish_prog_using_command foo'-aa',''-f -c prog -n '__fish_prog_using_command foo'-ab' 및''-f -c prog -n ''을 __fish_prog_using_command foo로 출력하는 대신에, '-ac'을 별도의 줄에 써서 공백으로 세 가지 완성을 모두 구분할 수 있다고 생각합니다.'-f -c prog -n'__fish_prog_using_command foo '-a "abc"' – yegeniy