Odpowiedzi:
Znam https://github.com/mgalgs/fuzzy_bash_completion, który jest wiązką funkcji powłoki używanych z complete.
Myślę, że prawdopodobnie moglibyśmy zrobić trochę lepiej, być bardziej zwięzłym. Nadszedł czas, aby otworzyć swój .bashrc lub .profile ...
Podstawowy hak, którego używamy to:
complete -o nospace -o filenames -F fuzzypath cd ls cat
Opcja -F oznacza użycie funkcji powłoki do uzupełniania tabulacji, gdzie opcje są ustawione w COMPREPLYzmiennej. Na przykład:
funkcja fuzzypath () {
jeśli [-z 2 USD]
następnie
COMPREPLY = (`ls`)
jeszcze
DIRPATH = `echo" 2 $ "| gsed 's | [^ /] * $ ||' '
BASENAME = `echo" 2 $ "| gsed 's |. * / ||' '
FILTER = `echo" $ BASENAME "| gsed 's |. | \ 0. * | g'`
COMPREPLY = (`ls $ DIRPATH | grep -i" $ FILTER "| gsed" s | ^ | $ DIRPATH | g "')
fi
}
gdzie DIRPATHjest wszystko, co wpisujesz przed ostatnim / na ścieżce i BASENAMEgdzie aktualnie znajduje się kursor.
FILTERtam, gdzie pojawia się rozmytość. Zasadniczo bierz BASENAMEi wstawiaj znak .*między każdym znakiem, aby utworzyć wyrażenie regularne fuzz.
Reszta to po prostu łączenie wyrażenia regularnego z ls do wyprodukowania COMPREPLY. Możesz znaleźć tutaj sprytniejsze rzeczy, może z find.
Uważam również, że http://fahdshariff.blogspot.com/2011/04/writing-your-own-bash-completion.html jest przydatny.
Fzf może ci się przydać. Jest to uniwersalna wyszukiwarka rozmyta napisana w Rubim, która może być używana z dowolną listą rzeczy: plikami, procesami, historią poleceń, gałęziami git itp.
Jego skrypt instalacyjny ustawi CTRL-Tprzypisanie klawiszy dla twojej powłoki. Poniższy plik GIF pokazuje, jak to działa.

fzf.. (tput sc), a później przywrócić go za pomocą tput rc..
Aby przejść do drugiej odpowiedzi, możesz zajrzeć do zsh. Jest wstecznie kompatybilny z bash, dzięki czemu można go używać jako zastępstwa, ale obsługuje znacznie rozszerzone funkcje, a jedną z nich jest znacznie ulepszone uzupełnianie kart z uwzględnieniem kontekstu.
Często zadawane pytania na temat ukończenia zsh dotyczą przypadków użycia, ale uważam, że według twojego przykładu najbardziej zainteresowałbyś się tą COMPLETE_IN_WORDfunkcją. Nie jest to pożądane zachowanie, ale jest blisko. Najważniejsze jest to, że istnieje wiele sposobów rozszerzenia podstawowej funkcjonalności w bardziej przystępny sposób niż użycie bash.
Oto rozmyte rozszerzenie dopasowania, które przybliżałoby to, co chcesz bardziej szczegółowo; dopasowanie zsh-fuzzy
Aby zapoznać się z niektórymi pomysłami, możesz zapoznać się z popularnym frameworkiem oh-my-zsh , który ma wiele funkcji do zarządzania zsh i rozszerzania go. Najprawdopodobniej jest to więcej, niż chcesz, ale pod wtyczkami zauważysz skrypty autouzupełniania dla różnych ról. Aby dowiedzieć się o możliwościach.
cat Th+tab?