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.