2012/12/10 Maxim Gonchar <gma...@gmail.com>:
> Hi Cheer,
>
> since you already use the additional function, it worth looking at the
> 'find' command, which can do all the complicated job which can not be done
> with simple globbing.
>
> regards,
> Maxim
>
>
> On Sun, 09 Dec 2012 17:43:59 +0400, Cheer Xiao <xiaqq...@gmail.com> wrote:
>
>> 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. :)
>>
>>
>> --
>> 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



-- 
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