No bash, é fácil o suficiente configurar a conclusão personalizada dos argumentos de comando usando o complete
built-in. Por exemplo, se, para um comando hipotético com uma sinopse de foo --a | --b | --c
, você pudesse fazercomplete -W '--a --b --c' foo
Você também pode personalizar a conclusão que obtém quando pressiona Tabem um prompt vazio usando complete -E
, por exemplo complete -E -W 'foo bar'
,. Pressionar tab no prompt vazio sugere apenas foo
e bar
.
Como personalizo a conclusão do comando em um prompt não vazio? Por exemplo, se eu estiver sentado em:
anthony@Zia:~$ f
como personalizar a conclusão de modo que a guia pressionada sempre seja concluída foo
?
(O caso real que eu gostaria é de loc
TAB→ localc
. E meu irmão, que me levou a perguntar isso, quer isso com mplayer).
fonte
loc
paralocalc
? Sugiro alternativas porque, depois de algum tempo pesquisando e pesquisando, não encontrei uma maneira de personalizar a conclusão do bash dessa maneira. Pode não ser possível.locate
,locale
,lockfile
ou qualquer uma das outras expansões deloc
. Talvez uma abordagem melhor seria mapear uma chave diferente para essa conclusão específica.loc<TAB>->localc
)?Respostas:
A conclusão do comando (junto com outras coisas) é realizada através da conclusão da linha de leitura do bash . Isso opera em um nível um pouco mais baixo do que a "conclusão programável" usual (que é chamada apenas quando o comando é identificado e nos dois casos especiais que você identificou acima).
Atualização: a nova versão do bash-5.0 (janeiro de 2019) adiciona
complete -I
exatamente esse problema.Os comandos readline relevantes são:
De maneira semelhante à mais comum
complete -F
, parte disso pode ser transferida para uma função usandobind -x
.Isso permite que suas próprias seqüências de caracteres por comando ou prefixo sejam conectadas
~/.complete.d/
. Por exemplo, se você criar um executável~/.complete.d/loc
com:Isso fará (aproximadamente) o que você espera.
A função acima mede alguns comprimentos para emular o comportamento normal de conclusão do comando bash, embora seja imperfeito (particularmente a
sort | fmt | column
bagagem duvidosa para exibir uma lista de correspondências).No entanto , um problema não trivial com isso, ele pode usar apenas uma função para substituir a ligação à
complete
função principal (chamada por TAB por padrão).Essa abordagem funcionaria bem com uma ligação de chave diferente usada apenas para a conclusão de comandos personalizados, mas simplesmente não implementa a lógica de conclusão completa depois disso (por exemplo, palavras posteriores na linha de comando). Para isso, seria necessário analisar a linha de comando, lidar com a posição do cursor e outras coisas complicadas que provavelmente não devem ser consideradas em um script de shell ...
fonte
Não sei se entendi sua necessidade disso ...
Isso implicaria que o seu bash conhece apenas um comando começando com
f
.Uma idéia básica de conclusão é: se for ambígua, imprima as possibilidades.
Portanto, você pode definir seu
PATH
diretório apenas com este comando e desativar todos os bash builtins para obter esse trabalho.De qualquer forma, também posso fornecer uma solução alternativa:
Portanto, se você digitar
_ <Tab>
, será concluído o_ foo
que é executadofoo
.Mas, no entanto,
alias f='foo'
seria muito mais fácil.fonte
Resposta simples para você seria
apenas os resultados básicos
basta adicionar o programa desejado para concluir automaticamente e completar
fonte
Execute o comando abaixo para descobrir onde o binário mplayer está instalado:
OU use o caminho para o binário mplayer, se você já o conhece, no comando abaixo:
Idealmente, qualquer coisa digitada é pesquisada em todos os diretórios especificados na
$PATH
variável.fonte
mplayer
já está em sua$PATH
e eles querem algo comomp<tab>
a produçãomplayer
, em vez de todos os binários que começam commp
(por exemplo,mpage
mpcd
mpartition
mplayer
etc.)