Як можна налаштувати zsh для автоматичного заповнення імені каталогу із збіжкою верблюда?


9

Eclipse та Resharper мають чудовий спосіб навігації по файлах.

Якщо у мене в поточному каталозі є такі папки (або файли)

MyReallyLongName
MyReallyLongAndFunName
MyReallyLongAndNotReallyFunName

У затемненні я можу перейти до них, використовуючи лише великі літери. Відповідно в zsh я хочу мати можливість вводити:

cd MRLAFN (Tab) (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
Cody

Це не зовсім працює , як очікувалося, з AbcAde AdFg HlAkAd, ls AA<TAB>завершується до Ad, в той час як я очікував би AbcAde.
arekolek

@arekolek "Оголошення" - часткове завершення. Якщо ви знову натиснете TAB (залежно від конфігурації zsh), ви побачите всі файли, які відповідають. Він повинен включати всі три файли. Потім ви можете вибрати один із вибором меню або ввівши ще одне ім'я файлу, щоб керувати комплектатором.
фрад

@arekolek Вибачте - я прочитав це неправильно. Я не впевнений, як ти звідти потрапив до оголошення. Я подумав, що це частково неоднозначний збіг, але важко сказати з вашого прикладу. Чи дає другий ТАБ більше результатів?
фрад

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 (tab) => cd ./ тобто. Помилка автозаповнення
Rohit Manokaran
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.