Jak można skonfigurować Zsh do automatycznego uzupełniania nazwy katalogu z dopasowaniem wielbłąda?

9

Zaćmienie i Resharper mają dobry sposób poruszania się po plikach.

Jeśli mam następujące foldery (lub pliki) w moim bieżącym katalogu

MyReallyLongName
MyReallyLongAndFunName
MyReallyLongAndNotReallyFunName

W Eclipse mogę do nich nawigować, używając tylko wielkich liter. Odpowiednio w Zsh chcę móc pisać:

cd MRLAFN (Tab) (Enter)

Aby wejść MyReallyLongAndFunNamew jeden krok

Jeśli chcę to teraz zrobić w Zsh, muszę pisać My(Tab)Fun(Tab)(Enter)

Rohit Manokaran
źródło

Odpowiedzi:

6

To działa dla mnie:

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

Następnie mogę to zrobić w katalogu testowym:

touch MyReallyLongName MyReallyLongAndFunName MyReallyLongAndNotReallyFunName
ls MRLANRFN<TAB>
ls MyReallyLongAndNotReallyFunName

Zebrałem go razem ze wskazówkami w Podręczniku użytkownika Zshell .

phord
źródło
Czy możesz opisać, gdzie muszę umieścić to rozszerzenie (plik, folder)? Możesz być także zainteresowany dodaniem go do projektu zsh-completements .
JJD
dodaj go do swojego ~ / .zshrc
Cody
To nie do końca działa zgodnie z oczekiwaniami, z AbcAde AdFg HlAkAd, ls AA<TAB>kończy się Ad, podczas gdy spodziewałbym się AbcAde.
arekolek
@arekolek „Reklama” jest częściowym zakończeniem. Jeśli ponownie naciśniesz TAB (w zależności od konfiguracji zsh), zobaczysz wszystkie pasujące pliki. Powinien zawierać wszystkie trzy pliki. Następnie możesz wybrać jedną z opcji menu lub wpisując nieco więcej nazwy pliku, aby poprowadzić program uzupełniający.
phord
@arekolek Przepraszamy - źle przeczytałem. Nie jestem pewien, jak się tam dostałeś do reklamy. Myślałem, że to częściowo dwuznaczne dopasowanie, ale z twojego przykładu ciężko powiedzieć. Czy 2. TAB daje więcej wyników?
phord
2

Sprawiłem, że działało „całkiem dobrze”, dodając plik _camel_casedo mojego osobistego ~/.zsh/functions folder(weź dowolny folder, który znajduje się w twojej $fpathzmiennej) z następującą zawartością:

#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

Następnie dodałem następujący wiersz do mojego ~ / .zshrc

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

Zauważ, że najprawdopodobniej nie jest to „dobre” rozwiązanie, ponieważ nie mam zbyt dużej wiedzy na temat systemu uzupełniania zsh (chyba tylko niewielu ludzi tak naprawdę ma), ale robi dokładnie to, co opisałeś w swoim pytaniu.

tobi_p
źródło
To tylko trochę działa .. mkdir AaBbCcDd cd ABCD (tab) => cd ./ tj. Autouzupełnianie kończy się niepowodzeniem
Rohit Manokaran,