Como obtenho a conclusão do bash para aliases de comando?

42

Eu estou tentando obter o preenchimento de tabulação em meus alias de linha de comando, por exemplo, digamos que eu defini o seguinte apelido:

alias apt-inst='sudo aptitude install'

Existe uma maneira de obter as conclusões fornecidas pelo aptitude quando clico na tecla tab? isto é, quando eu escrevo 'sudo aptitude install gnumer' e clico em tab, o aptitude conclui isso para gnumeric, ou se houvesse listas de incertezas, todos os pacotes disponíveis começando com gnumer. Se eu fizer isso usando meu alias, nada - nenhuma conclusão.

    
por levesque 20.11.2010 / 17:13

4 respostas

25

Existe um ótimo tópico sobre isso nos fóruns do Ubuntu . Ole J propõe a seguinte função de definição de conclusão de alias:

function make-completion-wrapper () {
  local function_name="$2"
  local arg_count=$(($#-3))
  local comp_function_name="$1"
  shift 2
  local function="
    function $function_name {
      ((COMP_CWORD+=$arg_count))
      COMP_WORDS=( "$@" \${COMP_WORDS[@]:1} )
      "$comp_function_name"
      return 0
    }"
  eval "$function"
  echo $function_name
  echo "$function"
}

Use-o para definir uma função de conclusão para seu alias e, em seguida, especifique essa função como um complemento para o alias:

make-completion-wrapper _apt_get _apt_get_install apt-get install
complete -F _apt_get_install apt-inst

Eu prefiro usar aliases para adicionar argumentos sempre usados a programas existentes. Por exemplo, com grep , eu sempre quero pular dispositivos e arquivos binários, então eu faço um alias para grep . Para adicionar novos comandos, como grepbin , eu uso um script de shell na minha pasta ~/bin . Se essa pasta estiver no seu caminho, ela será preenchida automaticamente.

    
por 20.11.2010 / 17:48
18

Teste complete-alias , que resolve exatamente esse problema.

Após instalá-lo, você pode usar uma função genérica para completar vários aliases como este:

complete -F _complete_alias <myalias1>
complete -F _complete_alias <myalias2>
complete -F _complete_alias <myalias3>

Você pode querer pesquisar o arquivo complete_alias em todas as instâncias bash até .bash_profile ou similar.

instalação

mkdir ~/.bash_completion.d
curl https://raw.githubusercontent.com/cykerway/complete-alias/master/completions/bash_completion.sh \
     > ~/.bash_completion.d/complete_alias

aplicativo

source ~/.bash_completion.d/complete_alias

alias container=docker\ container
complete -F _complete_alias container

container agora pode ser preenchido automaticamente pelo manipulador de conclusão _docker() original;

$ container l<Tab>
logs  ls    

$ container s<Tab>
start  stats  stop   
    
por 24.12.2016 / 08:17
2

Este é o código da resposta de Shawn J. Goff com algumas melhorias:

  • Erros de sintaxe corrigidos destacados por shell-check , por exemplo, o primeiro " de "$@" de fato terminou a string de definição de função.
  • Removido o return 0 para que o valor de retorno da função subjacente possa ser passado de volta para o chamador.

.

# Wraps a completion function, eg for use with an alias.
# Usage:
# make-completion-wrapper <actual completion function> <name of new func.>
#                         <command name> <list supplied arguments>
# eg.
#   alias agi='apt-get install'
#   make-completion-wrapper _apt_get _apt_get_install apt-get install
#     # defines a function called _apt_get_install (that's $2) that will
#     # complete the 'agi' alias. 
#   complete -F _apt_get_install agi
function make-completion-wrapper {
  local function_name="$2"
  local arg_count=$(( $#-3 ))
  local comp_function_name="$1"
  shift 2
  local function="function $function_name {
      (( COMP_CWORD += $arg_count ))
      COMP_WORDS=( \"\$@\" \${COMP_WORDS[@]:1} )
      \"$comp_function_name\"
    }"
  eval "$function"
  # echo "$function"
}
export -f make-completion-wrapper
    
por 15.09.2016 / 15:05
1

2018 answer

Você deve adicionar seu alias ao programa 'complete'. Dependendo do tipo de autocompletar que você deseja alcançar, você deve usar -c ou -F.

Para preenchimento automático de pacotes:

complete -c name_of_your_alias

Para autocompletar de comandos:

complete -F name_of_your_alias

Para verificar se seu alias foi adicionado corretamente:

complete | grep name_of_your_alias

Por fim, para remover um alias de "concluído":

complete -r name_of_your_alias

No seu caso:

complete -c apt-inst
    
por 21.05.2018 / 04:42