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 COMPREPLY
zmiennej. 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 DIRPATH
jest wszystko, co wpisujesz przed ostatnim / na ścieżce i BASENAME
gdzie aktualnie znajduje się kursor.
FILTER
tam, gdzie pojawia się rozmytość. Zasadniczo bierz BASENAME
i 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-T
przypisanie 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_WORD
funkcją. 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
?