zsh-users
 help / color / mirror / code / Atom feed
From: Bart Schaefer <schaefer@brasslantern.com>
To: zsh-users@zsh.org
Subject: Re: Would like an alias to read the part of the current command line that precedes the alias
Date: Mon, 10 Oct 2011 19:05:17 -0700	[thread overview]
Message-ID: <111010190517.ZM5763@torch.brasslantern.com> (raw)
In-Reply-To: <20111010231518.BFD1A10E2AA@smtp.hushmail.com>

On Oct 10,  7:15pm, dg1727@hushmail.com 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.


  reply	other threads:[~2011-10-11  2:05 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-10-10 23:15 dg1727
2011-10-11  2:05 ` Bart Schaefer [this message]
2011-10-13  3:15   ` Aaron Davies
2011-10-13 19:32     ` Bart Schaefer
2011-11-07  5:12       ` Aaron Davies
2011-10-10 23:21 dg1727

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=111010190517.ZM5763@torch.brasslantern.com \
    --to=schaefer@brasslantern.com \
    --cc=zsh-users@zsh.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).