From 68bae9522a53fdffcc93be0453daf71b09175ef9 Mon Sep 17 00:00:00 2001 From: Marlon Richert Date: Tue, 23 Mar 2021 21:36:45 +0200 Subject: [PATCH] Add smoke testing & autoloading by absolute path Let's see if this can detect/prevent errors like in issue #215. --- module/.autocomplete.__init__ | 9 ++------- module/.autocomplete.async | 2 +- module/.autocomplete.compinit | 9 ++++++--- module/.autocomplete.key-binding | 4 +--- module/.autocomplete.widget | 8 ++------ utility/.autocomplete.patch | 2 -- zsh-autocomplete.plugin.zsh | 23 ++++++++++++++++++++--- 7 files changed, 32 insertions(+), 25 deletions(-) diff --git a/module/.autocomplete.__init__ b/module/.autocomplete.__init__ index fc5895aa..f0e1e06b 100644 --- a/module/.autocomplete.__init__ +++ b/module/.autocomplete.__init__ @@ -2,7 +2,7 @@ zmodload -Fa zsh/files b:zf_mkdir b:zf_rm zmodload -Fa zsh/parameter p:functions zmodload -F zsh/zutil b:zstyle -builtin autoload -Uz add-zsh-hook .autocomplete.mathfunc .autocomplete.screen-space +builtin autoload -Uz add-zsh-hook .autocomplete.mathfunc .autocomplete.__init__.precmd() { @@ -34,17 +34,12 @@ builtin autoload -Uz add-zsh-hook .autocomplete.mathfunc .autocomplete.screen-sp local -a older_than_1_day=( $datadir/*(N-.m+1) ) [[ -n $older_than_1_day ]] && zf_rm -f $older_than_1_day[@] - exec {_autocomplete__log_fd}>$(mktemp $datadir/XXXXXXXXXXXX) export XDG_CACHE_HOME="${XDG_CACHE_HOME:-$HOME/.cache}" [[ -d $XDG_CACHE_HOME/zsh ]] || zf_mkdir -pm 0700 $XDG_CACHE_HOME/zsh - export XDG_DATA_HOME="${XDG_DATA_HOME:-$HOME/.local/share}" - [[ -d $XDG_DATA_HOME/zsh ]] || - zf_mkdir -pm 0700 $XDG_DATA_HOME/zsh - add-zsh-hook precmd .autocomplete.screen-space local -i pslines=${#${(%%)PS1}//[^$'\n']} typeset -gHi _autocomplete__screen_space=$(( LINES - pslines - 2 )) @@ -61,9 +56,9 @@ builtin autoload -Uz add-zsh-hook .autocomplete.mathfunc .autocomplete.screen-sp local mod; for mod in compinit config widget key key-binding recent-dirs async; do if ! zstyle -t ':autocomplete:' $mod false no off 0; then mod=.autocomplete.$mod - builtin autoload -Uz $mod $mod unfunction $mod + builtin autoload -Uz $mod fi done diff --git a/module/.autocomplete.async b/module/.autocomplete.async index 6e4d3277..92cd37b6 100644 --- a/module/.autocomplete.async +++ b/module/.autocomplete.async @@ -4,7 +4,7 @@ zmodload -F zsh/parameter p:funcstack p:functions p:parameters zmodload -F zsh/system p:sysparams zmodload -F zsh/zselect b:zselect zmodload -F zsh/zutil b:zparseopts -builtin autoload -Uz add-zle-hook-widget .autocomplete.zle-flags +builtin autoload -Uz add-zle-hook-widget typeset -g ZSH_AUTOSUGGEST_USE_ASYNC=yes diff --git a/module/.autocomplete.compinit b/module/.autocomplete.compinit index 00522683..294ed2ef 100644 --- a/module/.autocomplete.compinit +++ b/module/.autocomplete.compinit @@ -26,7 +26,12 @@ compdef() { typeset -gH _comp_dumpfile=${_comp_dumpfile:-${ZSH_COMPDUMP:-$XDG_CACHE_HOME/zsh/compdump}} - local f; for f in ${${(%):-%x}:h:h}/completion/*; do + local -a comps=( $^fpath/_autocomplete.*~*.zwc(N-.) ) + if ! (( $#comps )); then + print -u2 -- 'zsh-autocomplete: Failed to find completion functions. Aborting.' + return 66 + fi + local f; for f in $comps[@]; do if [[ $f -nt $_comp_dumpfile ]]; then zf_rm -f $_comp_dumpfile break @@ -75,8 +80,6 @@ EOF compinit() { : } - builtin autoload -Uz .autocomplete.patch - .autocomplete.patch _main_complete _main_complete() { local -i ret=1 _autocomplete__reserved_lines=0 diff --git a/module/.autocomplete.key-binding b/module/.autocomplete.key-binding index 5999f3ab..818a2cd4 100644 --- a/module/.autocomplete.key-binding +++ b/module/.autocomplete.key-binding @@ -4,10 +4,8 @@ zmodload -Fa zsh/parameter p:funcstack p:functions .autocomplete.key-binding.precmd() { # Work around plugin managers making `key` local. - if [[ -z $key[Tab] || -z $key[Backtab] ]]; then - autoload -Uz .autocomplete.key + [[ -z $key[Tab] || -z $key[Backtab] ]] && .autocomplete.key - fi local tab_style; zstyle -s :autocomplete:tab: widget-style tab_style || tab_style='complete-word' diff --git a/module/.autocomplete.widget b/module/.autocomplete.widget index 8cba6aa9..51b35e3c 100644 --- a/module/.autocomplete.widget +++ b/module/.autocomplete.widget @@ -3,15 +3,11 @@ typeset -g ZSH_AUTOSUGGEST_MANUAL_REBIND=1 zmodload zsh/complist .autocomplete.widget.c() { - local func=.autocomplete.$3.completion-widget - builtin autoload -Uz $func - zle -C $1 $2 $func + zle -C $1 $2 .autocomplete.$3.completion-widget } .autocomplete.widget.z() { - local func=.autocomplete.$2.zle-widget - builtin autoload -Uz $func - zle -N $1 $func + zle -N $1 .autocomplete.$2.zle-widget } .autocomplete.widget.non-tab() { diff --git a/utility/.autocomplete.patch b/utility/.autocomplete.patch index 5d8e4780..0b5cacb5 100644 --- a/utility/.autocomplete.patch +++ b/utility/.autocomplete.patch @@ -2,8 +2,6 @@ zmodload -F zsh/parameter p:functions .autocomplete.patch() { - emulate -L zsh; setopt $_autocomplete__options - builtin autoload +X -Uz $1 functions[.autocomplete.$1]=$functions[$1] } diff --git a/zsh-autocomplete.plugin.zsh b/zsh-autocomplete.plugin.zsh index 0feb4358..54f0265c 100644 --- a/zsh-autocomplete.plugin.zsh +++ b/zsh-autocomplete.plugin.zsh @@ -14,10 +14,27 @@ setopt NO_singlelinezle ) setopt $_autocomplete__options - hash -d zsh-autocomplete=${${(%):-%x}:h} - typeset -gU FPATH fpath=( ~zsh-autocomplete/*(-/) $fpath ) + local basedir=${${(%):-%x}:h} + if ! [[ -n $basedir && -d $basedir ]]; then + print -u2 -- 'zsh-autocomplete: Failed to find base dir. Aborting.' + return 66 + fi + hash -d zsh-autocomplete=$basedir + + local -a subdirs=( ~zsh-autocomplete/*(N-/) ) + if ! (( $#subdirs )); then + print -u2 -- 'zsh-autocomplete: Failed to find sub dirs. Aborting.' + return 66 + fi + typeset -gU FPATH fpath=( $subdirs[@] $fpath[@] ) + + local -a funcs=( $^subdirs/.autocomplete.*~*.zwc(N-.) ) + if ! (( $#funcs )); then + print -u2 -- 'zsh-autocomplete: Failed to find functions. Aborting.' + return 66 + fi + builtin autoload -Uz $funcs[@] - builtin autoload -Uz .autocomplete.__init__ .autocomplete.__init__ # Workaround for https://github.com/zdharma/zinit/issues/366