Bater
set completion-ignore-case on
in ~/.inputrc
(ou bind 'set completion-ignore-case on'
in ~/.bashrc
) seria minha recomendação. Se você deseja digitar o nome completo, por que recusar alguns toques na Shifttecla?
Mas se você realmente quiser, aqui está um wrapper cd
que tenta uma correspondência exata e, se não houver, procura uma correspondência que não diferencia maiúsculas de minúsculas e a executa se for única. Ele usa a nocaseglob
opção shell para globbing sem distinção entre maiúsculas e minúsculas e transforma o argumento em um globo acrescentando @()
(que não corresponde a nada e requer extglob
). A extglob
opção precisa ser ativada ao definir a função, caso contrário, o bash não pode nem analisá-la. Esta função não suporta 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
Enquanto estou nisso, aqui está uma função semelhante para o ksh93. A ~(i)
modificação modificada para correspondência sem distinção entre maiúsculas e minúsculas parece ser incompatível com o /
sufixo para corresponder apenas aos diretórios (isso pode ser um bug no meu lançamento do ksh). Então, eu uso uma estratégia diferente, para eliminar não-diretórios.
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, aqui está uma versão zsh. Novamente, permitir a conclusão sem distinção entre maiúsculas e minúsculas é provavelmente a melhor opção. A configuração a seguir volta a globbing que não diferencia maiúsculas de minúsculas se não houver uma correspondência exata de maiúsculas e minúsculas:
zstyle ':completion:*' '' matcher-list 'm:{a-z}={A-Z}'
Remova ''
para mostrar todas as correspondências que não diferenciam maiúsculas de minúsculas, mesmo que exista uma correspondência de maiúsculas e minúsculas. Você pode definir isso na interface do 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
ebackUp
, comobackup
não, para qual diretório deseja ir?