2013-05-20 6 views
8

Próbuję utworzyć skrypt autouzupełniania do użytku z rybami; Przekazuję skrypt zakończenia basha dla tego samego programu.Tworzenie skryptu autouzupełniania z komendami podrzędnymi

Program posiada trzy polecenia najwyższym poziomie, powiedzieć foo, bar i baz i każdy ma kilka podpoleceń, po prostu powiedzieć ab i c dla każdego.

Co ja widzę to, że górny poziom poleceń auto kompletne OK, więc jeśli wpisuję f Dostaję foo autouzupełniania, ale wtedy, gdy uderzę kartę ponownie, aby zobaczyć, co to jest sub polecenia są, widzę foo , bar, baz, a, b, c i powinno być po prostu a, b, c

używam jako odsyłającym git completion script ponieważ wydaje się działać dobrze. Używam również git flow script jako odniesienia.

myślę ten jest obsługiwany w skrypcie zakończenia git przez:

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

Który ma sens, można użyć tylko na zakończenie, jeśli istnieje jeden arg do polecenia, sam skrypt; jeśli użyjesz tego jako warunku (-n) do wykonania połączenia na komendach najwyższego poziomu, myślę, że tak by się stało.

Jednak to, co widzę, nie jest prawdą. Skopiowałem tę funkcję do mojego skryptu, odpowiednio zmieniłem "git" i nie miałem szczęścia.

Wycięty dół scenariusz jest następujący:

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" 

Wszelkie sugestie, w jaki sposób dokonać tej pracy jest bardzo cenione.

Odpowiedz

7

Zgaduję, że zdajesz sobie sprawę, że return 0 oznacza prawdziwe i że return 1 oznacza fałsz?

Z Twojego wyjścia wygląda na to, że twoja funkcja needs_command nie działa poprawnie, wyświetlając pasek, nawet jeśli zawiera podpolecenia.

prostu próbowałem poniższy kod i działa zgodnie z oczekiwaniami:

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 

Wyjście z realizacji:

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

Czy tego chcesz?

+0

Tak, to działało, dziękuję. – Michael

+0

Dzięki za wspaniały przykład @terje i @Michael! Zamiast listy 'complete -f -c prog -n '__fish_prog_using_command foo' -aa,' complete -f -c prog -n '__fish_prog_using_command foo' -ab' i 'complete -f -c prog -n '__fish_prog_using_command foo "-ac" w osobnych liniach, myślę, że można oddzielić wszystkie trzy uzupełnienia spacją: 'complete -f -c prog -n '__fish_prog_using_command foo' -a" abc "' – yegeniy

Powiązane problemy