É o trabalho do comando -C
descobrir qual texto inserir em resposta a uma solicitação de conclusão. A interface é um pouco estranha:
-
O argumento para
-C
é interpretado como um trecho de script bash. O Bash anexa três strings com aspas corretamente a este snippet:- o comando cujos argumentos estão sendo concluídos;
- o prefixo da palavra onde o cursor está, até o cursor;
- a palavra antes do cursor.
-
Algumas variáveis são adicionadas ao ambiente:
-
COMP_LINE
contém a linha completa na qual a conclusão é executada. -
COMP_POINT
contém a posição do cursor dentro deCOMP_LINE
(contando de 0) . -
COMP_TYPE
é 9 para conclusão normal, 33 ao listar alternativas em conclusões ambíguas , 37 para conclusão do menu, 63 ao tabular entre conclusões ambíguas, 64 para listar conclusões após uma conclusão parcial. -
COMP_KEY
contém a chave que desencadeou a conclusão (por exemplo, um caractere de tabulação se o usuário pressionou a tecla Tab ).
-
- A saída do comando é interpretada como texto para substituir a palavra atual por. Note que este é um substituto, não um sufixo para acrescentar; o comando é suposto filtrar pelo prefixo dado. Pode conter várias linhas e, nesse caso, cada linha é considerada uma possível substituição.
Este é basicamente o mesmo mecanismo que é fornecido e melhor documentado , para funções com -F
. As funções obtêm uma interface um pouco mais simples: elas podem ler a lista de palavras do comando atual no variável COMP_WORDS
e a posição inicial da palavra atual em COMP_CWORD
; eles escrevem os resultados na matriz COMP_REPLY
.
Como os argumentos úteis - em particular, o prefixo para completar - são passados no final do comando, -C
é praticamente utilizável apenas com um comando externo. Claro que você pode usar algo como sh -c …
, mas não será bonito.
complete -C 'sh -c '\'for x in one two three; do case $x in "$1"*) echo "$x";; esac''\'