From 8a24c5a5ee55ddec6896540de2e042abe009ed1e Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Mon, 23 May 2005 10:11:18 +0000 Subject: users/8856, users/8863: which-command stuff --- ChangeLog | 8 ++++++++ Doc/Zsh/contrib.yo | 12 ++++++++++++ Functions/Zle/which-command | 42 ++++++++++++++++++++++++++++++++++++++++++ Src/Zle/zle_tricky.c | 5 ++++- 4 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 Functions/Zle/which-command diff --git a/ChangeLog b/ChangeLog index eb4a019eb..e49570469 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2005-05-23 Peter Stephenson + + * users/8863: Doc/Zsh/contrib.yo, Functions/Zle/which-command: + enhanced which-command that traces the final command better. + + * users/8856: Src/Zle/zle_tricky.c: which-command shouldn't expand + aliases before passing first argument. + 2005-05-22 Bart Schaefer * unposted: Completion/Base/Widget/_complete_debug: add a colon diff --git a/Doc/Zsh/contrib.yo b/Doc/Zsh/contrib.yo index dfa8efa3b..2303dccfc 100644 --- a/Doc/Zsh/contrib.yo +++ b/Doc/Zsh/contrib.yo @@ -858,6 +858,18 @@ example(zle -N insert-last-assignment smart-insert-last-word zstyle :insert-last-assignment match '[[:alpha:]][][[:alnum:]]#=*' bindkey '\e=' insert-last-assignment) ) +tindex(which-command) +item(tt(which-command))( +This function is a drop-in replacement for the builtin widget +tt(which-command). It has enhanced behaviour, in that it correctly +detects whether or not the command word needs to be expanded as an +alias; if so, it continues tracing the command word from the expanded +alias until it reaches the command that will be executed. + +The style tt(whence) is available in the context tt(:zle:$WIDGET); this +may be set to an array to give the command and options that will be used to +investigate the command word found. The default is tt(whence -c). +) enditem() subsect(Styles) diff --git a/Functions/Zle/which-command b/Functions/Zle/which-command new file mode 100644 index 000000000..6e15c32a4 --- /dev/null +++ b/Functions/Zle/which-command @@ -0,0 +1,42 @@ +zmodload -i zsh/parameter zsh/zutil + +zle -I + +local -a whencecmd wds + +# Set the whence style to your favourite function +# (but NOT which-command!) +zstyle -a :zle:$WIDGET whence whencecmd || whencecmd=(whence -c --) + +wds=(${(z)LBUFFER}) +local wd barewd +local -A seen + +while true; do + wd=${wds[1]} + barewd=${(Q)wd} + + if [[ $barewd != $wd || -n $seen[$barewd] ]]; then + # quoted or already expanded, see if original word is an alias... + if [[ -z $seen[$barewd] && -n $aliases[$wd] ]]; then + # yes, so we need to decode that, with no extra expansion... + $whencecmd $wd + seen[$wd]=1 + wds=(${(z)aliases[$wd]}) + continue + else + # use unquoted word, don't expand alias + (unalias -- $barewd 2>/dev/null; $whencecmd $barewd) + fi + else + # turn on globsubst for =ls etc. + $whencecmd ${~barewd} + if [[ -n $aliases[$barewd] && -z $seen[$barewd] ]]; then + # Recursively expand aliases + seen[$barewd]=1 + wds=(${(z)aliases[$barewd]}) + continue + fi + fi + break +done diff --git a/Src/Zle/zle_tricky.c b/Src/Zle/zle_tricky.c index 7d4fbd641..778305d18 100644 --- a/Src/Zle/zle_tricky.c +++ b/Src/Zle/zle_tricky.c @@ -2390,9 +2390,12 @@ int processcmd(UNUSED(char **args)) { char *s; - int m = zmult; + int m = zmult, na = noaliases; + if (!strcmp(bindk->nam, "which-command")) + noaliases = 1; s = getcurcmd(); + noaliases = na; if (!s) return 1; zmult = 1; -- cgit 1.4.1