diff --git a/autoload/unite/sources/decls.vim b/autoload/unite/sources/decls.vim new file mode 100644 index 0000000000..aa3bba07f4 --- /dev/null +++ b/autoload/unite/sources/decls.vim @@ -0,0 +1,68 @@ +let s:save_cpo = &cpoptions +set cpoptions&vim + +let s:source = { + \ 'name': 'decls', + \ 'description': 'GoDecls implementation for unite', + \ 'syntax': 'uniteSource__Decls', + \ 'action_table': {}, + \ 'hooks': {}, + \ } + +function! unite#sources#decls#define() + return s:source +endfunction + +function! s:source.gather_candidates(args, context) abort + let l:bin_path = go#path#CheckBinPath('motion') + if empty(l:bin_path) + return [] + endif + + let l:path = expand(get(a:args, 0, '%:p:h')) + if isdirectory(l:path) + let l:mode = 'dir' + elseif filereadable(l:path) + let l:mode = 'file' + else + return [] + endif + + let l:include = get(g:, 'go_decls_includes', 'func,type') + let l:command = printf('%s -format vim -mode decls -include %s -%s %s', l:bin_path, l:include, l:mode, shellescape(l:path)) + let l:candidates = [] + try + let l:result = eval(unite#util#system(l:command)) + let l:candidates = get(l:result, 'decls', []) + catch + call unite#print_source_error(['command returned invalid response.', v:exception], s:source.name) + endtry + + return map(l:candidates, "{ + \ 'word': printf('%s :%d :%s', fnamemodify(v:val.filename, ':~:.'), v:val.line, v:val.full), + \ 'kind': 'jump_list', + \ 'action__path': v:val.filename, + \ 'action__line': v:val.line, + \ 'action__col': v:val.col, + \ }") +endfunction + +function! s:source.hooks.on_syntax(args, context) abort + syntax match uniteSource__Decls_Filepath /[^:]*\ze:/ contained containedin=uniteSource__Decls + syntax match uniteSource__Decls_Line /\d\+\ze :/ contained containedin=uniteSource__Decls + syntax match uniteSource__Decls_WholeFunction /\vfunc %(\([^)]+\) )?[^(]+/ contained containedin=uniteSource__Decls + syntax match uniteSource__Decls_Function /\S\+\ze(/ contained containedin=uniteSource__Decls_WholeFunction + syntax match uniteSource__Decls_WholeType /type \S\+/ contained containedin=uniteSource__Decls + syntax match uniteSource__Decls_Type /\v( )@<=\S+/ contained containedin=uniteSource__Decls_WholeType + highlight default link uniteSource__Decls_Filepath Comment + highlight default link uniteSource__Decls_Line LineNr + highlight default link uniteSource__Decls_Function Function + highlight default link uniteSource__Decls_Type Type + + syntax match uniteSource__Decls_Separator /:/ contained containedin=uniteSource__Decls conceal + syntax match uniteSource__Decls_SeparatorFunction /func / contained containedin=uniteSource__Decls_WholeFunction conceal + syntax match uniteSource__Decls_SeparatorType /type / contained containedin=uniteSource__Decls_WholeType conceal +endfunction + +let &cpoptions = s:save_cpo +unlet s:save_cpo diff --git a/doc/vim-go.txt b/doc/vim-go.txt index a85653c7c8..db3a8b5901 100644 --- a/doc/vim-go.txt +++ b/doc/vim-go.txt @@ -666,6 +666,22 @@ CTRL-t type declarations for the current directory. If [dir] is given it parses the given directory. + *unite-decls* +:Unite decls[:file or dir] + + Only enabled if `unite.vim` is installed. If run shows declarations for + all functions and types on the current file or directory. If [:file or + dir] is non empty, it parses the given one. +> + " show declarations on the parent directory of the current file + :Unite decls + + " show declarations on the file + :Unite decls:foo/bar.go + + " show declarations on the directory + :Unite decls:foo +< *:GoImpl* :GoImpl [receiver] [interface] @@ -1558,8 +1574,9 @@ By default the template file specified by |'g:go_template_file'| is used. < *'g:go_decls_includes'* -Only useful if `ctrlp.vim` is installed. This sets which declarations to show -for |:GoDecls|. It is a Comma delimited list Possible options are: +Only useful if `ctrlp.vim` or `unite.vim` are installed. This sets which +declarations to show for |:GoDecls| (`ctrp.vim`) and |unite-decls| +(`unite.vim`). It is a Comma delimited list Possible options are: {func,type}. The default is: > let g:go_decls_includes = 'func,type'