Существует ли режим нечеткого соответствия для оболочки zsh?

22

Недавно я влюбился в эффективные системы завершения текста. Один из моих любимых видов завершения - так называемое нечеткое завершение. Это режим, в котором программа завершает ввод данных пользователем, основываясь только на паре символов, которые могут встречаться «где угодно» (почти) в имени файла или пути. Эта функция существует по крайней мере для этих программ:

Пример использования этого режима в текстовом редакторе:

Пользователь пытается завершить слово longWordNameThatTheyDontWantToWriteByHand, и они могут сделать это, набрав, например, первую букву и некоторые заглавные буквы. Таким образом, ввод lwnt может завершить все слово.

Мой вопрос: есть ли режим или что-то подобное, что я мог бы использовать с оболочкой zsh?

sp3ctum
источник

Ответы:

27

У меня есть это в моем .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\_}'

Он добавляет полное нечеткое совпадение в zshдвижок завершения. В нем отсутствуют супер-хитрости возвышенного текста, но, да, он будет завершен lwnt -> longWordNameThatTheyDontWantToWriteByHand.

PythonNut
источник
1
Я просто нашел ошибку: не работает для имен файлов с пробелами, учитывая , что вы печатаете что - либо после того , как пространство ☹ Т.е. stack install && vlc ~/Music/erfне была завершена к stack install && vlc ~/Music/FGFC820\ -\ Perfect\ War.mp3.
Привет, Ангел,
5
@ Привет, Ангел, эй, спасибо, что наткнулся на это. Я на самом деле использую 'r:|?=** m:{a-z\-}={A-Z\_}'сейчас, что гораздо проще, и не страдает от проблемы, которую вы описываете.
PythonNut
Замечательно! Может быть, вы могли бы сделать плагин с этим кодом. Просто чтобы легче было найти.
Julien__
15

Проверьте мой проект FZF .

Это нечеткий искатель общего назначения, написанный на Golang, который может использоваться с любым списком вещей: файлы, процессы, история команд, ветки git и т. Д.

Для zsh предусмотрены следующие привязки клавиш:

  • CTRL-T - Вставьте выбранные пути к файлам в командную строку
  • CTRL-R - Вставить выбранную команду из истории в командную строку
  • ALT-C - перейдите в выбранный каталог

и нечеткий режим завершения:

# 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>
Джунгунн Чой
источник
4
Как я могу сделать его вкладкой в ​​комплекте с этим по умолчанию? Без необходимости печатать**
theonlygusti