Existe um shell que suporta o preenchimento fuzzy como no Sublime Text?

11

Eu estou usando bash e eu queria saber se existe algum plugin no bash ou outro shell que me permite fazer isso cat tfnislong.txt + [tab] conclui para cat ThisFileNameIsSoLong.txt como a conclusão da tabulação no texto sublime.

    
por woodings 05.03.2013 / 22:49

3 respostas

9

Eu conheço o link que é um monte de funções de shell usadas com complete .

Eu acho que provavelmente poderíamos fazer um pouco melhor, ser mais conciso. Hora de abrir o seu .bashrc ou .profile ...

O gancho básico que usamos é este:

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 tabulação, em que as opções são definidas na variável COMPREPLY . Então, por exemplo:

function fuzzypath() {
    if [ -z $2 ] 
    then
        COMPREPLY=( 'ls' )
    else
        DIRPATH='echo "$2" | gsed 's|[^/]*$||''
        BASENAME='echo "$2" | gsed 's|.*/||''
        FILTER='echo "$BASENAME" | gsed 's|.|
function fuzzypath() {
    if [ -z $2 ] 
    then
        COMPREPLY=( 'ls' )
    else
        DIRPATH='echo "$2" | gsed 's|[^/]*$||''
        BASENAME='echo "$2" | gsed 's|.*/||''
        FILTER='echo "$BASENAME" | gsed 's|.|%pre%.*|g''
        COMPREPLY=( 'ls $DIRPATH | grep -i "$FILTER" | gsed "s|^|$DIRPATH|g"' )
    fi
}
.*|g'' COMPREPLY=( 'ls $DIRPATH | grep -i "$FILTER" | gsed "s|^|$DIRPATH|g"' ) fi }

onde DIRPATH é tudo antes do último / em seu caminho que você está digitando e BASENAME é onde seu cursor está atualmente.

FILTER é onde o fuzzy-ness entra. Basicamente, pegue BASENAME e insira um .* entre cada caractere para produzir nosso fex regex.

O resto é apenas combinar a regex com ls para produzir COMPREPLY . Você pode encontrar coisas mais inteligentes para fazer aqui, talvez com find .

Também encontrei o link para ser útil.

    
por 13.06.2013 / 21:08
6

Você pode encontrar fzf útil. É um localizador fuzzy de propósito 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 irá configurar CTRL-T keybinding para o seu shell. O seguinte GIF mostra como funciona.

    
por 23.01.2014 / 06:31
3

Para concordar com a sua outra resposta, você pode querer olhar para o zsh. É retrocompatível com o bash, para que você possa usá-lo como substituto, mas ele suporta recursos significativamente expandidos e um deles é o aprimoramento da guia ciente do contexto altamente aprimorado.

Perguntas frequentes sobre a conclusão do zsh expande os casos de uso, mas acredito que No seu exemplo, você estaria mais interessado na função COMPLETE_IN_WORD . Não é bem o comportamento desejado, mas está próximo. O ponto principal é que existem muitas 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 ideias, você pode dar uma olhada no popular oh-my-zsh framework que possui várias funções para gerenciar zsh e estendê-lo. É mais do que você quer, provavelmente, mas sob os plugins você notará scripts de preenchimento automático para várias funções. Para ter uma ideia dos recursos.

    
por 13.06.2013 / 22:02