This commit is contained in:
Roeniss Moon 2025-03-26 10:12:52 +09:00 committed by GitHub
commit 6a371206bb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -1,19 +1,18 @@
alias-finder() {
local cmd=" " exact="" longer="" cheaper="" wordEnd="'{0,1}$" finder="" filter=""
local cmd=" " exact=false longer=false cheaper=false wordStart="^'?" wordEnd="'?$" finder="" filter=""
# build command and options
# setup options
# XXX: This logic has flaw. If user enable options with zstyle, there's no way to disable it.
# It's because same function is used for autoload hook and manual execution.
# I believe manual execution is very minor in use, so I'll keep it as is for now.
for c in "$@"; do
case $c in
# TODO: Remove backward compatibility (other than zstyle form)
# set options if exist
-e|--exact) exact=true;;
-l|--longer) longer=true;;
-c|--cheaper) cheaper=true;;
# concatenate cmd
*) cmd="$cmd$c " ;;
esac
done
zstyle -t ':omz:plugins:alias-finder' longer && longer=true
zstyle -t ':omz:plugins:alias-finder' exact && exact=true
zstyle -t ':omz:plugins:alias-finder' cheaper && cheaper=true
@ -25,13 +24,11 @@ alias-finder() {
## - add escaping character to special characters
cmd=$(echo -n "$cmd" | tr '\n' ' ' | xargs | tr -s '[:space:]' | sed 's/[].\|$(){}?+*^[]/\\&/g')
if [[ $longer == true ]]; then
wordEnd="" # remove wordEnd to find longer aliases
fi
$longer && wordEnd=".*$"
# find with alias and grep, removing last word each time until no more words
while [[ $cmd != "" ]]; do
finder="'{0,1}$cmd$wordEnd"
finder="$wordStart$cmd$wordEnd"
# make filter to find only shorter results than current cmd
if [[ $cheaper == true ]]; then
@ -45,22 +42,21 @@ alias-finder() {
alias | grep -E "$filter" | grep -E "=$finder"
if [[ $exact == true ]]; then
break # because exact case is only one
elif [[ $longer = true ]]; then
break # because above grep command already found every longer aliases during first cycle
fi
$exact && break # because exact case is only one
$longer && break # because above grep command already found every longer aliases during first cycle
cmd=$(sed -E 's/ {0,}[^ ]*$//' <<< "$cmd") # remove last word
done
}
# add hook to run alias-finder before each command
preexec_alias-finder() {
# TODO: Remove backward compatibility (other than zstyle form)
zstyle -t ':omz:plugins:alias-finder' autoload && alias-finder $1 || if [[ $ZSH_ALIAS_FINDER_AUTOMATIC = true ]]; then
alias-finder $1
fi
alias-finder "$1"
}
autoload -U add-zsh-hook
add-zsh-hook preexec preexec_alias-finder
if zstyle -t ':omz:plugins:alias-finder' autoload ; then
autoload -Uz alias-finder
add-zsh-hook preexec preexec_alias-finder
elif [[ $ZSH_ALIAS_FINDER_AUTOMATIC = true ]]; then # TODO: remove this legacy style support
autoload -Uz alias-finder
add-zsh-hook preexec preexec_alias-finder
fi