Você pode usar a Conclusão programável . Consulte os /etc/bash_completion
e /etc/bash_completion.d/*
para alguns exemplos.
Quando eu uso programa como svn
e eu digito no Terminal do Gnome:
svn upd
e clique em Tab e é autocompleted para:
svn update
É possível fazer algo assim no meu script personalizado?
Você pode usar a Conclusão programável . Consulte os /etc/bash_completion
e /etc/bash_completion.d/*
para alguns exemplos.
Estou seis meses atrasado, mas estava procurando a mesma coisa e achei isso:
Você terá que criar um novo arquivo:
/etc/bash_completion.d/foo
Para um autocompletar estático ( --help
/ --verbose
, por exemplo), adicione isto:
_foo()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="--help --verbose --version"
if [[ ${cur} == -* ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
}
complete -F _foo foo
COMP_WORDS
é uma matriz contendo todas as palavras individuais na linha de comando atual. COMP_CWORD
é um índice da palavra que contém a posição atual do cursor. COMPREPLY
é uma variável de matriz a partir da qual o Bash lê as possíveis conclusões. E o comando compgen
retorna a matriz de elementos de --help
, --verbose
e --version
correspondendo à palavra atual "${cur}"
:
compgen -W "--help --verbose --version" -- "<userinput>"
Fonte: link
Aqui está um tutorial completo.
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=
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
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
Se tudo o que você deseja é um preenchimento automático simples baseado em palavras (portanto, nenhuma conclusão de subcomando ou qualquer coisa), o comando complete
tem uma opção -W
que faz a coisa certa.
Por exemplo, eu tenho as seguintes linhas no meu .bashrc
para autocompletar um programa chamado jupyter :
# gleaned from 'jupyter --help'
_jupyter_options='console qtconsole notebook' # shortened for this answer
complete -W "${_jupyter_options}" 'jupyter'
Agora jupyter <TAB> <TAB>
autocompletes para mim.
Os documentos em gnu.org são úteis.
Parece que a variável IFS
está sendo configurada corretamente, mas isso não causou problemas para mim.
Para adicionar a conclusão do nome do arquivo e a conclusão BASH padrão, use a opção -o
:
complete -W "${_jupyter_options}" -o bashdefault -o default 'jupyter'
Para usar isso em zsh, adicione o seguinte código antes de executar o comando complete
no seu ~/.zshrc
:
# make zsh emulate bash if necessary
if [[ -n "$ZSH_VERSION" ]]; then
autoload bashcompinit
bashcompinit
fi
Tags bash auto-completion