On 03-May-2010 Robert Webb <[email protected]> wrote:
> Lech Lorens wrote:
> > Another issue is whether taglist() should remove duplicates. It
> > might be good to handle this but for now I'd rather stick to
> > 'tagfunc' to get it done well.
> 
> OK.  Maybe down the road it could be an extra flag for taglist().
> We seem to have a few potential flags required now for taglist().
> 'u' for unique tags?  This would not get rid of tags of the same name,
> only those that have the same name, cmd & file.  It would save my
> script having to do it, which it does pretty inefficiently.
> 
> > > - Another thing I need is a way to do more than one search in the
> > > tag command.
> > [...]
> > > - Gets a little trickier than above too, because I want to have
> > > access to all of vim's search capabilities in that tag command.
> > > The format of a search
> > [...]
> > > - Vim doesn't load all tags when it does a tag search.  It looks
> > > at one file
> > [...]
> > 
> > It would be great to have all of them, but I consider them
> > improvements to the basic functionality offered by 'tagfunc'. Once
> > 'tagfunc' is implemented properly these can be considered.
> 
> OK.  I was hoping the first of those wouldn't be too hard at least.
> Currently my test script will fail without it.  I find often there's
> tags of the same name with the same search commend within a header
> file, ie the same line appears twice, within different classes.
> 
> Currently my script also makes a second guess if the search fails,
> which complicates things further.  One solution might be to add
> another option, say 'tagcmdfunc', which calls back a user-function to
> do the search.  It would mean though that I could do multiple searches
> as required to find the right line, and if they fail, I can make as
> many subsequent guesses as I want (for when the tags file is a little
> out of date).  It also means that vim's built-in handling of tag
> commands doesn't have to be modified.  Probably leave it to vim to
> open the tag file, then just pass the tag command to the
> user-function.  What do you think?

I looked into the things I thought to be problems in the 'tagfunc'
implementation and found out that I misinterpreted the results I was
getting. In other words: 'tagfunc' has been stable for me and I'll try
to find some time during the weekend to look into the other things you'd
like to be done. To be 100% sure: you think that it would be best to get
multiple searches done first (or do you mean removing duplicate tags)?

> > Some news about 'tagfunc': I discovered that the 'tagfunc'
> > implementation prevented omni completion for C from working when
> > 'tagfunc' was set to the SmartTagFunc() function defined a few lines
> > above. This was due to the fact that - as mentioned by the
> > documentation - in each of the dictionaries returned by
> > SmartTagFunc() only the entries 'name', 'filename' and 'cmd' are
> > considered relevant. Without thinking too much I simply discarded
> > all the other entries effectively filtering out the data essential
> > to omni completion. The latest patch fixes the problem. Find it
> > attached.
> 
> If it only looks at those entries, why does it matter if other entries
> are present?  Are you sure it wasn't your other minor change to my
> SmartTagFunc() function that fixed it?  That would make more sense,
> that it expects taglist() to find matches for partial tag patterns.
> I'm thinking there might be some use in keeping those fields, eg the
> 'tagcmdfunc' idea above might have use for them.

Yes, I am sure. I didn't it clear that it's the :tag command that only
looks at those three entries. The completion script uses taglist() to
get tags and expects to get more than just these three.

> > And by the way... 'tagfunc' is now available via vim_extended on
> > repo.or.cz:
> > http://repo.or.cz/w/vim_extended.git/shortlog/refs/heads/feat/tagfunc
> 
> Thanks, and I've compiled it now, at work since it wasn't working at
> home.
> 
> By the way, I notice that docs/tags hasn't been updated in that
> version (doesn't have a tags for 'tagfunc' etc).

Thanks for noticing. Will fix that. Meanwhile:
:helptags $VIMRUNTIME/doc

> - I attach a new version:
>     - Includes the SmartTagFunc() function.  Users need to put
>       "set tagfunc=SmartTagFunc" in their .vimrc or _vimrc.
>     - Fixes (hopefully) the errors you got initially
>     - Fixes errors which occur in my test script when 'tagfunc' is set
>       (by unsetting it temporarily).  Those errors occurred because my
>       script calls my functions directly rather than via 'tagfunc', so
>       any calls to taglist() would recursively call back my script a
>       second time.  Maybe taglist() needs a flag telling it not to use
>       'tagfunc'?
>     - My new SmartTagFunc() allows the user to do ":tag Class::Member"
>       to explicitly find a tag from a specific class.
> 
> Some other observations re 'tagfunc':
> 
> - Can't tag on operator at end of line, eg "b++;".  Needs to allow
>   this when 'tagfunc' set.

You can tag an operator. You will want to set 'isk' appropriately.
Probably:
:set isk+=-+

>   However if the tagfunc returns an empty list, how do we know if an
>   id wasn't found, or if no tags for it were found (so vim knows which
>   error to give)?  Maybe return an empty list for tag-not-found or
>   0 for id-not-found?

There is "E426: tag not found". Id not found?
If you mean "E349: No identifier under cursor", Vim takes care of this,
no need to do this in the 'tagfunc' function.

> - ^W^] then ^Wq leaves the original window scrolled sometimes.  Not
>   sure when exactly.  But try this: extract the attached ZIP file and
>   open TestTags.cpp.  Go to line 332 and use ^E/^Y to put it in the
>   bottom half of the screen, towards the bottom.  Tag to one of the
>   first 4 taggable items (ie b, mNext, mPrev or mA) using ^W], then
>   close that window again with ^Wq.  The original cursor line is now
>   at the top of the window.  Strangely it doesn't happen for the
>   remaining tags on the line.  I think I also saw it only happen when
>   the tag was in the top half of the window.  Probably the same bug as
>   here: http://tech.groups.yahoo.com/group/vimdev/message/51805
> 
>   Actually I just tried  minimal tagfunc, and it doesn't seem to do
>   it, so it could be a fault with my script, although the link above
>   shows that there's something wrong.  Here's the minimal tagfunc I
>   used:
> 
>     function! MyTagFunc(pattern, flags)
>       return taglist(a:pattern)
>     endfunc
>     set tagfunc=MyTagFunc

I haven't looked into it yet, but I was thinking whether this could be
related to the fact that you change the position of the cursor while
preparing a tag list.

-- 
Cheers,
Lech

-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

Raspunde prin e-mail lui