2014-02-05 6 views
6

Я изменил оболочку от bash до zsh, и мне было интересно, возможно ли это для нечетких полных команд, как с палитрой Sublime Text. Я думаю, что эта концепция поиска, завершения должна быть везде. Это огромная экономия времени.Как добавить нечеткое завершение (например, Sublime Text palette) в ZSH

Пример:

cd dcmts -> cd Documents

cd dwnls/mnf -> cd Downloads/MyNewFolder

я увидел следующий проект, и это на самом деле не убедительны.

zsh-fuzzy-match

И это представляется возможным определить некоторые параметры или алгоритмы для настройки поведения Zsh по завершении.

zstyle ':completion:*' completer _complete _match _approximate

zstyle ':completion:*:match:*' original only

zstyle ':completion:*:approximate:*' max-errors 10 numeric

Проблема двух предыдущих решений является то, что папки имеет в верхней части списка не отображается при заполнении в то время как это часто то, что пользователь хочет.

Если у вас есть интересный .zshrc, который будет нечетким поиском, это было бы интересно.

Благодарим за помощь.

ответ

3

Можете привести пример: Если вы заполняете, то папки не отображаются в списке. Это кажется у вас есть что-то в вашей конфигурации, разбирая вещи для вас. Zsh по умолчанию будет только полная cd с каталогами:

zsh -f # new Zsh with only default configs 
% zstyle ':completion:*' completer _complete _match _approximate 
% zstyle ':completion:*:approximate:*' max-errors 3 numeric 
% mkdir test && cd test 
% mkdir etc && touch et0 
% autoload -U compinit && compinit 
% cd et0[TAB] # removes the 'et0' and replaces it with 'etc'. 

FWIW, для «поиска и завершения везде» рассмотреть вопрос о попытке predicthttps://stackoverflow.com/a/17230878/766289 (я нахожу это немного безумен ...)

Кроме того, в Zsh вас может делать такие вещи, как:

setopt auto_cd 
alias -d build=/home/foo/very/long/path/build # dir alias 
build # <-- changes into /home/foo/very/long/path/build 

или просто

zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' # match upper from lower case 
cd d/m[TAB] # just type the initial letter of each dir 
cd Downloads/MyNewFolder 

Я имею в виду cd d/m требует меньше печатать, чем cd dwnls/mnf ;-)

+0

На самом деле папки не отображались сверху, потому что я не вводил команду cd, а только имя папки. Так что это нормально. Вы совершенно правы в том, что 'cd d/m' намного быстрее, чем' cd dwnls/mnf'. Я попытаюсь использовать его. И решение для прогнозирования - это просто УДИВИТЕЛЬНОЕ. Мне нравится, спасибо;) –

5

Я предлагаю вам проверить fzf, общее назначение нечеткого искатель, который может обрабатывать строки из стандартного ввода. Он написан на Ruby, а не на zsh-скрипте, поэтому может быть и не то, что вы ищете, но так же, как zsh-fuzzy-match, он устанавливает привязку CTRL-T к вашей оболочке, и довольно просто настроить его поведение.

GIF ниже показывает, как это работает.

EDIT:

fzf был полностью переписан в Go и теперь поставляется с fuzzy completion support для Zsh и Баш.

+0

Это хорошая работа. Я жду, когда модуль будет создан для zsh. Разработчик, похоже, ждет запросов на pull. Спасибо за это. –

4

Попробуйте поставить этот

zstyle ':completion:*' matcher-list 'r:[[:ascii:]]||[[:ascii:]]=** r:|=* m:{a-z\-}={A-Z\_}' 

В вашем zshrc. Он делает именно то, что вы хотите, и делает это с собственной системой завершения zsh, а не с внешней системой завершения.

+0

работал как шарм! TY – schurpf

+0

Можете ли вы объяснить аргумент после «matcher-list» в деталях? Кажется, что он работает после короткого теста (с 'ls'), но имеет некоторые сбои: абсолютные пути не завершены, а совпадения в поддиреях отображаются в списке завершения, но удаляются из командной строки, например. 'cd /' then 'ls etc/p ' перечисляет некоторые файлы в/etc, у которых есть p в их имени, но в моей командной строке установлено 'ls etc /'. – Lucas

Смежные вопросы