Respostas:
Eu sei de https://github.com/mgalgs/fuzzy_bash_completion, que é um monte de funções de shell usadas com complete.
Acho que provavelmente poderíamos fazer um pouco melhor, ser mais concisos. Hora de abrir seu .bashrc ou .profile ...
O gancho básico que usamos é o seguinte:
complete -o nospace -o filenames -F fuzzypath cd ls cat
-F opção significa usar uma função de shell para a conclusão da guia, onde as opções são definidas na COMPREPLYvariável Então, por exemplo:
função fuzzypath () {
se [-z $ 2]
então
COMPREPLY = (`ls`)
outro
DIRPATH = `eco" $ 2 "| gsed 's | [^ /] * $ ||' '
BASENAME = `eco" $ 2 "| gsed 's |. * / ||' '
FILTER = `eco" $ BASENAME "| gsed 's |. | \ 0. * | g'`
COMPREPLY = (`ls $ DIRPATH | grep -i" $ FILTER "| gsed" s | ^ | $ DIRPATH | g "`)
fi
}
onde DIRPATHestá tudo antes do último / no caminho que você está digitando e BASENAMEé onde está o cursor no momento.
FILTERé onde entra a distorção. Basicamente, pegue BASENAMEe insira um .*entre cada caractere para produzir nosso regex de distorção.
O resto está apenas combinando o regex com ls para produzir COMPREPLY. Talvez você encontre coisas mais inteligentes para fazer aqui, talvez com find.
Também achei http://fahdshariff.blogspot.com/2011/04/writing-your-own-bash-completion.html útil.
Você pode achar o fzf útil. É um localizador difuso de uso geral escrito em Ruby que pode ser usado com qualquer lista de coisas: arquivos, processos, histórico de comandos, ramificações git, etc.
Seu script de instalação configurará a CTRL-Tcombinação de teclas para o seu shell. O GIF a seguir mostra como funciona.

fzf.. (tput sc) e depois restaurá-lo com tput rc..
Para acompanhar sua outra resposta, convém procurar no zsh. É retrocompatível com o bash, para que você possa usá-lo como uma queda na substituição, mas suporta recursos significativamente expandidos e um deles é o aprimoramento da guia com reconhecimento de contexto bastante aprimorado.
As perguntas frequentes sobre a conclusão do zsh se expandem nos casos de uso, mas acredito que, de acordo com o seu exemplo, você estaria mais interessado na COMPLETE_IN_WORDfunção. Não é exatamente o comportamento desejado, mas está próximo. O ponto principal é que existem várias maneiras de estender a funcionalidade básica de uma maneira talvez mais acessível do que usar o bash.
Aqui está uma extensão de correspondência difusa que aproximaria o que você deseja mais especificamente; correspondência zsh-fuzzy
Para algumas idéias, você pode dar uma olhada na popular estrutura oh-my-zsh , que possui várias funções para gerenciar e estendê-lo. É mais do que você deseja, provavelmente, mas nos plug-ins você notará scripts de preenchimento automático para várias funções. Para ter uma idéia dos recursos.
cat Th+tab?