Merge pull request #214 from Deraen/completion-context

Completion context
This commit is contained in:
Tim Pope 2015-05-17 11:01:43 -04:00
commit 89aee9c00c
1 changed files with 37 additions and 1 deletions

View File

@ -108,6 +108,37 @@ function! s:candidate(val) abort
\ } \ }
endfunction endfunction
function! s:get_complete_context() abort
" Find toplevel form
" If cursor is on start parenthesis we don't want to find the form
" If cursor is on end parenthesis we want to find the form
let [line1, col1] = searchpairpos('(', '', ')', 'Wrnb', g:fireplace#skip)
let [line2, col2] = searchpairpos('(', '', ')', 'Wrnc', g:fireplace#skip)
if (line1 == 0 && col1 == 0) || (line2 == 0 && col2 == 0)
return ""
endif
if line1 == line2
let expr = getline(line1)[col1-1 : col2-1]
else
let expr = getline(line1)[col1-1 : -1] . ' '
\ . join(getline(line1+1, line2-1), ' ')
\ . getline(line2)[0 : col2-1]
endif
" Calculate the position of cursor inside the expr
if line1 == line('.')
let p = col('.') - col1
else
let p = strlen(getline(line1)[col1-1 : -1])
\ + strlen(join(getline(line1 + 1, line('.') - 1), ' '))
\ + col('.')
endif
return strpart(expr, 0, p) . '__prefix__' . strpart(expr, p)
endfunction
function! fireplace#omnicomplete(findstart, base) abort function! fireplace#omnicomplete(findstart, base) abort
if a:findstart if a:findstart
let line = getline('.')[0 : col('.')-2] let line = getline('.')[0 : col('.')-2]
@ -116,7 +147,12 @@ function! fireplace#omnicomplete(findstart, base) abort
try try
if fireplace#op_available('complete') if fireplace#op_available('complete')
let response = fireplace#message({'op': 'complete', 'symbol': a:base, 'extra-metadata': ['arglists', 'doc']}) let response = fireplace#message({
\ 'op': 'complete',
\ 'symbol': a:base,
\ 'extra-metadata': ['arglists', 'doc'],
\ 'context': s:get_complete_context()
\ })
let trans = '{"word": (v:val =~# ''[./]'' ? "" : matchstr(a:base, ''^.\+/'')) . v:val}' let trans = '{"word": (v:val =~# ''[./]'' ? "" : matchstr(a:base, ''^.\+/'')) . v:val}'
let value = get(response[0], 'value', get(response[0], 'completions')) let value = get(response[0], 'value', get(response[0], 'completions'))
if type(value) == type([]) if type(value) == type([])