Pesta
set completion-ignore-case on
di ~/.inputrc
(atau bind 'set completion-ignore-case on'
dalam ~/.bashrc
) akan menjadi rekomendasi saya. Jika Anda akan mengetikkan nama lengkap, mengapa menolak keras pada beberapa penekanan Shifttombol?
Tetapi jika Anda benar-benar menginginkannya, ini adalah pembungkus cd
yang mencoba untuk pertandingan yang tepat, dan jika tidak ada, cari pertandingan yang tidak peka terhadap huruf besar dan lakukan jika itu unik. Ia menggunakan nocaseglob
opsi shell untuk globbing case-insensitive, dan mengubah argumen menjadi glob dengan menambahkan @()
(yang tidak cocok dengan apa pun, dan mengharuskan extglob
). The extglob
pilihan harus diaktifkan ketika mendefinisikan fungsi, jika pesta bahkan tidak bisa mengurai itu. Fungsi ini tidak mendukung 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
Sementara saya melakukannya, inilah fungsi serupa untuk ksh93. The ~(i)
dimodifikasi untuk kasus-sensitif pencocokan tampaknya tidak sesuai dengan /
akhiran untuk mencocokkan direktori hanya (ini mungkin bug di rilis saya ksh). Jadi saya menggunakan strategi yang berbeda, untuk menyingkirkan non-direktori.
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
Akhirnya, inilah versi zsh. Sekali lagi, membiarkan penyelesaian case-insensitive mungkin merupakan pilihan terbaik. Pengaturan berikut akan kembali ke penggumpalan case-sensitive jika tidak ada kecocokan case-persis:
zstyle ':completion:*' '' matcher-list 'm:{a-z}={A-Z}'
Hapus ''
untuk menampilkan semua kecocokan dengan huruf besar-kecil sekalipun ada kecocokan dengan huruf besar-kecil. Anda dapat mengatur ini dari antarmuka menu 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
danbackUp
, bagaimanabackup
tidak ke direktori mana yang ingin Anda tuju?