Como o zsh pode ser configurado para preencher automaticamente o nome do diretório com a correspondência camelcase?

9

O Eclipse e o Resharper têm uma ótima maneira de navegar pelos arquivos.

Se eu tiver as seguintes pastas (ou arquivos) no meu diretório atual

MyReallyLongName
MyReallyLongAndFunName
MyReallyLongAndNotReallyFunName

No eclipse, posso navegar até eles usando apenas as letras maiúsculas. Correspondentemente, no zsh, desejo poder digitar:

cd MRLAFN (guia) (Enter)

Para entrar MyReallyLongAndFunNameem uma etapa

Se eu quiser fazer isso com o zsh agora, tenho que digitar My(Tab)Fun(Tab)(Enter)

Rohit Manokaran
fonte

Respostas:

6

Isso funciona para mim:

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

Então eu posso fazer isso em um diretório de teste:

touch MyReallyLongName MyReallyLongAndFunName MyReallyLongAndNotReallyFunName
ls MRLANRFN<TAB>
ls MyReallyLongAndNotReallyFunName

Eu juntei tudo com dicas do Guia do Usuário do Zshell .

frase
fonte
Você pode descrever onde devo colocar esta extensão (arquivo, pasta)? Você também pode estar interessado em adicioná-lo ao projeto zsh-completions .
JJD
adicione-o ao seu ~ / .zshrc #
Cody
Isso não funciona exatamente como esperado, com AbcAde AdFg HlAkAd, ls AA<TAB>termina Ad, enquanto eu esperava o AbcAde.
arekolek
@arekolek "Anúncio" é uma conclusão parcial. Se você pressionar TAB novamente (dependendo da configuração do zsh), verá todos os arquivos correspondentes. Ele deve incluir todos os três arquivos. Em seguida, você pode escolher um com a seleção do menu ou digitando um pouco mais do nome do arquivo para orientar o completer.
phord
@arekolek Desculpe - eu li isso errado. Não tenho certeza de como você conseguiu ad a partir daí. Eu pensei que era uma correspondência parcialmente ambígua, mas é difícil dizer com o seu exemplo. Um segundo TAB produz mais resultados?
phord
2

Consegui que isso funcionasse "muito bem" adicionando um arquivo _camel_caseao meu pessoal ~/.zsh/functions folder(pegue qualquer pasta que esteja na sua $fpathvariável) com o seguinte conteúdo:

#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

Em seguida, adicionei a seguinte linha ao meu ~ / .zshrc

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

Observe que essa provavelmente não é uma solução "boa", pois não tenho muito conhecimento do sistema de conclusão do zsh (acho que apenas poucas pessoas realmente têm), mas faz exatamente o que você descreveu na sua pergunta.

tobi_p
fonte
Isso só funciona um pouco .. mkdir AaBbCcDd cd ABCD (tab) => cd ./ ie. Autocomplete falhar
Rohit Manokaran