Golpetazo
set completion-ignore-case on
en ~/.inputrc
(o bind 'set completion-ignore-case on'
en ~/.bashrc
) sería mi recomendación. Si va a escribir el nombre completo, ¿por qué rechazar unas pocas pulsaciones de la Shifttecla?
Pero si realmente lo quiere, aquí hay una envoltura cd
que intenta una coincidencia exacta, y si no hay ninguna, busca una coincidencia entre mayúsculas y minúsculas y la realiza si es única. Utiliza la nocaseglob
opción de shell para el globbing que no distingue entre mayúsculas y minúsculas, y convierte el argumento en un glob al agregarlo @()
(que no coincide con nada y requiere extglob
). La extglob
opción tiene que estar activada cuando se define la función, de lo contrario bash ni siquiera puede analizarla. Esta función no es compatible CDPATH
.
shopt -s extglob
cd () {
builtin cd "$@" 2>/dev/null && return
local options_to_unset=; local -a matches
[[ :$BASHOPTS: = *:extglob:* ]] || options_to_unset="$options_to_unset extglob"
[[ :$BASHOPTS: = *:nocaseglob:* ]] || options_to_unset="$options_to_unset nocaseglob"
[[ :$BASHOPTS: = *:nullglob:* ]] || options_to_unset="$options_to_unset nullglob"
shopt -s extglob nocaseglob nullglob
matches=("${!#}"@()/)
shopt -u $options_to_unset
case ${#matches[@]} in
0) # There is no match, even case-insensitively. Let cd display the error message.
builtin cd "$@";;
1)
matches=("$@" "${matches[0]}")
unset "matches[$(($#-1))]"
builtin cd "${matches[@]}";;
*)
echo "Ambiguous case-insensitive directory match:" >&2
printf "%s\n" "${matches[@]}" >&2
return 3;;
esac
}
Ksh
Mientras estoy en eso, aquí hay una función similar para ksh93. La ~(i)
modificación para la coincidencia que no distingue entre mayúsculas y minúsculas parece ser incompatible con el /
sufijo para hacer coincidir solo los directorios (esto puede ser un error en mi versión de ksh). Entonces uso una estrategia diferente, para eliminar los no directorios.
cd () {
command cd "$@" 2>/dev/null && return
typeset -a args; typeset previous target; typeset -i count=0
args=("$@")
for target in ~(Ni)"${args[$(($#-1))]}"; do
[[ -d $target ]] || continue
if ((count==1)); then printf "Ambiguous case-insensitive directory match:\n%s\n" "$previous" >&2; fi
if ((count)); then echo "$target"; fi
((++count))
previous=$target
done
((count <= 1)) || return 3
args[$(($#-1))]=$target
command cd "${args[@]}"
}
Zsh
Finalmente, aquí hay una versión zsh. Nuevamente, permitir la finalización sin distinción entre mayúsculas y minúsculas es probablemente la mejor opción. La siguiente configuración vuelve a ser insensible a mayúsculas y minúsculas si no hay coincidencia exacta de mayúsculas y minúsculas:
zstyle ':completion:*' '' matcher-list 'm:{a-z}={A-Z}'
Eliminar ''
para mostrar todas las coincidencias entre mayúsculas y minúsculas, incluso si hay una coincidencia exacta entre mayúsculas y minúsculas. Puede configurar esto desde la interfaz del menú de compinstall
.
cd () {
builtin cd "$@" 2>/dev/null && return
emulate -L zsh
setopt local_options extended_glob
local matches
matches=( (#i)${(P)#}(N/) )
case $#matches in
0) # There is no match, even case-insensitively. Try cdpath.
if ((#cdpath)) &&
[[ ${(P)#} != (|.|..)/* ]] &&
matches=( $^cdpath/(#i)${(P)#}(N/) ) &&
((#matches==1))
then
builtin cd $@[1,-2] $matches[1]
return
fi
# Still nothing. Let cd display the error message.
builtin cd "$@";;
1)
builtin cd $@[1,-2] $matches[1];;
*)
print -lr -- "Ambiguous case-insensitive directory match:" $matches >&2
return 3;;
esac
}
backUP
ybackUp
, ¿cómobackup
no a qué directorio desea ir?