Existe um shell que suporte a conclusão difusa como no Sublime Text?

14

Estou usando bash e eu queria saber se existe qualquer plugin em bash ou outro shell que me permite fazer isso cat tfnislong.txt+ [tab]concluída a cat ThisFileNameIsSoLong.txtapenas como a conclusão de tabulação em Sublime texto.

madeira
fonte
Por que não apenas cat Th+ tab?
Davisales 20/05
1
@daviewales Exibir todas as 269 razões?
Fax

Respostas:

11

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.

mwm
fonte
6

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.

Junegunn Choi
fonte
FZF é ótimo! Muito obrigado por contribuir. Isso me salvou semanas de trabalho. Eu estava começando a escrever uma conclusão imprecisa para o Bash quando, por sorte, encontrei o FZF. Ele funciona perfeito, eu só tinha que lembrar para salvar posição do cursor antes de chamar fzf.. (tput sc) e depois restaurá-lo com tput rc..
Håkon Hægland
3

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.

Krondor
fonte