Autocompletar: reduzindo o entusiasmo de um programa

3

As pessoas que empacotam programas geralmente parecem ter uma opinião excessivamente ampla sobre os tipos de arquivos que seu programa será usado para abrir, conforme mostrado na configuração básica de preenchimento automático que eles criaram. Por exemplo, muitas vezes acontece que eu tenho arquivos a.svg e a.jpg, onde a.jpg é a renderização de a.svg em um bitmap. Eu uso o inkscape para editar arquivos svg e gimp para editar arquivos jpg. Mas se eu digitar "inkscape a" ou "gimp a" e apertar a aba de autocomplete, cada um desses programas, como um filhote de cachorro super-entusiasta, imagina que eu poderia querer editar a.svg ou a.jpg, e eu tenho que disambiguate.

Um exemplo ainda mais idiota (que mais parece um bug) é que o gimp oferece para abrir o a.odt (um arquivo do office libre), mas dá um erro se eu realmente tentar fazer isso.

Como é feita a redução das configurações de autocompletar de programas como esses para obter uma configuração personalizada que minimize as inconveniências?

    
por Ben Crowell 20.09.2015 / 20:54

1 resposta

3

Primeiro, deixe-me esclarecer alguns equívocos em sua pergunta.

  • Em geral, as configurações de conclusão são distribuídas com o seu shell, não com programas individuais. Embora programas individuais possam vir acompanhados de configurações de conclusão, da mesma forma que são empacotados com lançadores de área de trabalho e entradas de menu (pelo menos nas principais distribuições de desktop), na prática, os programadores não escrevem configurações de conclusão, desenvolvedores de shell fazer.
  • A conclusão é geralmente ajustada para concluir tudo o que pode ser útil, não apenas os casos mais comuns. Por exemplo, o Inkscape pode abrir arquivos JPEG, mesmo que geralmente não seja o melhor programa para isso, portanto, *.jpg arquivos são incluídos nas conclusões de inkscape . Além disso, por padrão, a conclusão inclui todos os arquivos.

Para o bash, as configurações de conclusão são distribuídas no pacote separado bash-completion . A partir da versão 2.1, não há configurações para gimp , portanto, a conclusão de argumentos para gimp oferece todos os arquivos. Para inkspace , a função de conclusão está ciente de algumas opções e conclui um grande conjunto de extensões de arquivo de imagem.

Você pode exibir ou modificar as configurações de conclusão no bash com o complete builtin. Por exemplo:

$ complete -p inkscape
complete -F _inkscape inkscape
$ type _inkscape
_inkscape is a function
_inkscape () 
{ 
    local cur;
    COMPREPLY=();
    cur=${COMP_WORDS[COMP_CWORD]};
    if [[ "$cur" == -* ]]; then
        COMPREPLY=($( compgen -W '-? --help --usage -V --version \
                        -z --without-gui -g --with-gui -f --file= -p --print= \
                        -e --export-png= -d --export-dpi= -a --export-area= \
                        -w --export-width= -h --export-height= -i --export-id= \
                        -j --export-id-only  -t --export-use-hints -b --export-background= \
                        -y --export-background-opacity= -l --export-plain-svg= -s --slideshow' -- $cur ));
    else
        _filedir '@(ai|ani|bmp|cur|dia|eps|gif|ggr|ico|jpe|jpeg|jpg|pbm|pcx|pdf|pgm|png|ppm|pnm|ps|ras|sk|svg|svgz|targa|tga|tif|tiff|txt|wbmp|wmf|xbm|xpm)';
    fi
}
$ complete -p gimp
complete -F _minimal gimp

Se você não gosta da função _inkscape , escreva o seu. Para gimp , o bash não conhece a conclusão; Uma vez que você tentou a conclusão pelo menos uma vez, ele registra _minimal como a função de conclusão. Defina sua própria função (convencionalmente chamada _gimp , mas isso não é uma obrigação) se você quiser algo diferente.

complete -F _gimp gimp
_gimp () {
  _filedir '@(ai|ani|bmp|cur|gif|ggr|ico|jpe|jpeg|jpg|pbm|pcx|pgm|png|ppm|pnm|ras|sk|targa|tga|tif|tiff|wbmp|wmf|xbm|xpm)'
}

O Zsh oferece mecanismos mais sofisticados , como completar um conjunto restrito, mas recorrer a um conjunto mais amplo, se não houver correspondências.

    
por 20.09.2015 / 21:39