Executa no shell
Há duas perguntas separadas aqui:
Onde está a conclusão implementada e Qual outro componente de software pertence a ?
A implementação da conclusão está interagindo de perto com o editor de linha de comando, que faz parte do shell; Basicamente, precisa ser executado no shell.
Uma grande parte da conclusão é implementada como funções do shell na maioria dos shells;
Pacote separado
Você perguntou se é de alguma forma parte do aplicativo ou parte do shell; Na prática, não é nem o primeiro nem o segundo, na verdade, mas independente.
A maioria das conclusões no Ubuntu está no pacote separado bash-completion
,
uma grande coleção das conclusões que você poderia esperar.
Não faz parte do bash, mas é gerenciado e liberado de forma independente.
Código
Vamos dar uma olhada no seu exemplo de conclusão de evince
:
$ apt-file list bash-completion | grep evince
bash-completion: /usr/share/bash-completion/completions/evince
$ ls -l /usr/share/bash-completion/completions/evince
-rw-r--r-- 1 root root 967 Apr 7 16:10 /usr/share/bash-completion/completions/evince
Interessante! Não precisamos procurar algo geral como conclusão para visualizadores de PDF, mas encontramos algo diretamente relacionado a evince
.
O arquivo contém uma implementação da função shell; Parte dele consiste em constantes de string que descrevem como evince
pode ser usado na linha de comando - as partes mais interessantes de /usr/share/bash-completion/completions/evince
são:
_evince() {
[ ... ]
case $prev in --gdk-no-debug|--gtk-module|--gtk-debug|--gtk-no-debug|\
-p|--page-label|-i|--page-index|-l|--find|--display)
[ ... ]
_filedir '@(@(?(e)ps|?(E)PS|[pf]df|[PF]DF[...]|bmp|xpm|ico|xwd|tga|pcx)'
[ ... ]
Ele descreve opções gerais como --gtk-debug
, opções específicas do aplicativo como --page-label
e lista extensões de nome de arquivo que podem ser pagas por evince
como .eps
e .pdf
.
Hands on
Você pode mostrar as funções definidas no shell atual com o declare
builtin. Se você tentar isso em um novo shell, receberá uma mensagem de erro:
$ declare -f -p _evince
bash: declare: _evince: not found
Assumindo que o pacote bash-completion
esteja instalado, isso apenas mede que a função ainda não está carregada.
Como há um grande número de funções como esta, e em uma sessão de shell interativa, apenas algumas são usadas, faz sentido carregar somente funções quando elas são realmente necessárias, em vez de carregar tudo na inicialização .
Para obter a função carregada, tentamos usá-la usando a evince
completion. Com o cursor na localização de |
, pressione a tecla Tab ;
$ evince -|<TAB>
Pode haver alguma conclusão mostrada. Agora, a função deve ser carregada e ter a aparência no arquivo acima, se for impressa:
$ declare -f -p _evince
Para listar todos os nomes de funções, ou ver todas as funções que estão atualmente carregadas - incluindo aquelas que não estão relacionadas à conclusão, use:
$ declare -F | less
$ declare -f | less