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

Re: compsys issues

DervishD wrote:
>     # expand-or-complete is currently bound to <TAB>
>     zle -C expand-or-complete expand-or-complete _completer
>     function _completer () {
>         compstate[insert]=${compstate[insert]//tab /}
>         compadd -f - $PREFIX*(/)

I realise that it is there to get any preceding directory portion but
you're overriding the internal matching by starting the pattern match
with $PREFIX. I'd use something like ${(M)PREFIX##*/} instead.

>     Let's say I pick 'Projects' and hit tab again. Now I'm presented
> with this:
>     $ cd Projects/<TAB>
>     Projects/mta/ Projects/zsh-things/ Projects/more/
>     But what I want is to be presented with:
>     $ cd Projects/<TAB>
>     mta/ zsh-things/ more/

For that, you need to use compset -P '*/' to move the initial directory
portions to $IPREFIX so they are not part of matching.

>     I've tried tweaking IPREFIX and PREFIX (with and without the help
> from compset), I've tried generating the list of matches before

You need to tweak the compadd command too. After compset, any initial
directory portion will be in $IPREFIX instead of $PREFIX. That will
include a trailing slash so you can do $IPREFIX*(/) to get the files.

That will now try to add stuff like `Projects/more' as a match when
`Projects/' is in IPREFIX. You don't want to include the stuff in
$IPREFIX in the possible matches so you can use the :t modifier to get
just the filenames as matches: $IPREFIX*(/:t)

Next, you need to use compadd's -W option so that the -f option can find
the right directory. Try something like the following to begin with:

compadd -W $PWD/$IPREFIX -f - $IPREFIX*(/:t)

That won't work with paths starting with variable expansions or
non-relative directories. You'll need more logic to work out the
argument to -W. Using $~IPREFIX will help resolve any expansions on the
command line.

Hope that helps


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