Bash
set completion-ignore-case on
trong ~/.inputrc
(hoặc bind 'set completion-ignore-case on'
trong ~/.bashrc
) sẽ là đề nghị của tôi. Nếu bạn định nhập tên đầy đủ, tại sao lại chần chừ vài lần nhấn Shiftphím?
Nhưng nếu bạn thực sự muốn nó, đây là một trình bao bọc cd
cố gắng cho một kết hợp chính xác và nếu không có, hãy tìm một kết quả không phân biệt chữ hoa chữ thường và thực hiện nó nếu nó là duy nhất. Nó sử dụng nocaseglob
tùy chọn shell cho toàn cầu không phân biệt chữ hoa chữ thường và biến đối số thành một phần tử bằng cách nối thêm @()
(không khớp với gì và yêu cầu extglob
). Các extglob
tùy chọn này phải được bật khi xác định chức năng, nếu không bash thậm chí không thể phân tích nó. Chức năng này không hỗ trợ 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
Trong khi tôi đang ở đây, đây là một chức năng tương tự cho ksh93. Việc ~(i)
sửa đổi cho khớp không phân biệt chữ hoa chữ thường dường như không tương thích với /
hậu tố chỉ khớp với các thư mục (đây có thể là một lỗi trong bản phát hành ksh của tôi). Vì vậy, tôi sử dụng một chiến lược khác, để loại bỏ các thư mục không.
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
Cuối cùng, đây là phiên bản zsh. Một lần nữa, cho phép hoàn thành không phân biệt chữ hoa chữ thường có lẽ là lựa chọn tốt nhất. Cài đặt sau đây rơi trở lại toàn cầu không phân biệt chữ hoa chữ thường nếu không có trường hợp khớp chính xác:
zstyle ':completion:*' '' matcher-list 'm:{a-z}={A-Z}'
Xóa ''
để hiển thị tất cả các kết quả khớp không phân biệt chữ hoa chữ thường ngay cả khi có khớp chính xác. Bạn có thể thiết lập điều này từ giao diện menu của 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
vàbackUp
, làm thế nào đểbackup
không có thư mục nào bạn muốn đi?