Pular para o conteúdo

Completar com Tab

bash, zsh e fish — gerados do catálogo, e não escritos à mão.

Completar com Tab é a diferença entre uma ferramenta que se usa de cabeça e uma que exige --ajuda a cada vez. O script de completação é gerado do catálogo de comandos — escrito à mão, ele envelheceria na primeira flag nova.

bash
$ dataforge completar bash > ~/.dataforge-completar.bash
$ echo 'source ~/.dataforge-completar.bash' >> ~/.bashrc

$ dataforge completar zsh  > ~/.zsh/completions/_dataforge
$ dataforge completar fish > ~/.config/fish/completions/dataforge.fish

Para a sua ferramenta#

O mesmo princípio: a declaração do comando já sabe quais são as opções e os subcomandos, então o script sai dela.

dataforge
adopt Arcane.Cli as Cli

app := Cli.comando("tarefa", "")
app.subcomando("criar", "cria")
app.subcomando("listar", "lista")

action script_bash(nome, verbos):
    palavras := join(" ", verbos)
    corpo := $"  COMPREPLY=($(compgen -W \"{palavras}\" -- \"$" + "{COMP_WORDS[1]}\"))"
    linhas := [$"_{nome}() {{", corpo, "}", $"complete -F _{nome} {nome}"]
    yield join("\n", linhas)

texto := script_bash("tarefa", ["criar", "listar"])
assert "complete -F _tarefa tarefa" in texto
out texto

O que completar, em ordem de utilidade#

  • Os subcomandos — é o primeiro Tab de toda sessão.
  • As flags do subcomando atual, e não as do programa inteiro.
  • As escolhas de uma opção (--formato=tabela json csv).
  • Caminhos, quando o posicional é um arquivo — o shell já faz isso, desde que o script não o atrapalhe.