Czy istnieje powłoka, która obsługuje rozmyte uzupełnianie jak w Sublime Text?

13

Używam bash i zastanawiałem się, czy jest jakaś wtyczka w bash lub innej powłoce, która pozwala mi to robić cat tfnislong.txt+ [tab]uzupełnienia, cat ThisFileNameIsSoLong.txttak jak uzupełnianie tabulacji w Sublime Text.

lasy
źródło
Dlaczego nie zrobić po prostu cat Th+ tab?
daviewales
@daviewales Wyświetla wszystkie 269 powodów?
Faks

Odpowiedzi:

11

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.

mwm
źródło
6

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.

Junegunn Choi
źródło
FZF jest świetny! Wielkie dzięki za wkład. Zaoszczędziło mi to tygodni pracy. Zacząłem pisać rozmyte zakończenie dla Basha, kiedy na szczęście znalazłem FZF. Działa idealnie, po prostu musiałem zapamiętać pozycję kursora przed wywołaniem fzf.. (tput sc), a później przywrócić go za pomocą tput rc..
Håkon Hægland
3

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.

Krondor
źródło