mirror of
https://github.com/zsh-users/zsh-autosuggestions.git
synced 2025-04-17 11:35:31 +08:00
Merge 270d988ae6
into d7c796719e
This commit is contained in:
commit
64de83722b
@ -43,6 +43,7 @@ Set `ZSH_AUTOSUGGEST_STRATEGY` to choose the strategy for generating suggestions
|
|||||||
|
|
||||||
- `default`: Chooses the most recent match.
|
- `default`: Chooses the most recent match.
|
||||||
- `match_prev_cmd`: Chooses the most recent match whose preceding history item matches the most recently executed command ([more info](src/strategies/match_prev_cmd.zsh)). Note that this strategy won't work as expected with ZSH options that don't preserve the history order such as `HIST_IGNORE_ALL_DUPS` or `HIST_EXPIRE_DUPS_FIRST`.
|
- `match_prev_cmd`: Chooses the most recent match whose preceding history item matches the most recently executed command ([more info](src/strategies/match_prev_cmd.zsh)). Note that this strategy won't work as expected with ZSH options that don't preserve the history order such as `HIST_IGNORE_ALL_DUPS` or `HIST_EXPIRE_DUPS_FIRST`.
|
||||||
|
- `predefined`: Chooses the most recent match in history and predefined database which is generated from available commands in $PATH and their help at the first time `predefined` strategy is used.
|
||||||
|
|
||||||
|
|
||||||
### Widget Mapping
|
### Widget Mapping
|
||||||
|
2327
predefined.txt
Normal file
2327
predefined.txt
Normal file
File diff suppressed because it is too large
Load Diff
@ -11,7 +11,7 @@ ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=8'
|
|||||||
# Prefix to use when saving original versions of bound widgets
|
# Prefix to use when saving original versions of bound widgets
|
||||||
ZSH_AUTOSUGGEST_ORIGINAL_WIDGET_PREFIX=autosuggest-orig-
|
ZSH_AUTOSUGGEST_ORIGINAL_WIDGET_PREFIX=autosuggest-orig-
|
||||||
|
|
||||||
ZSH_AUTOSUGGEST_STRATEGY=default
|
ZSH_AUTOSUGGEST_STRATEGY=${ZSH_AUTOSUGGEST_STRATEGY:-default}
|
||||||
|
|
||||||
# Widgets that clear the suggestion
|
# Widgets that clear the suggestion
|
||||||
ZSH_AUTOSUGGEST_CLEAR_WIDGETS=(
|
ZSH_AUTOSUGGEST_CLEAR_WIDGETS=(
|
||||||
|
112
src/strategies/predefined.zsh
Normal file
112
src/strategies/predefined.zsh
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
# zsh-augosuggestion: predefined strategy
|
||||||
|
# 1. search in history, returns result if it exists
|
||||||
|
# 2. search in predefined files
|
||||||
|
#
|
||||||
|
# configuration:
|
||||||
|
#
|
||||||
|
# ZSH_AUTOSUGGEST_PREDEFINE_PATH - user defined files separated by semicolon
|
||||||
|
#
|
||||||
|
# "~/.local/share/zsh_autosuggest/predefined" will be generated at the first time
|
||||||
|
#
|
||||||
|
# zsh-autosuggestions/predefined.txt is generated from tldr pages and
|
||||||
|
# will ship with predefined.zsh .
|
||||||
|
#
|
||||||
|
|
||||||
|
_zsh_autosuggest_script_path="${0:A:h}"
|
||||||
|
_zsh_autosuggest_data_home="${XDG_DATA_HOME:-$HOME/.local/share}/zsh_autosuggest"
|
||||||
|
|
||||||
|
_zsh_autosuggest_predefined_generate() {
|
||||||
|
local pbase="$_zsh_autosuggest_data_home"
|
||||||
|
local pname="$pbase/predefined"
|
||||||
|
local ptemp="$pbase/predefined.$[RANDOM]"
|
||||||
|
local suggests=()
|
||||||
|
local pwd=$(pwd)
|
||||||
|
|
||||||
|
[ ! -d "$pbase" ] && mkdir -p "$pbase" 2> /dev/null
|
||||||
|
|
||||||
|
# skip when ~/.zsh_autosuggest exists
|
||||||
|
[ -f "$pname" ] && return
|
||||||
|
|
||||||
|
# echo "autosuggestions is generating: $pname"
|
||||||
|
|
||||||
|
# copy builtin predefine database
|
||||||
|
local txt="${_zsh_autosuggest_script_path}/predefined.txt"
|
||||||
|
|
||||||
|
[ -f "$txt" ] && cat "$txt" > "$ptemp"
|
||||||
|
|
||||||
|
# enumerate commands in $PATH and add them to ~/.zsh_autosuggest
|
||||||
|
for p ("${(@s/:/)PATH}"); do
|
||||||
|
[ ! -d "$p" ] && continue
|
||||||
|
cd "$p"
|
||||||
|
local files=($(command ls))
|
||||||
|
for fn in ${files}; do
|
||||||
|
if [ -x "$fn" ] && [[ "${fn:l}" != *.dll ]]; then
|
||||||
|
if [ -f "$fn" ] && [[ "${fn:l}" != *.nls ]]; then
|
||||||
|
# trim cygwin .exe/.cmd/.bat postfix
|
||||||
|
if [[ "$fn" == *.exe ]]; then
|
||||||
|
fn=${fn/%.exe/}
|
||||||
|
elif [[ "$fn" == *.cmd ]]; then
|
||||||
|
fn=${fn/%.cmd/}
|
||||||
|
elif [[ "$fn" == *.bat ]]; then
|
||||||
|
fn=${fn/%.bat/}
|
||||||
|
fi
|
||||||
|
if [[ ${#fn} -gt 1 ]]; then
|
||||||
|
suggests+=$fn
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
|
cd "${pwd}"
|
||||||
|
|
||||||
|
# TODO: generate command parameters from completion database
|
||||||
|
|
||||||
|
print -l $suggests >> "$ptemp"
|
||||||
|
|
||||||
|
# atomic change file name
|
||||||
|
mv -f "$ptemp" "$pname"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
_zsh_autosuggest_strategy_predefined() {
|
||||||
|
emulate -L zsh
|
||||||
|
setopt EXTENDED_GLOB
|
||||||
|
local prefix="${1//(#m)[\\*?[\]<>()|^~#]/\\$MATCH}"
|
||||||
|
|
||||||
|
# search the history at first
|
||||||
|
local result="${history[(r)${prefix}*]}"
|
||||||
|
|
||||||
|
# check if necessary to generate predefine database
|
||||||
|
if (( ! ${+_ZSH_AUTOSUGGEST_GENERATED} )); then
|
||||||
|
_ZSH_AUTOSUGGEST_GENERATED=1
|
||||||
|
_zsh_autosuggest_predefined_generate
|
||||||
|
fi
|
||||||
|
|
||||||
|
# search the predefine files if nothing found in history
|
||||||
|
if [[ -z "$result" ]]; then
|
||||||
|
if (( ! ${+_ZSH_AUTOSUGGEST_PREDEFINE} )); then
|
||||||
|
typeset -g _ZSH_AUTOSUGGEST_PREDEFINE=()
|
||||||
|
local pbase="$_zsh_autosuggest_data_home"
|
||||||
|
local pname="$pbase/predefined"
|
||||||
|
local names="${ZSH_AUTOSUGGEST_PREDEFINE_PATH};$pname"
|
||||||
|
local array=()
|
||||||
|
for i ("${(s:;:)names}"); do
|
||||||
|
if [[ -n "$i" ]] && [[ -f "$i" ]]; then
|
||||||
|
local temp=(${(f)"$(<$i)"})
|
||||||
|
array+=($temp)
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
_ZSH_AUTOSUGGEST_PREDEFINE+=($array)
|
||||||
|
fi
|
||||||
|
result="${_ZSH_AUTOSUGGEST_PREDEFINE[(r)${prefix}*]}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
typeset -g suggestion="$result"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# _zsh_autosuggest_predefined_generate
|
||||||
|
|
||||||
|
# vim: set ts=4 sw=4 tw=0 et :
|
||||||
|
|
||||||
|
|
@ -576,6 +576,118 @@ _zsh_autosuggest_strategy_match_prev_cmd() {
|
|||||||
# Give back the matched history entry
|
# Give back the matched history entry
|
||||||
typeset -g suggestion="$history[$histkey]"
|
typeset -g suggestion="$history[$histkey]"
|
||||||
}
|
}
|
||||||
|
# zsh-augosuggestion: predefined strategy
|
||||||
|
# 1. search in history, returns result if it exists
|
||||||
|
# 2. search in predefined files
|
||||||
|
#
|
||||||
|
# configuration:
|
||||||
|
#
|
||||||
|
# ZSH_AUTOSUGGEST_PREDEFINE_PATH - user defined files separated by semicolon
|
||||||
|
#
|
||||||
|
# "~/.local/share/zsh_autosuggest/predefined" will be generated at the first time
|
||||||
|
#
|
||||||
|
# zsh-autosuggestions/predefined.txt is generated from tldr pages and
|
||||||
|
# will ship with predefined.zsh .
|
||||||
|
#
|
||||||
|
|
||||||
|
_zsh_autosuggest_script_path="${0:A:h}"
|
||||||
|
_zsh_autosuggest_data_home="${XDG_DATA_HOME:-$HOME/.local/share}/zsh_autosuggest"
|
||||||
|
|
||||||
|
_zsh_autosuggest_predefined_generate() {
|
||||||
|
local pbase="$_zsh_autosuggest_data_home"
|
||||||
|
local pname="$pbase/predefined"
|
||||||
|
local ptemp="$pbase/predefined.$[RANDOM]"
|
||||||
|
local suggests=()
|
||||||
|
local pwd=$(pwd)
|
||||||
|
|
||||||
|
[ ! -d "$pbase" ] && mkdir -p "$pbase" 2> /dev/null
|
||||||
|
|
||||||
|
# skip when ~/.zsh_autosuggest exists
|
||||||
|
[ -f "$pname" ] && return
|
||||||
|
|
||||||
|
# echo "autosuggestions is generating: $pname"
|
||||||
|
|
||||||
|
# copy builtin predefine database
|
||||||
|
local txt="${_zsh_autosuggest_script_path}/predefined.txt"
|
||||||
|
|
||||||
|
[ -f "$txt" ] && cat "$txt" > "$ptemp"
|
||||||
|
|
||||||
|
# enumerate commands in $PATH and add them to ~/.zsh_autosuggest
|
||||||
|
for p ("${(@s/:/)PATH}"); do
|
||||||
|
[ ! -d "$p" ] && continue
|
||||||
|
cd "$p"
|
||||||
|
local files=($(command ls))
|
||||||
|
for fn in ${files}; do
|
||||||
|
if [ -x "$fn" ] && [[ "${fn:l}" != *.dll ]]; then
|
||||||
|
if [ -f "$fn" ] && [[ "${fn:l}" != *.nls ]]; then
|
||||||
|
# trim cygwin .exe/.cmd/.bat postfix
|
||||||
|
if [[ "$fn" == *.exe ]]; then
|
||||||
|
fn=${fn/%.exe/}
|
||||||
|
elif [[ "$fn" == *.cmd ]]; then
|
||||||
|
fn=${fn/%.cmd/}
|
||||||
|
elif [[ "$fn" == *.bat ]]; then
|
||||||
|
fn=${fn/%.bat/}
|
||||||
|
fi
|
||||||
|
if [[ ${#fn} -gt 1 ]]; then
|
||||||
|
suggests+=$fn
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
|
cd "${pwd}"
|
||||||
|
|
||||||
|
# TODO: generate command parameters from completion database
|
||||||
|
|
||||||
|
print -l $suggests >> "$ptemp"
|
||||||
|
|
||||||
|
# atomic change file name
|
||||||
|
mv -f "$ptemp" "$pname"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
_zsh_autosuggest_strategy_predefined() {
|
||||||
|
emulate -L zsh
|
||||||
|
setopt EXTENDED_GLOB
|
||||||
|
local prefix="${1//(#m)[\\*?[\]<>()|^~#]/\\$MATCH}"
|
||||||
|
|
||||||
|
# search the history at first
|
||||||
|
local result="${history[(r)${prefix}*]}"
|
||||||
|
|
||||||
|
# check if necessary to generate predefine database
|
||||||
|
if (( ! ${+_ZSH_AUTOSUGGEST_GENERATED} )); then
|
||||||
|
_ZSH_AUTOSUGGEST_GENERATED=1
|
||||||
|
_zsh_autosuggest_predefined_generate
|
||||||
|
fi
|
||||||
|
|
||||||
|
# search the predefine files if nothing found in history
|
||||||
|
if [[ -z "$result" ]]; then
|
||||||
|
if (( ! ${+_ZSH_AUTOSUGGEST_PREDEFINE} )); then
|
||||||
|
typeset -g _ZSH_AUTOSUGGEST_PREDEFINE=()
|
||||||
|
local pbase="$_zsh_autosuggest_data_home"
|
||||||
|
local pname="$pbase/predefined"
|
||||||
|
local names="${ZSH_AUTOSUGGEST_PREDEFINE_PATH};$pname"
|
||||||
|
local array=()
|
||||||
|
for i ("${(s:;:)names}"); do
|
||||||
|
if [[ -n "$i" ]] && [[ -f "$i" ]]; then
|
||||||
|
local temp=(${(f)"$(<$i)"})
|
||||||
|
array+=($temp)
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
_ZSH_AUTOSUGGEST_PREDEFINE+=($array)
|
||||||
|
fi
|
||||||
|
result="${_ZSH_AUTOSUGGEST_PREDEFINE[(r)${prefix}*]}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
typeset -g suggestion="$result"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# _zsh_autosuggest_predefined_generate
|
||||||
|
|
||||||
|
# vim: set ts=4 sw=4 tw=0 et :
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------#
|
#--------------------------------------------------------------------#
|
||||||
# Async #
|
# Async #
|
||||||
|
Loading…
Reference in New Issue
Block a user