2012/12/9 Cheer Xiao <xiaqq...@gmail.com>:
> Hi all,
>
> For those not acquainted with zsh: extended globbing is one of the
> many features of zsh that allows you to match files satisfying a given
> criteria in a inline manner (instead of going through a loop). For
> example, "echo abc*(/)" gives you all directories with names starting
> with "abc" in current directory, while "rm .*(@)" removes all symlinks
> with names starting with ".", etc. It is a useful feature, but I don't
> really like the arcane syntax.
>
> Fish doesn't have extended globbing (which is good actually :-), so
> I'm tempted to write this:
>
> function filter
>     set predicate $argv[1]
>     for i in (seq 2 (count $argv))
>         test $predicate $argv[$i]; and echo $argv[$i]
>     end
> end
>
> So now I write "echo (filter -d abc*)" and "rm (filter -L .*)" to
> achieve the same effect as "echo abc*(/)" and "rm .*(@)" in zsh. It is
> more verbose, but the readability is considerably better; it also
> allows you to reuse the knowledge of the "test" builtin.
>
> This works fine until, of course, you start to encounter file names
> containing newlines. Try this:
>
> cd (mktemp -d)
> mkdir 'a
> b'
> count *
> count (filter -d *)
>
> Clearly, The problem stems from the fact that when fish expands the
> command substitution (filter -d *), filenames echo'ed by "filter" run
> together before being split on newlines to render the substituted
> words. A newline in one of the filenames is then indistinguishable
> with two filenames.
>
> So this leads to my proposal:
>
> * When evaluating a fish function, maintain an alternative output
> buffer besides stdout. The buffer is actually a dynamic-sized list
> (std::vector for C++ programmers) of strings. Introduce a new builtin
> (say "put") to write to that buffer.
>
> * Exactly one of the two output buffers (let's call them stdout and
> altout) should be active within a function.
>
> * Within functions, calling "put" activates the altout and closes
> stdout. Each invocation of "put" with k arguments appends k new
> elements to altout. (The relationship between altout and stdout still
> needs some thoughts though.)
>
> * When command substitution is performed, it is checked which of
> stdout and altout is active (the latter is only possible for fish
> functions; external commands always have only stdout active). If
> altout is active, the elements in altout are substituted directly. If
> stdout is active, the content in stdout is split on newlines before
> being substituted (as is currently done).
>
> * When altout is written to when there is no enclosing command
> substitution (eg. calling "put" on the prompt), anything written to it
> is directed to stdout plus a newline.
>
> With altout I can write my "filter" by replacing "echo" with "put" and
> it's now newline-safe.
>
> Being able to output arrays of strings can be of many other uses -
> actually it enables you to write any array manipulating functions in
> an easy way.
>
> If the newline-in-filenames stuff sounds too invented and unlikely,
> consider why shells need real arrays instead of strings joined by
> delimiters (be it whitespace or newlines) at all. Actually, one of the
> favorite things about fish is its clean array syntax, it is a really
> nice thing. I think fish deserves the added expressive power. :)

Oops. Digging into the source, it turns out fish has no true array;
instead array are strings joined with "\x1e". This should be resolved
first. I've opened an issue for that:
https://github.com/fish-shell/fish-shell/issues/436


--
Regards,
Cheer Xiao

------------------------------------------------------------------------------
LogMeIn Rescue: Anywhere, Anytime Remote support for IT. Free Trial
Remotely access PCs and mobile devices and provide instant support
Improve your efficiency, and focus on delivering more value-add services
Discover what IT Professionals Know. Rescue delivers
http://p.sf.net/sfu/logmein_12329d2d
_______________________________________________
Fish-users mailing list
Fish-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/fish-users

Reply via email to