EDITADO Melhor ler a outra resposta (nome do alvo começando com um ponto). Mas vou deixar essa resposta aqui, já que a parte de programação pode ajudar outros problemas semelhantes.
Ok, levei algum tempo para encontrar uma solução. Este é um (bom) rascunho, e esperamos que ele faça o trabalho direito.
Você deve editar o arquivo
/ usr / share / bash-conclusão / conclusões / make
(para o Debian Wheezy, ou algo semelhante ao seu sistema)
Na minha versão atual, os números de linha 70 a 73 têm o código:
70 COMPREPLY=( $( compgen -W "$( make -qp $makef $makef_dir 2>/dev/null | \
71 awk -F':' '/^[a-zA-Z0-9][^$#\/\t=]*:([^=]|$)/ \
72 {split($1,A,/ /);for(i in A)print A[i]}' )" \
73 -- "$cur" ) )
Substitua então pelo código seguinte:
70 HIDDENGOALS="$(make -qp | grep '^\.HIDDENGOALS:' | cut -d' ' -f2- | sed 's/ /\|/g')"
71 if [[ "$HIDDENGOALS" == "" || "$HIDDENGOALS" == ".HIDDENGOALS:" ]]; then
72 COMPREPLY=( $( compgen -W "$( make -qp $makef $makef_dir 2>/dev/null | \
73 awk -F':' '/^[a-zA-Z0-9][^$#\/\t=]*:([^=]|$)/ \
74 {split($1,A,/ /);for(i in A)print A[i]}' )" \
75 -- "$cur" ) )
76 else
77 COMPREPLY=( $( compgen -W "$( make -qp $makef $makef_dir 2>/dev/null | \
78 awk -F':' '/^[a-zA-Z0-9][^$#\/\t=]*:([^=]|$)/ \
79 {split($1,A,/ /);for(i in A)print A[i]}' \
80 | grep -ve "$HIDDENGOALS" )" \
81 -- "$cur" ) )
Agora, dentro do seu makefile
, você pode usar o seguinte alvo especial para ocultar as metas da autocompletar do bash:
.HIDDENGOALS: somegoal anothergoal goalstohide
muito parecido com um alvo especial .PHONY
(existem algumas diferenças).
Cuidado :
(I) Como esta solução funciona através de grep -ev
, o alvo especial não é bem assim. Ele usará qualquer coisa na linha para combinar exatamente como uma Expressão Regular faz.
Então, se você tem um alvo, digamos, copy2
e outro copy
, escrevendo
.HIDDENGOALS: copy
esconderá os dois objetivos!
Eu deixo a solução para este comportamento como um exercício para o leitor! ;)
(II) Outra coisa a notar, o :
é codificado para ficar ao lado de .HIDDENGOALS:
, o que significa que, embora os destinos permitam espaços como .PHONY :
, esse hack especial não.
(III) Acho que seria melhor editar um arquivo local em vez de / usr / share / bash-completion / completions / make , para evitar a perda do informações quando uma atualização é fornecida. Mas eu não testei nenhuma opção. Se você souber, por favor, comente e eu atualizarei esta resposta.
(IV) Existe uma pequena chance de um curioso executar o mesmo .HIDDENGOALS alvo com make .HIDDENGOALS
. Isso executaria todos os objetivos ocultos. E autocompletar o nome não foi possível, o que me levou à outra resposta bem simples!