It's because your tag file is not sorted correctly, the last tag
"main" should be the first tag in the file. The script does a tag
binary search and the tags file must be sorted to work properly (:help
tag-binary-search).
Best regards,
Vissale
2007/1/3, zhengda <[EMAIL PROTECTED]>:
> Vissale NEANG wrote:
> > What is you ctags command?
> > Could you send me your tag file?
> >
> > Just for comparison I give you my tag file
> >
> > 2007/1/3, Zheng Da <[EMAIL PROTECTED]>:
> >> On 1/3/07, Vissale NEANG <[EMAIL PROTECTED]> wrote:
> >> > Hello,
> >> >
> >> > I am the maintainer of the script and I can reproduce the problem:
> >> >
> >> > 1 int main(){
> >> > 2 hello h;
> >> > 3 hello::hello();
> >> > 4 h.
> >> > 5 hello::<C-x><C-o> <--------- the popup menu only appear
here
> >> > 6 tmp1 t1;
> >> > 7 t1.
> >> > 8 }
> >> >
> >> > At line 4, the popup menu doesn't appear because of the brace
at line
> >> > 1. Internally the script use the vim function "searchdecl" (same
> >> > behaviour as the command "gd") to search the declaration line
of your
> >> > object "h". But "gd" works properly only if your brace starts a
new
> >> > line because it uses internally the command "[[" (:help gd and
:help
> >> > [[). So if you want to see the popup menu at line 4 you have to
write
> >> > your code like this :
> >> >
> >> > 1 int main()
> >> > 2 { // This brace must starts the line
> >> > 3 hello h;
> >> > 4 hello::hello();
> >> > 5 h. // The popup menu should appear here
> >> > 6 hello::
> >> > 7 tmp1 t1;
> >> > 8 t1.
> >> > 9 }
> >> >
> >> > At line 8, the popup menu doesn't appear because, after the
command
> >> > "gd", the script tokenizes the source code from line 5 to 7 and
the
> >> > resulting code in our case is :
> >> >
> >> > h.hello::tmp1 t1;
> >> >
> >> > so the script found that the type of the object "t1" is
> >> > "h.hello::tmp1", this is not correct.
> >> > If you want to see the popup menu you have to, at least,
terminate the
> >> > instruction at line 6 with ";"
> >> >
> >> > 1 int main()
> >> > 2 { // This brace must starts the line
> >> > 3 hello h;
> >> > 4 hello::hello();
> >> > 5 h.print(); // The popup menu should appear here
> >> > 6 hello::hello(); // you have to terminate properly your
> >> > // instruction with ";" before the next
> >> declaration
> >> > 7 tmp1 t1;
> >> > 8 t1. // the popup menu should appear here
> >> > 9 }
> >> >
> >> > If you have other questions, I am there :)
> >> >
> >> > Best regards,
> >> >
> >> > Vissale
> >> >
> >> > 2007/1/2, zhengda <[EMAIL PROTECTED]>:
> >> > > Mikolaj Machowski wrote:
> >> > > > On pon sty 1 2007, Mikolaj Machowski wrote:
> >> > > >
> >> > > >> This won't work: you need a different variable name, see
> >> ":help E706".
> >> > > >>
> >> > > >
> >> > > > Yeah, I forgot (not only about that).
> >> > > >
> >> > > > This is complete solution::
> >> > > >
> >> > > > function! UpdateTags()
> >> > > > call writefile(getline(1, '$'), '.tmp.cc', 'b')
> >> > > > let tags = system('ctags --c++-kinds=+p
--fields=+iaS
> >> --extra=+q -f
> >> > > > - .tmp.cc')
> >> > > > " Note: whitespaces around expand are tab chars.
> >> > > > let alltags = system('grep -v "
'.expand('%').' "
> >> tags')
> >> > > > let tagstable = split(alltags, '\n')
> >> > > > call add(tagstable, tags)
> >> > > > call writefile(tagstable, 'tags', 'b')
> >> > > > redraw!
> >> > > > return ';'
> >> > > > endfunction
> >> > > > inoremap <expr> ; UpdateTags()
> >> > > >
> >> > > > Note: this is untested in real life, it doesn't return any
errors.
> >> > > >
> >> > > > In good conditions execution of whole function takes 0.46s on
> >> big tags
> >> > > > file (KMail source, tags size over 4MB, 10000 lines). Delay
> >> noticeable
> >> > > > on my computer Sempron 2200, 512M RAM, old HD 5400rpm. In
worse
> >> conditions
> >> > > > it was taking up to 0.75s::
> >> > > >
> >> > > > FUNCTION UpdateTags()
> >> > > > Called 1 time
> >> > > > Total time: 0.527128
> >> > > > Self time: 0.401542
> >> > > >
> >> > > > count total (s) self (s)
> >> > > > 1 0.000551 call
writefile(getline(1,
> >> '$'), '.tmp.cc', 'b')
> >> > > > 1 0.026373 0.000298 let tags = system('ctags
> >> --c++-kinds=+p
> >> > > > --fields=+iaS --extra=+q -f - .tmp.cc')
> >> > > > 1 0.000091 let stags = split(tags,
> >> '\n')
> >> > > > 1 0.130731 0.031220 let alltags =
> >> system('grep -v " '.expand('%').' "
> >> > > > tags')
> >> > > > 1 0.128909 let tagstable =
> >> split(alltags, '\n')
> >> > > > 1 0.000043 call extend(tagstable,
> >> stags)
> >> > > > 1 0.240341 call
writefile(tagstable,
> >> 'tags', 'b')
> >> > > > 1 0.000033 return ';'
> >> > > >
> >> > > > FUNCTIONS SORTED ON TOTAL TIME
> >> > > > count total (s) self (s) function
> >> > > > 1 0.527128 0.401542 UpdateTags()
> >> > > >
> >> > > > FUNCTIONS SORTED ON SELF TIME
> >> > > > count total (s) self (s) function
> >> > > > 1 0.527128 0.401542 UpdateTags()
> >> > > >
> >> > > > Note however I've made one fatal mistake. ``ctags fname`` will
> >> point to
> >> > > > tags in file .tmp.cc not our real current file! Filtering tags
> >> in Vim is
> >> > > > possible and on small sample quite fast but still 0.5s is
long.
> >> Maybe we
> >> > > > should put that strain to the system::
> >> > > >
> >> > > > function! UpdateTags()
> >> > > > call writefile(getline(1, '$'), '.tmp.cc', 'b')
> >> > > > call system('grep -v " '.expand('%').' " tags >
> >> tags2 && mv -f tags2
> >> > > > tags')
> >> > > > let tags = system('ctags --c++-kinds=+p
--fields=+iaS
> >> --extra=+q -f
> >> > > > - .tmp.cc | sed "s/\t\.tmp\.cc\t/\t'.expand('%').'\t/" >>
tags')
> >> > > > return ';'
> >> > > > endfunction
> >> > > > inoremap <expr> ; UpdateTags()
> >> > > >
> >> > > > And here we have the winner::
> >> > > >
> >> > > > FUNCTION UpdateTags()
> >> > > > Called 1 time
> >> > > > Total time: 0.145700
> >> > > > Self time: 0.001068
> >> > > >
> >> > > > count total (s) self (s)
> >> > > > 1 0.000523 call
writefile(getline(1,
> >> '$'), '.tmp.cc', 'b')
> >> > > > 1 0.096118 0.000195 call system('grep -v "
> >> '.expand('%').' " tags >
> >> > > > tags2 && mv -f tags2 tags')
> >> > > > 1 0.049003 0.000294 call system('ctags
> >> --c++-kinds=+p --fields=+iaS
> >> > > > --extra=+q -f - .tmp.cc | sed
> >> "s/\t\.tmp\.cc\t/\t'.expand('%').'\t/" >>
> >> > > > tags')
> >> > > > 1 0.000029 return ';'
> >> > > >
> >> > > > FUNCTIONS SORTED ON TOTAL TIME
> >> > > > count total (s) self (s) function
> >> > > > 1 0.145700 0.001068 UpdateTags()
> >> > > >
> >> > > > FUNCTIONS SORTED ON SELF TIME
> >> > > > count total (s) self (s) function
> >> > > > 1 0.145700 0.001068 UpdateTags()
> >> > > >
> >> > > >
> >> > > > Below 0.15s (and even in worse conditions only up to 0.25s)!
> >> This is
> >> > > > less then one keystroke of good touchtyper. This is for the
> >> price of
> >> > > > portability but you can find grep/sed/mv for other systems so
> >> situation
> >> > > > isn't hopeless.
> >> > > >
> >> > > > HTH
> >> > > >
> >> > > > m.
> >> > > >
> >> > > >
> >> > > >
> >> > > Thank you for your script. It doesn't work so fast in my
computer.
> >> > > There is another problem when I use omnicppcomplete plugin.
> >> > > I don't know if it is its bug.
> >> > > For example, there are two files:
> >> > > --------tmp1.h--------------------
> >> > > class tmp1{
> >> > > public:
> >> > > void print1(){}
> >> > > };
> >> > > --------hello.cc-----------------
> >> > > #include "tmp1.h"
> >> > >
> >> > > class hello{
> >> > > public:
> >> > > void print(){}
> >> > > static void hello(){}
> >> > > static int h;
> >> > > };
> >> > >
> >> > > int main(){
> >> > > hello h;
> >> > > hello::hello();
> >> > > h.
> >> > > hello::<C-x><C-o> <--------- the popup menu only appear
here
> >> > > tmp1 t1;
> >> > > t1.
> >> > > }
> >> > >
> >> > > I'm sure tags has been created correctly. The popup menu
sometimes
> >> > > appears, sometimes doesn't when I type '.' or '->'.
> >> > > I tried many times, but still didn't find the rule: when it
appears,
> >> > > when it doesn't.
> >> > > Does anyone meet the similar program? Or has some ideas?
> >> > >
> >> > > Zheng Da
> >> > >
> >> >
> >>
> >> Thank you for your reply.
> >> It does work in "h." in my case, when I changed the code like
> >> int main()
> >> {
> >> hello h;
> >> hello::hello();
> >> h.
> >> }
> >> But for class tmp1, it still doesn't work. For this code,
> >> ----------tmp1.h--------------
> >> class tmp1
> >> {
> >> public:
> >> void print1(){}
> >> };
> >> ----------hello.cc------------
> >> #include "tmp1.h"
> >>
> >> int main()
> >> {
> >> tmp1 t1;
> >> t1. <-----no popup menu appears
> >> }
> >> It seems it only works for the class in the same file.
> >> If the class is in the header file, it doesn't.
> >>
> >> --
> >> With regards
> >> Zheng Da
> >>
> These are my tags file and code files
>
>
> print1 tmp1.h /^ void print1(){}$/;" f
class:tmp1 access:public signature:()
> tmp1 tmp1.h /^class tmp1$/;" c
> tmp1::print1 tmp1.h /^ void print1(){}$/;" f
class:tmp1 access:public signature:()
> main test.cpp /^int main()$/;" f signature:()
>
>
>
>