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.