Чи існує нечіткий режим узгодження для оболонки zsh?


21

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

Приклад використання цього режиму в текстовому редакторі:

Користувач намагається завершити слово longWordNameThatTheyDontWantToWriteByHand, і вони можуть це зробити, ввівши, наприклад, першу літеру та деякі великі літери. Таким чином, введення lwnt може завершити все слово.

Моє запитання: чи існує режим чи щось подібне, що я міг би використовувати з оболонкою zsh?

Відповіді:


26

Я маю це у своєму .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.


1
Щойно я виявив помилку: не працює для назви файлів з пробілами, якщо ви вводите що-небудь після пробілу ☹ Тобто stack install && vlc ~/Music/erfне завершується stack install && vlc ~/Music/FGFC820\ -\ Perfect\ War.mp3.
Привіт-Ангел

5
@ Привіт-Ангел Ей, дякую, що наткнувся на це. Я фактично використовую 'r:|?=** m:{a-z\-}={A-Z\_}'зараз, що є куди простішим, і не страждає від описаної вами проблеми.
PythonNut

Це чудово! Можливо, ви могли б зробити плагін із цим кодом. Просто так, щоб було легше знайти.
Жульєн__

15

Перевірте мій проект fzf .

Це нечіткий шукач загального призначення, написаний на Golang, який можна використовувати з будь-яким списком речей: файлами, процесами, історією команд, гілками git тощо.

Для zsh він забезпечує такі ключові прив’язки:

  • CTRL-T - Вставте вибрані шляхи до файлів у командний рядок
  • CTRL-R - Вставте вибрану команду з історії в командний рядок
  • ALT-C - CD у вибраний каталог

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

# 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>

3
Як я можу змусити цю вкладку доповнити цим за замовчуванням? Без **
набору
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.