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

Reply via email to