¿Cómo se puede configurar zsh para autocompletar el nombre del directorio con la coincidencia de camelcase?

9

Eclipse y Resharper tienen una buena forma de navegar por los archivos.

Si tengo las siguientes carpetas (o archivos) en mi directorio actual

MyReallyLongName
MyReallyLongAndFunName
MyReallyLongAndNotReallyFunName

En eclipse puedo navegar hacia ellos usando solo las letras en mayúscula. En consecuencia, en zsh quiero poder escribir:

cd MRLAFN (Tabulador) (Enter)

Para entrar MyReallyLongAndFunNameen un solo paso

Si quiero hacer eso con zsh en este momento, tengo que escribir My(Tab)Fun(Tab)(Enter)

Rohit Manokaran
fuente

Respuestas:

6

Esto funciona para mi:

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

Entonces puedo hacer esto en un directorio de prueba:

touch MyReallyLongName MyReallyLongAndFunName MyReallyLongAndNotReallyFunName
ls MRLANRFN<TAB>
ls MyReallyLongAndNotReallyFunName

Lo combiné con consejos de la Guía del usuario de Zshell .

Phord
fuente
¿Puede describir dónde debo colocar esta extensión (archivo, carpeta)? También podría estar interesado en agregarlo al proyecto zsh-completions .
JJD
agrégalo a tu ~ / .zshrc
Cody
Esto no funciona como se esperaba, con AbcAde AdFg HlAkAd, ls AA<TAB>completa Ad, mientras que esperaría AbcAde.
arekolek
@arekolek "Ad" es una finalización parcial. Si presiona TAB nuevamente (dependiendo de su configuración de zsh) verá todos los archivos que coinciden. Debe incluir los tres archivos. Luego puede elegir uno con la selección del menú o escribiendo un poco más del nombre del archivo para guiar al usuario que lo completó.
Phord
@arekolek Lo siento, lo leí mal. No estoy seguro de cómo llegaste a Ad desde allí. Pensé que era una coincidencia parcialmente ambigua, pero es difícil saber por su ejemplo. ¿Un segundo TAB produce más resultados?
Phord
2

Conseguí que esto funcionara "bastante bien" agregando un archivo _camel_casea mi archivo personal ~/.zsh/functions folder(tome cualquier carpeta que esté en su $fpathvariable) con el siguiente contenido:

#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

Luego, agregué la siguiente línea a mi ~ / .zshrc

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

Tenga en cuenta que probablemente esta no sea una solución "buena", ya que no tengo demasiado conocimiento del sistema de finalización de zsh (supongo que solo algunas personas realmente lo tienen), pero hace exactamente lo que usted describió en su pregunta.

tobi_p
fuente
Esto solo funciona un poco ... mkdir AaBbCcDd cd ABCD (tab) => cd ./ ie. Autocompletar falla
Rohit Manokaran