Code Completion suggestion.

Ok, first a little context.
I currently have a project which provides an interface for vim to
invoke commands via system() calls which are executed in a headless
eclipse instance.

I use this interface to provide code completion for java source files
and ant build files, which both work great.  My issue comes into play
when I attempt to provide completion info (for display in the new
completion preview window in vim).  Retrieving this extra info can
result in a lot of extra processing on the eclipse side and depending
on the size of the completion set, can dramatically affect the
performance.

So, I propose a means to lazily retrieve info for a completion.
Basically it should be like a CursorHold, but in the context of the
completion popup.  If the user stops on a completion for some
determined amount of time, vim should then, ideally, spawn off a
thread to retrieve the info for that completion and display it in the
completion preview.  I think it is key to do this retrieval in an
asynchronous way so as not to prevent the user from moving to the next
completion or performing some other action.

To accomplish this, I also suggest that the means for defining how
completion is to be handled, be modified.

Currently completion is defined as follows:
  setlocal completefunc=SomeFunction

  With a single function
    function SomeFunction (findstart, base)

Instead of defining a single function, I propose that a script be
defined instead:
  setlocal completescript=foo/bar/mycompletion.vim

  Where the script is located via the autoload directory and contains
  the following functions (of which the first 2 are required, and the
  third is optional)

    " find the column in the current line where the completion starts
    function foo#bar#FindCompletionStart ()

    " find the list of completions given the supplied base.
    function foo#bar#FindCompletions (base)

    " find additional info for the completion at the supplied index
    " within the current completion results
    function foo#bar#FindCompletionInfo (index)

If implemented in this fashion, you gain a few advantages:
1. Completion info is only retrieved for completions that the user
   chooses to view and not for the possibly many others for which the
   retrieval would have been completely wasted.
2. More optional functions could be added to this completion script in
   the future without breaking compatibility with previous releases.

While I'm at it another suggestion I have would also to be to add
another function to my proposed script paradigm:
  function foo#bar#FindCompletionEnd ()
Which would find the ending column of the word to be replaced by the
completion.  So if I am have the following ('|' denoting the cursor
position):
  List mylist = ...
  mylist.ad|d(
The 'd' after the cursor position could be replaced when I choose
amongst my choices of 'add' or 'addAll', instead of having to manually
delete it after exiting the completion mode.

Thoughts on this?

--
eric

Reply via email to