Loading ...
Sorry, an error occurred while loading the content.

76440Re: automatic code completion in vim

Expand Messages
  • zhengda
    Jan 2, 2007
    • 0 Attachment
      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
    • Show all 27 messages in this topic