I've hacked in a new hook function similar to preexec called "atexec". The differences are: 1) atexec run before each command in the list/sublist. 2) The first argument is the command being run. The remaining arguments are the ones fed to the command. 3) The arguments have all substitutions made. atexec is only run: 1) In interactive mode 2) When a command is executed by the user 3) When the command is not in the background 4) When not executing command substitution For example, let's say I'm running xterm, and have this atexec: atexec () { print -n -- "\e]0;${(q-)@}\a" } When I run "make && make install" (compiling zsh, for instance), the xterm title will be "make" when executing "make". If that command is successful and moves on to "make install", the xterm's title will change to "make install". Because atexec shows exactly what is being executed, something like "print $HOME $(( 3 + 4 ))" will give atexec arguments of "print /home/foobar 7". Globs are also resolved, which might be annoying. Moving into a folder AUTO_CD-style will give atexec an actual "cd" command. atexec is not run for backgrounded commands in case it interferes with the output of foreground commands. atexec is not run for command substitution, because anything it prints will be output on the line editor. I'm hoping the man documentation is clear enough. Michael Hwang