ทุบตี
set completion-ignore-case on
ใน~/.inputrc
(หรือbind 'set completion-ignore-case on'
ใน~/.bashrc
) จะเป็นคำแนะนำของฉัน หากคุณกำลังจะพิมพ์ชื่อเต็มว่าทำไมความพ่ายแพ้ที่กดไม่กี่Shiftที่สำคัญ?
แต่ถ้าคุณต้องการมันจริง ๆ นี่คือเสื้อคลุมยาว ๆcd
ที่พยายามจับคู่แบบตรงและถ้าไม่มีก็จะมองหาการแข่งขันแบบตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ถ้ามันไม่ซ้ำกัน มันใช้nocaseglob
ตัวเลือกเชลล์สำหรับการวนตัวพิมพ์แบบไม่คำนึงถึงขนาดตัวพิมพ์และเปลี่ยนการโต้แย้งให้เป็นแบบกลมโดยต่อท้าย@()
(ซึ่งไม่ตรงกับสิ่งใดและต้องการextglob
) extglob
ตัวเลือกที่จะต้องมีการเปิดใช้งานเมื่อกำหนดฟังก์ชั่นมิฉะนั้นทุบตีไม่สามารถแม้แต่จะแยกมัน 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
ในขณะที่ฉันอยู่ที่นี่นี่เป็นฟังก์ชั่นที่คล้ายกันสำหรับ ksh93 การ~(i)
จับคู่แบบ case-insensitive ที่แก้ไขแล้วดูเหมือนจะไม่เข้ากันกับ/
ส่วนต่อท้ายเพื่อจับคู่ไดเรกทอรีเท่านั้น (นี่อาจเป็นข้อผิดพลาดในการปล่อย ksh ของฉัน) ดังนั้นฉันจึงใช้กลยุทธ์ที่แตกต่างกันเพื่อแยกไดเรกทอรีที่ไม่ใช่
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
ในที่สุดนี่คือรุ่น zsh อีกครั้งการอนุญาตให้ใช้ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่นั้นอาจเป็นตัวเลือกที่ดีที่สุด การตั้งค่าต่อไปนี้กลับไปเป็นแบบไม่ตรงตามตัวพิมพ์ใหญ่และตัวพิมพ์เล็กหากไม่มีการจับคู่แบบตัวพิมพ์ใหญ่:
zstyle ':completion:*' '' matcher-list 'm:{a-z}={A-Z}'
ลบ''
เพื่อแสดงการจับคู่แบบตัวพิมพ์เล็กและตัวพิมพ์ใหญ่แม้ว่าจะมีการจับคู่แบบตัวพิมพ์ใหญ่ 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
และbackUp
จะbackup
ไม่มีไดเรกทอรีใดที่คุณต้องการไป