zsh-users
 help / color / mirror / code / Atom feed
From: Bart Schaefer <schaefer@brasslantern.com>
To: zsh-users@sunsite.dk
Subject: Re: alias vl="vi !$"
Date: Thu, 11 Mar 2004 17:17:35 +0000	[thread overview]
Message-ID: <1040311171735.ZM20352@candle.brasslantern.com> (raw)
In-Reply-To: <4im0509toihq2ef1vlnnid6t93j90f6gor@4ax.com>
In-Reply-To: =?iso-8859-1?Q?=3C20040311125558=2EGA24218=40picard=2Efranken?= =?iso-8859-1?Q?=2Ede=3E?= =?iso-8859-1?Q?Comments=3A_In_reply_to__Thomas_K=F6hler_=3Cjean-luc=40pic?= =?iso-8859-1?Q?ard=2Efranken=2Ede=3E?= =?iso-8859-1?Q?________=22Re=3A_alias_vl=3D=22vi_!$=22=22_=28Mar_11=2C__1?= =?iso-8859-1?Q?=3A55pm=29?=
In-Reply-To: <svp0509rfu4iecet83auc9pel2i9n4mi9c@4ax.com>

On Mar 11, 12:26pm, zzapper wrote:
> Subject: Re: alias vl="vi !$"
>
> On Thu, 11 Mar 2004 17:10:03 +0800, James Devenish 
> >on Thu, Mar 11, 2004 at 08:59:16AM +0000, zzapper wrote:
> >> alias vl="vi !$" where !$ is the command line "last parameter"
> >
> >Make your own 'function' named `vl`?
> >
> Do I have access to the positional parameters of the previous command
> line /history from inside a function?

This brings up an interesting point.

On the command line, $_ is the last word of the previous command, very
much like !$ is.  (In the external process environment, $_ is the path
name of the currently executing command.)

Inside a function, however, $_ has already been changed to be the last
word of the _currently executing_ command, the same as as $argv[-1].
Which is not really all that useful, though maybe more useful than if
it had been changed to the path name of zsh or some such.

I'm usually a stickler for backwards compatibility, but does anyone
think anything would break if the changing of $_ were delayed until
after shell functions have been called, so that it would remain the
last word of the _previous_ command?

On Mar 11,  1:55pm, Thomas Köhler wrote:
>
> accept-line-or-empty-cmd() {
>     if [ "$LBUFFER$RBUFFER"  = vl ] ; then
>         LBUFFER="vi !$"
>         RBUFFER=""
>     fi
>     builtin zle .accept-line
> }

Cute, but unecessarily complicated:

	if [[ $BUFFER = vl ]]; then BUFFER='vi !$'; fi

It also doesn't really work like an alias.  Consider (in csh) that
	vl foo
would become
	vi !$ foo
whereas your example above would grumble about vl not found.

On Mar 11,  1:23pm, zzapper wrote:
> 
> Tejmo emailed me this solution which works!!
> 
> vl () {
>         gvim.exe $(history -1 | sed "s/.* //g")
> }

That's the right idea, but it's a lot of processes for something you could
do entirely in zsh.

    vl () {
	zmodload -i zsh/parameter	# Just in case
	vi "${${(z)history[${${(@kno)history}[-1]}]}[-1]}" "$@"
    }

I'm tempted to just leave that unexplained, but I wont't.

${(@kno)history}	history numbers in ascending order (note 1)
${${...}[-1]}		last element (largest histno) (note 2)
${(z)history[...]}	corresponding history entry, split to words
${${...}[-1]}		last element (last word of last history entry)

Note 1: The @ is only necessary because the whole thing is inside the
square brackets of ${history[...]}, which forces string context.  Thus
the @ converts back to array context.

Note 2: I'd have used ${${(@knO)history}[1]} except that's affected by
the KSH_ARRAYS option.  Negative subscripting isn't.


  reply	other threads:[~2004-03-11 17:18 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-03-11  8:59 zzapper
2004-03-11  9:10 ` James Devenish
2004-03-11 12:26   ` zzapper
2004-03-11 12:33     ` Peter Stephenson
2004-03-11 12:40       ` zzapper
2004-03-11 12:55         ` Thomas Köhler
2004-03-11 13:23 ` zzapper
2004-03-11 17:17   ` Bart Schaefer [this message]
2004-03-11 17:58     ` $_ and compatibility Danek Duvall
2004-03-11 19:05     ` alias vl="vi !$" Wayne Davison
2004-03-11 20:13       ` zzapper
2004-03-11 23:45         ` Thorsten Kampe
2004-03-14 16:27     ` Peter Stephenson

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=1040311171735.ZM20352@candle.brasslantern.com \
    --to=schaefer@brasslantern.com \
    --cc=zsh-users@sunsite.dk \
    /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).