Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Would like an alias to read the part of the current command line that precedes the alias



On Oct 10,  7:15pm, dg1727@xxxxxxxxxxxx wrote:
}
} I am using zsh 4.3.12 on Xubuntu and am trying to find a substitute 
} for the following which is in the default .bashrc:  
} 
} #alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo 
} terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-
} 9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
} 
} This pops up a notification that says, for example, "sleep 10" to 
} let the user know which long-running command has just finished.  
} The part of the alias that seems hard to duplicate in zsh is:  
} 
} history|tail -n1

That's pretty easy, actually.

	history $HISTCMD

will do it.  Zsh by default does not consider the current command to
be interesting, because it's almost always "history" (or "fc") plus
maybe some arguments.  So "history -1" refers to the command that is
immediately *before* the command "history -1" itself.

If you use

	zmodload zsh/parameter

(which you probably already are, if you're using completion) then you
don't need the history command, you can just refer to $history like
this:

	$history[$HISTCMD]

And then to prune everything from the last separator:

	${history[$HISTCMD]%[;&|]*}

You don't have to sed off the history number that way, either.  And
you can convert $? into a string without forking [ $? = 0  ] too:

	${${?/0/terminal}//<->*/error}

That says, first replace 0 with the string "terminal" and then if any
numbers are left, replace with "error".

So:

alias alert='notify-send --urgency=low -i \
	${${?/0/terminal}//<->*/error} ${history[$HISTCMD]%[;&|]*}'

Or in Gnome, perhaps:

alias alert='zenity --${${?/0/info}//<->*/warning} \
	--text=${history[$HISTCMD]%[;&|]*}'

However, I suspect most zsh users would do this with a precmd function,
and never type out the "; alert" at all.  For example:

    preexec() {
      SECONDS=0  # Reset the counter
    }
    precmd() {
      (( SECONDS > 120 )) &&  # Took more than 2 minutes, send alert
        notify-send --urgency=low -i \
          ${${?/0/terminal}//<->*/error} $history[$[HISTCMD-1]]
    }

Note there that you reference $[HISTCMD-1] because by the time you get
to the precmd function the history count has been incremented and you
now are interested in the previous event.  Add double quotes if you
use the shwordsplit option.

} The zshexpn manpage says that history expansion (!#:0- in this 
} case) is done before alias expansion (or any other expansion).  
} That seems to make it difficult for any keyword that consists only 
} of letters (no punctuation marks), such as 'alert', to refer to 
} what precedes it on the command line.  

Those don't really have anything to do with one another.  The purpose
of history expansion is for the command editor (i.e., you as typist)
to refer to other history events; that's distinct from the execution
of some command, long after you're done typing it, referring back to
something in the history.



Messages sorted by: Reverse Date, Date, Thread, Author