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 COMPREPLY
variá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 DIRPATH
está 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 BASENAME
e 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-T
combinaçã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_WORD
funçã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
?