You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

75 lines
2.0 KiB
VimL

" Vim completion script
"
" This source code is licensed under the BSD-style license found in the
" LICENSE file in the toplevel directory of this source tree. An additional
" grant of patent rights can be found in the PATENTS file in the same
" directory.
" Magical flow autocomplete token.
let s:autotok = 'AUTO332'
" Omni findstart phase.
function! s:FindStart()
let line = getline('.')
let start = col('.') - 1
while start >= 0 && line[start - 1] =~ '[a-zA-Z_0-9\x7f-\xff$]'
let start -= 1
endwhile
return start
endfunction
function! flowcomplete#Complete(findstart, base)
if a:findstart
return s:FindStart()
endif
let lnum = line('.')
let cnum = col('.')
let lines = getline(1, '$')
" Insert the base and magic token into the current line.
let curline = lines[lnum - 1]
let lines[lnum - 1] = curline[:cnum - 1] . a:base . s:autotok . curline[cnum :]
" Pass the buffer to flow.
let buffer = join(lines, "\n")
let command = g:flow#flowpath.' autocomplete '.expand('%:p')
let result = system(command, buffer)
if result =~ '^Error: not enough type information to autocomplete' ||
\ result =~ '^Could not find file or directory'
return []
endif
let matches = []
" Parse the flow output.
for line in split(result, "\n")
if empty(line) | continue | endif
let entry = {}
let space = stridx(line, ' ')
let word = line[:space - 1]
let type = line[space + 1 :]
" Skip matches that don't start with the base"
if (stridx(word, a:base) != 0) | continue | endif
" This is pretty hacky. We're using regexes to recognize the different
" kind of matches. Really in the future we should somehow consume the json
" output
if type =~ '^(.*) =>'
let entry = { 'word': word, 'kind': a:base, 'menu': type }
elseif type =~ '^[class:'
let entry = { 'word': word, 'kind': 'c', 'menu': type }
else
let entry = { 'word': word, 'kind': 'v', 'menu': type }
endif
call add(matches, entry)
endfor
return matches
endfunction