X-Git-Url: http://nitlanguage.org diff --git a/misc/vim/plugin/nit.vim b/misc/vim/plugin/nit.vim index 073ef8b..6824882 100644 --- a/misc/vim/plugin/nit.vim +++ b/misc/vim/plugin/nit.vim @@ -53,7 +53,7 @@ function NitComplete() let g:acp_behaviorKeywordIgnores = ['new', 'var', 'in', 'do', 'els', 'end', 'ret', 'for', 'fun'] " Use nitls to compute all interesting files from the current directory and the standard library - for file in split(system('nitls -M standard .', '\n')) + for file in split(system('nitls -M core .', '\n')) silent let &complete = &complete . ',s' . file silent set complete? endfor @@ -266,12 +266,20 @@ fun NitOmnifunc(findstart, base) endfun " Show doc for the entity under the cursor in the preview window -fun Nitdoc() - " Word under cursor - let word = expand("") +fun Nitdoc(...) + if a:0 == 0 || empty(a:1) + " Word under cursor + let word = expand("") + else + let word = join(a:000, ' ') + endif " All possible docs (there may be more than one entity with the same name) let docs = [] + let prefix_matches = [] + let substring_matches = [] + let synopsis_matches = [] + let doc_matches = [] " Search in all metadata files for file in ['modules', 'classes', 'properties'] @@ -283,17 +291,34 @@ fun Nitdoc() for line in readfile(path) let words = split(line, '#====#', 1) let name = get(words, 0, '') - if name =~ '^' . word . '\>' - " It fits our word, get long doc - let desc = get(words,3,'') - let desc = join(split(desc, '#nnnn#', 1), "\n") - call add(docs, desc) + if name =~ '^'.word.'\>' + " Exact match + call s:NitdocAdd(docs, words) + elseif name =~? '^'.word + " Common-prefix match + call s:NitdocAdd(prefix_matches, words) + elseif name =~? word + " Substring match + call s:NitdocAdd(substring_matches, words) + elseif get(words, 2, '') =~? word + " Match in the synopsis + call s:NitdocAdd(synopsis_matches, words) + elseif get(words, 3, '') =~? word + " Match in the longer doc + call s:NitdocAdd(doc_matches, words) endif endfor endfor + " Unite all results in prefered order + call extend(docs, sort(prefix_matches)) + call extend(docs, sort(substring_matches)) + call extend(docs, sort(synopsis_matches)) + call extend(docs, sort(doc_matches)) + " Found no doc, give up if empty(docs) || !(join(docs, '') =~ '\w') + echo 'Nitdoc found nothing for "' . word . '"' return endif @@ -310,6 +335,8 @@ fun Nitdoc() silent put = '' endif endfor + execute 0 + delete " the first empty line " Set options setlocal buftype=nofile @@ -322,6 +349,13 @@ fun Nitdoc() redraw! endfun +" Internal function to search parse the information from a metadata line +fun s:NitdocAdd(matches, words) + let desc = get(a:words, 3, '') + let desc = join(split(desc, '#nnnn#', 1), "\n") + call add(a:matches, desc) +endfun + " Call `git grep` on the word under the cursor " " Shows declarations first, then all matches, in the preview window. @@ -348,7 +382,25 @@ fun NitGitGrep() redraw! endfun -" Activate the omnifunc on Nit files -autocmd FileType nit set omnifunc=NitOmnifunc +" Call `nit` on the current file +fun NitExecute() + let path = expand('%') + + if &modified + let path = tempname() . '.nit' + execute '%write '. path + endif + + execute '!nit "' . path . '"' +endfun +command NitExecute call NitExecute() + +if !exists("g:nit_disable_omnifunc") || !g:nit_disable_omnifunc + " Activate the omnifunc on Nit files + autocmd FileType nit set omnifunc=NitOmnifunc +endif + +" Define the user command Nitdoc for ease of use +command -nargs=* Nitdoc call Nitdoc("") let s:script_dir = fnamemodify(resolve(expand(':p')), ':h')