Ocultar os destinos do shell quando os usuários são preenchidos automaticamente no bash

5

Existe uma maneira de sinalizar alguns destinos em Makefile para que eles não apareçam no shell quando o usuário digita make e depois pressiona Tab ? Estou tendo um Makefile com muitas receitas e não quero que todas elas apareçam no preenchimento automático de shell quando um usuário pressiona Tab procurando por destinos.

    
por Marcus Junius Brutus 10.09.2014 / 16:48

4 respostas

6

Depois de estudar o problema e encontrar uma solução que escrevi na primeira resposta, percebi que existe outra maneira muito simples .

Basta iniciar os nomes dos alvos que você não deseja mostrar começando com um ponto .

Exemplo:

.PHONY: foo .hiddentarget
foo: foo.x .hiddentarget
foo.x: foo.c
        touch foo.x
.hiddentarget: foo.x
        echo foo.x ok, I believe

E isso é tudo que você precisa!

Cheguei a essa ideia depois de tentar descobrir como impedir que um alvo chamado .HIDDENGOALS fosse chamado por engano e executasse todas as metas ocultas. :)

Aviso Embora eu não veja nenhum, não tenho certeza se não há nenhum efeito colateral no uso de nomes de destino como este " .targetname " ( começando com um ponto).

    
por 06.10.2014 / 04:35
1

Para ocultar alguns alvos, você precisa cortar a função de preenchimento automático do seu shell. bash usa /etc/bash_completion e /etc/bash_completion.d/* para isso.

Não é possível lembrar como o tcsh faz isso.

    
por 10.09.2014 / 17:11
0

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!

    
por 06.10.2014 / 03:39
0

Eu observei que isso também funciona iniciando o alvo com um sublinhado

_hiddentarget:
    @echo "Running hidden target" 
    
por 24.03.2017 / 11:07