Frapper
set completion-ignore-case on
en ~/.inputrc
(ou bind 'set completion-ignore-case on'
en ~/.bashrc
) serait ma recommandation. Si vous allez taper le nom complet, pourquoi rechigner à quelques pressions sur la Shifttouche?
Mais si vous le voulez vraiment, voici un wrapper cd
qui essaie une correspondance exacte, et s'il n'y en a pas, recherche une correspondance insensible à la casse et l'exécute si elle est unique. Il utilise l' nocaseglob
option shell pour la globalisation insensible à la casse et transforme l'argument en glob en ajoutant @()
(ce qui ne correspond à rien et nécessite extglob
). L' extglob
option doit être activée lors de la définition de la fonction, sinon bash ne peut même pas l'analyser. Cette fonction n'est pas prise en charge 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
Pendant que j'y suis, voici une fonction similaire pour ksh93. La ~(i)
modification pour une correspondance insensible à la casse semble être incompatible avec le /
suffixe pour correspondre uniquement aux répertoires (cela peut être un bogue dans ma version de ksh). J'utilise donc une stratégie différente pour éliminer les non-répertoires.
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
Enfin, voici une version zsh. Encore une fois, autoriser une complétion insensible à la casse est probablement la meilleure option. Le paramètre suivant revient à un remplacement insensible à la casse s'il n'y a pas de correspondance exacte:
zstyle ':completion:*' '' matcher-list 'm:{a-z}={A-Z}'
Supprimer ''
pour afficher toutes les correspondances insensibles à la casse même s'il existe une correspondance exacte à la casse. Vous pouvez définir cela à partir de l'interface de menu 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
etbackUp
comment nebackup
pas dans quel répertoire vous voulez aller?