Bash
set completion-ignore-case on
in ~/.inputrc
(oder bind 'set completion-ignore-case on'
in ~/.bashrc
) wäre meine Empfehlung. Wenn Sie den vollständigen Namen eingeben möchten, warum sollten Sie dann ein paar ShiftTastendrücke ausführen ?
Aber wenn Sie es wirklich wollen, finden Sie hier einen Wrapper cd
, der nach einer genauen Übereinstimmung sucht. Wenn es keine gibt, sucht er nach einer Übereinstimmung ohne Berücksichtigung der Groß- und Kleinschreibung und führt sie aus, wenn sie eindeutig ist. Es verwendet die nocaseglob
Shell-Option für das Globbing ohne Berücksichtigung der Groß- und Kleinschreibung und verwandelt das Argument durch Anhängen in einen Glob @()
(der mit nichts übereinstimmt und erforderlich ist extglob
). Die extglob
Option muss beim Definieren der Funktion aktiviert sein, andernfalls kann bash sie nicht einmal analysieren. Diese Funktion wird nicht unterstützt 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
Während ich gerade dabei bin, ist hier eine ähnliche Funktion für ksh93. Das ~(i)
für Übereinstimmungen ohne Berücksichtigung der Groß- und Kleinschreibung modifizierte Element scheint nicht mit dem /
Suffix kompatibel zu sein, nur Verzeichnisse abzugleichen (dies kann ein Fehler in meiner Version von ksh sein). Daher verwende ich eine andere Strategie, um Nicht-Verzeichnisse auszusortieren.
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
Zum Schluss noch eine zsh-Version. Auch hier ist es wahrscheinlich die beste Option, die Vervollständigung ohne Berücksichtigung der Groß- und Kleinschreibung zuzulassen. Die folgende Einstellung greift auf Globbing ohne Berücksichtigung der Groß- und Kleinschreibung zurück, wenn keine Übereinstimmung mit der Groß- und Kleinschreibung vorliegt:
zstyle ':completion:*' '' matcher-list 'm:{a-z}={A-Z}'
Entfernen Sie ''
diese Option , um alle Übereinstimmungen ohne Berücksichtigung der Groß- und Kleinschreibung anzuzeigen, auch wenn eine Übereinstimmung mit der Groß- und Kleinschreibung vorliegt. Sie können dies über die Menüoberfläche von einstellen 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
und habenbackUp
, wie würdebackup
nein zu welchem Verzeichnis Sie gehen möchten?