Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for unite.vim about :GoDecls / :GoDeclsDir #1391

Merged
merged 4 commits into from
Sep 11, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 68 additions & 0 deletions autoload/unite/sources/decls.vim
Original file line number Diff line number Diff line change
@@ -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
21 changes: 19 additions & 2 deletions doc/vim-go.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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]

Expand Down Expand Up @@ -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'
Expand Down