Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: How to avoid expansion when completing?



> Suppose I have a load of subdirectories, each of which contains a file
> called foobar.dat.  I enter 
> 
> % wc **/foob<Tab>
> 
> hoping to expand this to **/foobar.dat (assuming there's nothing else
> starting with 'foob' in any of the subdirectories).  However, I get the
> '**' expanded to the first subdirectory name which has a file starting
> with 'foob' in it.  (If I keep pressing <Tab> then I cycle round).
> 
> I've got the following options set, and I'm running version 3.1.5.

If you don't mind upgrading, you can do such things with the new bindable
completion widgets in 3.1.9 (maybe 3.1.6, but that's irrelevant if you're
still on 3.1.5).  Assuming the file is unique, you can use
e.g. _most_recent_file (usually bound to ^xm), which would normally put a
`*' on the end and find the most recently modified matching file --- that
ought to be enough for this purpose.

The following function is a trivial modification of that to add all
matching files as possible completions (_glob_expand_and_complete).
Sven probably has a better way of doing it.


#compdef -k complete-word \C-xG

local file tilde etilde
if [[ $PREFIX = \~*/* ]]; then
  tilde=${PREFIX%%/*}
  etilde=${~tilde}
  file=($~PREFIX*$~SUFFIX)
  file=(${file/#$etilde/$tilde})
else
  file=($~PREFIX*$~SUFFIX)
fi
(( $#file )) && compadd -U -i "$IPREFIX" -I "$ISUFFIX" -f -Q $file


-- 
Peter Stephenson <pws@xxxxxxx>
Cambridge Silicon Radio, Unit 300, Science Park, Milton Road,
Cambridge, CB4 0XL, UK                          Tel: +44 (0)1223 392070



Messages sorted by: Reverse Date, Date, Thread, Author