Como especificar um autocompletar personalizado para comandos específicos?

19

Existe uma maneira de ter o bash saber exatamente o que exibir quando você clica duas vezes? Por exemplo, eu tenho um script python scpy que requer alguns argumentos. Por exemplo, como apt-get , se você dobrar a aba, você dá

autoclean        build-dep        clean            dselect-upgrade  purge            source           upgrade
autoremove       check            dist-upgrade     install          remove           update  

Existe uma maneira de fazer isso para seus próprios scripts / programas? Preciso enrolar meu script python em um script bash?

    
por Falmarri 09.09.2010 / 02:52

2 respostas

23

A maneira mais fácil de fazer isso é incluir um script de shell em /etc/bash_completion.d/ . A estrutura básica desse arquivo é uma função simples que executa a conclusão e, em seguida, a invocação de complete , que é um bash interno. Em vez de entrar em detalhes sobre como usar o complete , sugiro que você leia Uma introdução à conclusão do bash . A Parte 1 aborda o básico e a Parte 2 explica como você escreveria um script de conclusão.

Uma descrição mais detalhada da conclusão do bash pode ser encontrada na seção "Completamento Programável" de man bash (você pode digitar "/ Complementação Programável" e pressionar 'n' algumas vezes para chegar lá rapidamente. Ou estão sentindo sorte, "g 2140 RETURN").

    
por 09.09.2010 / 03:13
4

Aqui está o guia básico.

Vamos ter um exemplo de script chamado admin.sh para o qual você gostaria de ter o preenchimento automático em funcionamento.

#!/bin/bash

while [ $# -gt 0 ]; do
  arg=$1
  case $arg in
    option_1)
     # do_option_1
    ;;
    option_2)
     # do_option_1
    ;;
    shortlist)
      echo option_1 option_2 shortlist
    ;;
    *)
     echo Wrong option
    ;;
  esac
  shift
done

Nota na lista de opções. Chamar script com essa opção imprimirá todas as opções possíveis para este script.

E aqui você tem o script de autocompletar:

_script()
{
  _script_commands=$(/path/to/your/script.sh shortlist)

  local cur prev
  COMPREPLY=()
  cur="${COMP_WORDS[COMP_CWORD]}"
  COMPREPLY=( $(compgen -W "${_script_commands}" -- ${cur}) )

  return 0
}
complete -o nospace -F _script ./admin.sh

Observe que o último argumento a concluir é o nome do script ao qual você deseja adicionar o preenchimento automático. Tudo o que você precisa fazer é adicionar seu script de autocompletar para bashrc como

source /path/to/your/autocomplete.sh

ou copie-o para     /etc/bash.completion.d

Fonte: link

    
por 24.06.2016 / 16:34