Comment zsh peut-il être configuré pour saisir automatiquement le nom du répertoire avec la correspondance camelcase?

9

Eclipse et Resharper ont une belle façon de parcourir les fichiers.

Si j'ai les dossiers (ou fichiers) suivants dans mon répertoire actuel

MyReallyLongName
MyReallyLongAndFunName
MyReallyLongAndNotReallyFunName

Dans éclipse, je peux y accéder en utilisant uniquement les lettres majuscules. De même, en zsh, je veux pouvoir taper:

cd MRLAFN (Tab) (Entrée)

Pour entrer en MyReallyLongAndFunNameune seule étape

Si je veux faire ça avec zsh maintenant, je dois taper My(Tab)Fun(Tab)(Enter)

Rohit Manokaran
la source

Réponses:

6

Cela fonctionne pour moi:

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

Ensuite, je peux le faire dans un répertoire de test:

touch MyReallyLongName MyReallyLongAndFunName MyReallyLongAndNotReallyFunName
ls MRLANRFN<TAB>
ls MyReallyLongAndNotReallyFunName

Je l'ai bricolé à partir des conseils du guide de l'utilisateur Zshell .

phord
la source
Pouvez-vous décrire où je dois placer cette extension (fichier, dossier)? Vous pourriez également être intéressé à l'ajouter au projet zsh-finitions .
JJD
ajoutez-le à votre ~ / .zshrc
Cody
Cela ne fonctionne pas tout à fait comme prévu, avec AbcAde AdFg HlAkAd, se ls AA<TAB>termine à Ad, alors que je m'attendrais à AbcAde.
arekolek
@arekolek "Ad" est un achèvement partiel. Si vous appuyez à nouveau sur TAB (selon votre configuration zsh), vous verrez tous les fichiers qui correspondent. Il doit inclure les trois fichiers. Ensuite, vous pouvez en choisir un avec la sélection de menu ou en tapant un peu plus du nom de fichier pour guider le complément.
phord
@arekolek Désolé - j'ai mal lu. Je ne sais pas comment vous êtes arrivé à Ad à partir de là. Je pensais que c'était un match partiellement ambigu, mais c'est difficile à dire d'après votre exemple. Un 2e TAB produit-il plus de résultats?
phord
2

J'ai obtenu que cela fonctionne "assez bien" en ajoutant un fichier _camel_caseà mon dossier personnel ~/.zsh/functions folder(prenez n'importe quel dossier qui est dans votre $fpathvariable) avec le contenu suivant:

#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

Ensuite, j'ai ajouté la ligne suivante à mon ~ / .zshrc

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

Notez que ce n'est probablement pas une "bonne" solution car je n'ai pas trop de connaissances sur le système de complétion de zsh (seulement quelques personnes l'ont vraiment, je suppose), mais cela fait exactement ce que vous avez décrit dans votre question.

tobi_p
la source
Cela ne fonctionne que quelque peu. Mkdir AaBbCcDd cd ABCD (tab) => cd ./ ie. La saisie semi-automatique échoue
Rohit Manokaran