On Wed, 10 May 2006 at 8:10am, Benjamin Reitzammer wrote:

> Hi,
>
> thanks a lot, for all your responses. And for being so blazingly fast.
> Just like vim itself ;)
>
> Using a tags file is the closest to the described functionality I was
> looking for. Although I must say that having to press the <tab> key to
> request a completion is not nearly as nice as having a list
> automatically update.
>
> Yakov said, getting something like this in vim would be quite hard, but
> I think, that I might give it a shot nonetheless. You sure will hear
> about it, if I do so.
>
> Thanks again for being so helpful
>
> Cheers
>
> Benjamin

If you go with the tag file approach, it is not that hard to cook up
something quickly, without having to press tab. Here is something very
unpolished, but shows the approach (code copied from my execmap.vim
plugin):

function! LookupFile()
  " Open a new buffer to show the results.
  new
  redraw

  " Generate a line with spaces to clear the previous message.
  let i = 1
  let clearLine = "\r"
  while i < &columns
    let clearLine = clearLine . ' '
    let i = i + 1
  endwhile

  let str = ""
  call Prompt(str)
  let breakLoop = 0
  let accepted = 0
  while !breakLoop
    try
      let char = getchar()
    catch /^Vim:Interrupt$/
      let char = "\<Esc>"
    endtry
    if char == '^\d\+$' || type(char) == 0
      let char = nr2char(char)
    endif " It is the ascii code.
    if char == "\<BS>"
      let str = strpart(str, 0, strlen(str) - 1)
    elseif char == "\<Esc>"
      let breakLoop = 1
    elseif char == "\<CR>"
      let accepted = 1
      let breakLoop = 1
    else
      let str = str . char
    endif

    " Show the matches for what is typed so far.
    silent! 1,$delete
    let _tags = &tags
    set tags=/tmp/tags
    try
      let tags = taglist(str)
    finally
      let &tags = _tags
    endtry
    for ta in tags
      "Why does this generates syntax errors?
      "silent put =ta["filename"]
      call append('$', ta["filename"])
    endfor
    redraw

    echon clearLine
    call Prompt(str)
  endwhile
endfunction

function! Prompt(str)
  echon "\rLookup file containg: " . a:str
endfunction

If you call LookupFile(), it brings an empty buffer and prompts you to
enter a string. Entering each character makes the buffer show all the
matching filenames. What you sould do in addition is to:
- Avoid hardcoding the tags file.
- Don't lookup tags for each entered character, but only after a short
  delay (this could be tricky). This may not be important thought.
- When user finds the file, make it easy to open it (like pressing O on it,
  or even opening the file right-away if there is only one match).
- Use a scratch buffer to show results and reuse one buffer. I have
  numerous examples in my all my plugins (selectbuf, breakpts etc.)
- Plugginize it, creating maps etc. to invoke the function. Again, if
  you don't have much experience, there are several that you can follow.
  You can look at my plugins, I try to follow all the plugin writing
  rules that Vim doc lists.

-- 
HTH,
Hari

__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 

Reply via email to