about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPaul Ackersviller <packersv@users.sourceforge.net>2007-04-29 02:06:43 +0000
committerPaul Ackersviller <packersv@users.sourceforge.net>2007-04-29 02:06:43 +0000
commitcedc5f8e1f8916202da403a08b77600a7271fbe3 (patch)
tree6e2f580e4f0d4d28c50120996e2f970cf57deb30
parentacc438a775cfe547f55e2fb2e705567d661b323b (diff)
downloadzsh-cedc5f8e1f8916202da403a08b77600a7271fbe3.tar.gz
zsh-cedc5f8e1f8916202da403a08b77600a7271fbe3.tar.xz
zsh-cedc5f8e1f8916202da403a08b77600a7271fbe3.zip
Merge of users/8863: which-command stuff.
-rw-r--r--Doc/Zsh/contrib.yo12
-rw-r--r--Functions/Zle/which-command42
2 files changed, 54 insertions, 0 deletions
diff --git a/Doc/Zsh/contrib.yo b/Doc/Zsh/contrib.yo
index 1fc3458f3..f1fa0e9e9 100644
--- a/Doc/Zsh/contrib.yo
+++ b/Doc/Zsh/contrib.yo
@@ -867,6 +867,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