Как можно настроить zsh на автозаполнение имени каталога с совпадением верблюдов?


9

Eclipse и Resharper имеют хороший способ навигации по файлам.

Если у меня есть следующие папки (или файлы) в моем текущем каталоге

MyReallyLongName
MyReallyLongAndFunName
MyReallyLongAndNotReallyFunName

В затмении я могу перейти к ним, используя только заглавные буквы. Соответственно в zsh я хочу набрать:

CD MRLAFN (вкладка) (Enter)

Чтобы войти MyReallyLongAndFunNameв один шаг

Если я хочу сделать это с Zsh прямо сейчас, я должен набрать My(Tab)Fun(Tab)(Enter)

Ответы:


6

Это работает для меня:

zstyle ':completion:*' matcher-list 'r:[^A-Z0-9]||[A-Z0-9]=** r:|=*' 

Тогда я могу сделать это в тестовой директории:

touch MyReallyLongName MyReallyLongAndFunName MyReallyLongAndNotReallyFunName
ls MRLANRFN<TAB>
ls MyReallyLongAndNotReallyFunName

Я собрал его вместе из советов в Руководстве пользователя Zshell .


Не могли бы вы описать, где я должен разместить это расширение (файл, папка)? Вам также может быть интересно добавить его в проект zsh-дополнений .
JJD

добавьте его в свой ~ / .zshrc
Коди

Это не совсем работает , как ожидалось, с AbcAde AdFg HlAkAd, не ls AA<TAB>завершится к Ad, в то время как я ожидал бы AbcAde.
Ареколек

@arekolek "Объявление" является частичным завершением. Если вы снова нажмете TAB (в зависимости от конфигурации zsh), вы увидите все файлы, которые соответствуют. Он должен включать все три файла. Затем вы можете выбрать один из них с помощью выбора меню или введя еще несколько имен файлов, чтобы вести завершитель.
Phord

@arekolek Извините - я неправильно прочитал. Я не уверен, как вы попали в объявление оттуда. Я думал, что это был частично-неоднозначный матч, но по вашему примеру это трудно понять. 2-й TAB дает больше результатов?
Phord

2

Я получил это, чтобы работать «довольно хорошо», добавив _camel_caseв свой личный файл ~/.zsh/functions folder(возьмите любую папку, которая находится в вашей $fpathпеременной) со следующим содержанием:

#autoload

[[ -z "$PREFIX" ]] && return 1

relpath=$(dirname $PREFIX)

[[ -e $relpath ]] || return 1

files=$(ls $relpath)

regex=$(echo $(basename $PREFIX) | sed -e 's/\([A-Z][^A-Z]*\)/\1[^A-Z]+/g')

correctedfiles=($(echo $files | grep -P $regex | sed -e :a -e '$!N;s/\n/ /;ta'))

results=($(for file in $correctedfiles; do echo "$relpath/$file"; done))

compadd -U -f -- $results

Затем я добавил следующую строку в мой ~ / .zshrc

zstyle ':completion:*' completer _complete _correct _path_files _camel_case

Обратите внимание, что это, скорее всего, не «хорошее» решение, так как я не слишком разбираюсь в системе завершения zsh (я думаю, что только немногие действительно знают это), но это именно то, что вы описали в своем вопросе.


Это только несколько работает .. MKDIR AaBbCcDd CD ABCD (вкладка) => CD ./ т.е. Автозаполнение не
удалось
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.