This commit is contained in:
baabelfish 2016-02-02 09:32:04 +02:00
commit d8d84209c6
7 changed files with 142 additions and 44 deletions

View file

@ -18,34 +18,35 @@ function! s:NimHighlighter.on_exit()
if empty(self.lines) && self.file != expand("%:p")
return
endif
let highlights = {
\ 'skProc': ["Function", []],
\ 'skTemplate': ["PreProc", []],
\ 'skType': ["Type", []],
\ 'skMacro': ["Macro", []],
\ 'skMethod': ["Function", []],
\ 'skField': ["Identifier", []],
\ 'skAlias': ["Type", []],
\ 'skConditional': ["Conditional", []],
\ 'skConst': ["Constant", []],
\ 'skConverter': ["Function", []],
\ 'skDynLib': ["Include", []],
\ 'skEnumField': ["Identifier", []],
\ 'skForVar': ["Special", []],
\ 'skGenericParam': ["Typedef", []],
\ 'skGlobalVar': ["Constant", []],
\ 'skGlobalLet': ["Constant", []],
\ 'skIterator': ["Keyword", []],
\ 'skLabel': ["Identifier", []],
\ 'skLet': ["Constant", []],
\ 'skModule': ["Include", []],
\ 'skPackage': ["Define", []],
\ 'skParam': ["Identifier", []],
\ 'skResult': ["Keyword", []],
\ 'skStub': ["PreCondit", []],
\ 'skTemp': ["Identifier", []],
\ 'skUnknown': ["Error", []],
\ 'skVar': ["Constant", []]
\ 'skProc': ["Function", [], 0],
\ 'skTemplate': ["PreProc", [], 0],
\ 'skType': ["Type", [], 0],
\ 'skMacro': ["Macro", [], 0],
\ 'skMethod': ["Function", [], 0],
\ 'skField': ["Identifier", [], 0],
\ 'skAlias': ["Type", [], 0],
\ 'skConditional': ["Conditional", [], 0],
\ 'skConst': ["Constant", [], 1],
\ 'skConverter': ["Function", [], 0],
\ 'skDynLib': ["Include", [], 0],
\ 'skEnumField': ["Identifier", [], 0],
\ 'skForVar': ["Special", [], 1],
\ 'skGenericParam': ["Typedef", [], 0],
\ 'skGlobalVar': ["Constant", [], 1],
\ 'skGlobalLet': ["Constant", [], 1],
\ 'skIterator': ["Keyword", [], 0],
\ 'skLabel': ["Identifier", [], 0],
\ 'skLet': ["Constant", [], 1],
\ 'skModule': ["Include", [], 1],
\ 'skPackage': ["Define", [], 0],
\ 'skParam': ["Identifier", [], 1],
\ 'skResult': ["Keyword", [], 0],
\ 'skStub': ["PreCondit", [], 0],
\ 'skTemp': ["Identifier", [], 1],
\ 'skUnknown': ["Error", [], 0],
\ 'skVar': ["Constant", [], 1]
\ }
for line in self.lines
@ -69,7 +70,16 @@ function! s:NimHighlighter.on_exit()
let new_highlights = []
for [k, v] in items(highlights)
call add(new_highlights, matchaddpos(v[0], v[1]))
if g:nvim_nim_highlighter_semantic && v[2]
for pos in v[1]
let l = getline(pos[0])
let c = pos[1]
let class = (char2nr(l[c]) * char2nr(l[c + 1])) % 20
call add(new_highlights, matchaddpos("Semantic" . class, [pos]))
endfor
else
call add(new_highlights, matchaddpos(v[0], v[1]))
endif
endfor
for m in b:old_highlights
@ -95,7 +105,7 @@ endfunction
function! highlighter#guard()
if g:nvim_nim_enable_highlighter
if g:nvim_nim_highlighter_enable
if line("$") + 0 < 500
call highlighter#New()
endif

View file

@ -1,16 +1,16 @@
" if exists("s:loaded")
" finish
" endif
" let s:loaded = 1
if exists("s:loaded")
finish
endif
let s:loaded = 1
function! omni#item(parsed)
return {
\ 'word': a:parsed.lname,
\ 'menu': a:parsed.module,
\ 'kind': a:parsed.kindshort . " » " . a:parsed.type,
\ 'kind': a:parsed.kindshort . " » " . util#SignatureStr(a:parsed.type),
\ 'info': a:parsed.doc,
\ 'menu': a:parsed.module,
\ }
" \ 'kind': a:parsed.kindshort . " » " . a:parsed.type,
endfunction
function! omni#nim(findstart, base)

View file

@ -129,3 +129,62 @@ function! util#ParseV2(line)
\ }
return result
endfunction
let s:nesting_chars = ['(', '[', '{']
let s:unnesting_chars = [')', ']', '}']
let s:strip_regex = '\v^\s*(.{-})\s*$'
function! util#ParseSignature(input)
let pstart = stridx(a:input, "(") + 1
let pend = strridx(a:input, ")")
let parameters = strpart(a:input, pstart, pend - pstart)
let parameters_end = len(parameters) - 1
let depth = 0
let tsep = -1
let result = {'params': [], 'reval': '' }
" Parameters
let idx = 0
for s:char in split(parameters, '\zs')
if index(s:nesting_chars, s:char) >= 0
let depth += 1
elseif index(s:unnesting_chars, s:char) >= 0
let depth -= 1
endif
if depth == 0
if s:char == ':'
let tsep = idx
elseif s:char == ',' || s:char == ';'
call add(result.params, substitute(strpart(parameters, tsep + 1, idx - tsep - 1), s:strip_regex, '\1', ''))
let tsep = -1
endif
endif
let idx += 1
endfor
if tsep != -1
call add(result.params, substitute(strpart(parameters, tsep + 1, parameters_end + 1), s:strip_regex, '\1', ''))
endif
" Return value
let rstart = stridx(a:input, ":", pend + 1)
let rend = stridx(a:input, "{\.", pend + 1)
if rstart != -1 && rstart < rend
let reval = strpart(a:input, rstart + 1)
if rend != -1
let reval = strpart(reval, 0, rend - rstart - 1)
endif
let result.reval = substitute(reval, s:strip_regex, '\1', '')
endif
return result
endfunction
function! util#SignatureStr(input)
let tinfo = util#ParseSignature(a:input)
return join(tinfo.params, " -> ") . (tinfo.reval != "" ? (" => " . tinfo.reval) : "")
endfunction