diff --git a/ChangeLog b/ChangeLog index a5001962a..8e2683973 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,6 +4,11 @@ Doc/Zsh/compsys.yo: Separate compinit security checks into their own callable function. + * 12162: Completion/Core/_expand, Completion/Core/_path_files, + Src/utils.c: Use `eval' instead of `$(print ...)' to suppress + some syntax error failures; this requires that zwarn() does not + trashzle() when the output is not going to the terminal. + 2000-07-26 Sven Wischnowsky * 12378: Completion/Base/_arguments: make `_arguments --' use diff --git a/Completion/Core/_expand b/Completion/Core/_expand index 4515a20a2..09d89a30b 100644 --- a/Completion/Core/_expand +++ b/Completion/Core/_expand @@ -61,9 +61,9 @@ if [[ "$force" = *s* ]] || zstyle -T ":completion:${curcontext}:" substitute; then [[ ! -o ignorebraces && "${#${exp}//[^\{]}" = "${#${exp}//[^\}]}" ]] && eval exp\=\( ${${(q)exp}:gs/\\{/\{/:gs/\\}/\}/} \) - exp=( $(print -r ${${(e)exp//\\[ + eval 'exp=( ${${(e)exp//\\[ ]/ }//(#b)([ -])/\\$match[1]}) ) 2>/dev/null +])/\\$match[1]} )' 2>/dev/null else exp=( ${exp:s/\\\$/\$} ) fi @@ -95,7 +95,7 @@ subd=("$exp[@]") zstyle -s ":completion:${curcontext}:" keep-prefix tmp || tmp=changed if [[ "$word" = [\~\$]*/* && "$tmp" = (yes|true|on|1|changed) ]]; then - epre=( $(print -r ${(e)~${word%%/*}}) ) 2>/dev/null + eval 'epre=( ${(e)~${word%%/*}} )' 2>/dev/null if [[ -n "$epre" && $#epre -eq 1 ]]; then opre="${word%%/*}" pre="$epre[1]" diff --git a/Completion/Core/_path_files b/Completion/Core/_path_files index bf6049f8f..1e8059e4b 100644 --- a/Completion/Core/_path_files +++ b/Completion/Core/_path_files @@ -249,9 +249,10 @@ elif [[ "$pre" = *\$*/* && "$compstate[quote]" != \" ]]; then # after the first slash after the parameter expansion. # This fails for things like `f/$foo/b/' where the first `f' is # meant as a partial path. + linepath="${(M)pre##*\$[^/]##/}" - realpath=$(print -r ${(e)~linepath}) 2>/dev/null - [[ -z "$realpath" || "$realpath" = "$linepath" ]] && return 1 + eval 'realpath=${(e)~linepath}' 2>/dev/null + [[ -z "$realpath" || "$realpath" = "$linepath" ]] && return 1 pre="${pre#${linepath}}" i="${#linepath//[^\\/]}" orig="${orig[1,(in:i:)/][1,-2]}" @@ -323,7 +324,7 @@ for prepath in "$prepaths[@]"; do else compfiles -p$cfopt tmp1 accex "$skipped" "$_matcher" '' fake "$pats[@]" fi - eval 'tmp1=( $~tmp1 )' 2>/dev/null + tmp1=( $~tmp1 ) if [[ -n "$PREFIX$SUFFIX" ]]; then # See which of them match what's on the line. diff --git a/Src/utils.c b/Src/utils.c index 955158831..33fed62dd 100644 --- a/Src/utils.c +++ b/Src/utils.c @@ -67,7 +67,8 @@ zwarn(const char *fmt, const char *str, int num) { if (errflag || noerrs) return; - trashzle(); + if (isatty(2)) + trashzle(); /* * scriptname is set when sourcing scripts, so that we get the * correct name instead of the generic name of whatever