zsh-users
 help / color / mirror / code / Atom feed
From: Bart Schaefer <schaefer@brasslantern.com>
To: zsh-users@zsh.org
Subject: Re: append to history entry?
Date: Tue, 27 Dec 2016 22:04:58 -0800	[thread overview]
Message-ID: <161227220458.ZM3240@torch.brasslantern.com> (raw)
In-Reply-To: <f87d7f79-3529-d832-eed5-83d4130ea128@eastlink.ca>

On Dec 27,  4:57pm, Ray Andrews wrote:
} Subject: Re: append to history entry?
}
} It's all  this backslash and 'is it one string or several strings' 
} stuff.

The "one or several" distinction of course has to do with the way
arguments are processed.  You definitely want to be able to preserve
inside the function whatever argument division was supplied to it
at the call, so you need a way to indicate that; you just have to
be sure you're only making that indication when you mean it.

} ... it seems that the backslashes need protecting and reprotecting and 
} yet more protecting and each stage of the protection is different from
} the last.  

The backslash stuff is borrowed conceptually from C (\t for tab, etc.).
Having that same paradigm applied at multiple levels of processing stems
from the language being interpreted rather than compiled.

} For me, the task is to see the 'naturalness' for lack of a better word 
} of the way that zsh does this:
} 
}      print -rS -- "rap ${${(q+)@}}; : ${(q-)HOST}"

The point is that this isn't "natural," because what you asked for isn't
natural.  Think through what you said you want:

1. Take a command line and parse it.
2. When the parsed arguments are received by the command ...
   a. reconstitute the original command line
   b. append another command that includes the host name
3. Put all of that into the history, formatted such that
   a. it shows what you want when you recall the history, and
   b. it executes again without errors

Which step of that after the first one is "natural" for the shell?

Of course you can fudge any one of those steps.  The host name most
probably doesn't have any special characters, so ${(q-)HOST} is
likely going overboard and all you really need is $HOST; but for the
sake of everyone else who's going to see this and copy-paste, it
may be worth forestopping any future problems.

Similarly you may never have any quoted spaces or backslashes or
anything like that in the arguments of "rap" and therefore ${(q+)@}
might also be unnecessary, but someone might try to use this same
recipe for some other command that does have those things.  I tend
to want those people to make their own mistakes and come back with
more questions; Daniel tries to cover all corner cases up front.

} Couldn't we just:
} 
}      setopt protect-backslashes-thanks
}      print -S "rap $@; : $HOST"

That still wouldn't work because $@ is the way you preserve argument
divisions.  You can't get away from thinking about what you mean.

} Bart and Daniel didn't get it exactly right the first time.  What hope 
} do I have?

Stop worrying about getting it exactly right.  What you had in the
first place was going to work in 90%+ of cases, and when you found
a case that didn't, then someone could have explained why not.


  reply	other threads:[~2016-12-28  6:04 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-12-26 23:16 Ray Andrews
2016-12-27  1:28 ` Ray Andrews
2016-12-27  4:47   ` Bart Schaefer
     [not found] ` <5288b537-f06a-d18a-60ea-1f962856c80c__41345.3811700039$1482803962$gmane$org@eastlink.ca>
2016-12-27 12:55   ` Daniel Shahaf
2016-12-27 16:00     ` Bart Schaefer
2016-12-27 18:23       ` Ray Andrews
2016-12-27 19:09         ` Bart Schaefer
2016-12-27 23:16           ` Ray Andrews
2016-12-27 23:55             ` Bart Schaefer
2016-12-28  0:57               ` Ray Andrews
2016-12-28  6:04                 ` Bart Schaefer [this message]
2016-12-28 17:39                   ` Ray Andrews
2016-12-28 18:22                     ` Bart Schaefer
2016-12-28 19:20                       ` Ray Andrews
2016-12-28 21:24                         ` Ray Andrews
     [not found]                         ` <3b8fe027-d7fb-25fb-bc05-9ecd3a91b08f__38422.8622112007$1482960347$gmane$org@eastlink.ca>
2016-12-28 23:34                           ` Daniel Shahaf
2016-12-29  0:51                             ` Bart Schaefer
2016-12-29  3:27                             ` Ray Andrews
     [not found]               ` <f87d7f79-3529-d832-eed5-83d4130ea128__16005.139592062$1482888562$gmane$org@eastlink.ca>
2016-12-28  5:28                 ` Daniel Shahaf
2016-12-28  6:31                   ` Bart Schaefer
2016-12-28 16:33                   ` Ray Andrews

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=161227220458.ZM3240@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).