Czy istnieje tryb dopasowania rozmytego dla powłoki Zsh?

22

Niedawno zakochałem się w wydajnych systemach uzupełniania tekstu. Jednym z moich ulubionych rodzajów uzupełnienia jest tak zwane uzupełnienie rozmyte. Jest to tryb, w którym program uzupełni dane użytkownika na podstawie tylko kilku znaków, które mogą wystąpić „w dowolnym miejscu” (prawie) w nazwie lub ścieżce pliku. Ta funkcja istnieje przynajmniej dla tych programów:

Przykład użycia tego trybu w edytorze tekstu:

Użytkownik próbuje uzupełnić słowo longWordNameThatTheyDontWantToWriteByHand i może to zrobić, wpisując np. Pierwszą literę i niektóre duże litery. Więc wpisanie lwnt może uzupełnić całe słowo.

Moje pytanie brzmi: czy istnieje tryb lub coś podobnego, którego mógłbym użyć z powłoką Zsh?

sp3ctum
źródło

Odpowiedzi:

27

Mam to w sobie .zshrc

# 0 -- vanilla completion (abc => abc)
# 1 -- smart case completion (abc => Abc)
# 2 -- word flex completion (abc => A-big-Car)
# 3 -- full flex completion (abc => ABraCadabra)
zstyle ':completion:*' matcher-list '' \
  'm:{a-z\-}={A-Z\_}' \
  'r:[^[:alpha:]]||[[:alpha:]]=** r:|=* m:{a-z\-}={A-Z\_}' \
  'r:|?=** m:{a-z\-}={A-Z\_}'

Dodaje pełne rozmyte dopasowanie do zshsilnika uzupełniania. Brakuje super mądrości wysublimowanego tekstu, ale tak, to się skończy lwnt -> longWordNameThatTheyDontWantToWriteByHand.

PythonNut
źródło
1
Właśnie znalazłem błąd: nie działa dla nazw plików ze spacjami, biorąc pod uwagę, że wpisujesz cokolwiek po spacji ☹ To stack install && vlc ~/Music/erfznaczy, że nie dokończę stack install && vlc ~/Music/FGFC820\ -\ Perfect\ War.mp3.
Cześć Anioł
5
@ Cześć Angel, hej, dzięki, że wpadłeś na to. Właściwie używam 'r:|?=** m:{a-z\-}={A-Z\_}'teraz, który jest o wiele prostszy i nie cierpi z powodu opisanego problemu.
PythonNut
To wspaniale! Może mógłbyś stworzyć wtyczkę z tym kodem. Tak, aby łatwiej było je znaleźć.
Julien__
15

Sprawdź mój projekt fzf .

Jest to uniwersalna wyszukiwarka rozmyta napisana w Golang, która może być używana z dowolną listą rzeczy: plikami, procesami, historią poleceń, gałęziami git itp.

W przypadku zsh udostępnia następujące powiązania klawiszy:

  • CTRL-T - Wklej wybrane ścieżki pliku do wiersza poleceń
  • CTRL-R - Wklej wybrane polecenie z historii do wiersza poleceń
  • ALT-C - cd do wybranego katalogu

i tryb zakończenia rozmytego:

# Files under current directory
# - You can select multiple items with TAB key
vim **<TAB>

# Files under parent directory
vim ../**<TAB>

# Files under parent directory that match `fzf`
vim ../fzf**<TAB>

# Files under your home directory
vim ~/**<TAB>

# Directories under current directory (single-selection)
cd **<TAB>

# Directories under ~/github that match `fzf`
cd ~/github/fzf**<TAB>

# Process IDs. Can select multiple processes with TAB or Shift-TAB
kill -9 <TAB>

# Host names
ssh **<TAB>
telnet **<TAB>

# Environment variables / aliases
unset **<TAB>
export **<TAB>
unalias **<TAB>
Junegunn Choi
źródło
4
Jak mogę domyślnie uzupełnić tę kartę? Bez konieczności pisania**
theonlygusti