summaryrefslogtreecommitdiff
path: root/vim/plugin
diff options
context:
space:
mode:
authorFranck Cuny <franckcuny@gmail.com>2015-07-25 08:35:17 -0700
committerFranck Cuny <franckcuny@gmail.com>2015-07-25 08:35:17 -0700
commitcf22f18457783d61eae358717f7c0f4470052f73 (patch)
tree326338e1152a973467c75ed259489b38098d5f83 /vim/plugin
parent[vim] misc stuff (diff)
downloademacs.d-cf22f18457783d61eae358717f7c0f4470052f73.tar.gz
[vim] add plugin for golang
Diffstat (limited to '')
-rw-r--r--vim/plugin/godoc.vim138
1 files changed, 138 insertions, 0 deletions
diff --git a/vim/plugin/godoc.vim b/vim/plugin/godoc.vim
new file mode 100644
index 0000000..0c2c5c9
--- /dev/null
+++ b/vim/plugin/godoc.vim
@@ -0,0 +1,138 @@
+" Copyright 2011 The Go Authors. All rights reserved.
+" Use of this source code is governed by a BSD-style
+" license that can be found in the LICENSE file.
+"
+" godoc.vim: Vim command to see godoc.
+"
+"
+" Commands:
+"
+" :Godoc
+"
+" Open the relevant Godoc for either the word[s] passed to the command or
+" the, by default, the word under the cursor.
+"
+" Options:
+"
+" g:go_godoc_commands [default=1]
+"
+" Flag to indicate whether to enable the commands listed above.
+
+if exists("g:loaded_godoc")
+ finish
+endif
+let g:loaded_godoc = 1
+
+let s:buf_nr = -1
+let s:last_word = ''
+
+if !exists('g:go_godoc_commands')
+ let g:go_godoc_commands = 1
+endif
+
+if g:go_godoc_commands
+ command! -nargs=* -range -complete=customlist,go#complete#Package Godoc :call s:Godoc(<f-args>)
+endif
+
+nnoremap <silent> <Plug>(godoc-keyword) :<C-u>call <SID>Godoc('')<CR>
+
+function! s:GodocView()
+ if !bufexists(s:buf_nr)
+ leftabove new
+ file `="[Godoc]"`
+ let s:buf_nr = bufnr('%')
+ elseif bufwinnr(s:buf_nr) == -1
+ leftabove split
+ execute s:buf_nr . 'buffer'
+ delete _
+ elseif bufwinnr(s:buf_nr) != bufwinnr('%')
+ execute bufwinnr(s:buf_nr) . 'wincmd w'
+ endif
+
+ setlocal filetype=godoc
+ setlocal bufhidden=delete
+ setlocal buftype=nofile
+ setlocal noswapfile
+ setlocal nobuflisted
+ setlocal modifiable
+ setlocal nocursorline
+ setlocal nocursorcolumn
+ setlocal iskeyword+=:
+ setlocal iskeyword-=-
+
+ nnoremap <buffer> <silent> K :Godoc<cr>
+
+ au BufHidden <buffer> call let <SID>buf_nr = -1
+endfunction
+
+function! s:GodocNotFound(content)
+ if !len(a:content)
+ return 1
+ endif
+
+ return a:content =~# '^.*: no such file or directory\n'
+endfunction
+
+function! s:GodocWord(word)
+ if !executable('godoc')
+ echohl WarningMsg
+ echo "godoc command not found."
+ echo " install with: go get code.google.com/p/go.tools/cmd/godoc"
+ echohl None
+ return 0
+ endif
+ let word = a:word
+ silent! let content = system('godoc ' . word)
+ if v:shell_error || !len(content)
+ if len(s:last_word)
+ silent! let content = system('godoc ' . s:last_word.'/'.word)
+ if v:shell_error || s:GodocNotFound(content)
+ echo 'No documentation found for "' . word . '".'
+ return 0
+ endif
+ let word = s:last_word.'/'.word
+ else
+ echo 'No documentation found for "' . word . '".'
+ return 0
+ endif
+ endif
+ let s:last_word = word
+ silent! call s:GodocView()
+ setlocal modifiable
+ silent! %d _
+ silent! put! =content
+ silent! normal gg
+ setlocal nomodifiable
+ setfiletype godoc
+ return 1
+endfunction
+
+function! s:Godoc(...)
+ if !len(a:000)
+ let oldiskeyword = &iskeyword
+ setlocal iskeyword+=.
+ let word = expand('<cword>')
+ let &iskeyword = oldiskeyword
+ let word = substitute(word, '[^a-zA-Z0-9\\/._~-]', '', 'g')
+ let words = split(word, '\.\ze[^./]\+$')
+ else
+ let words = a:000
+ endif
+ if !len(words)
+ return
+ endif
+ if s:GodocWord(words[0])
+ if len(words) > 1
+ if search('^\%(const\|var\|type\|\s\+\) ' . words[1] . '\s\+=\s')
+ return
+ endif
+ if search('^func ' . words[1] . '(')
+ silent! normal zt
+ return
+ endif
+ echo 'No documentation found for "' . words[1] . '".'
+ endif
+ endif
+endfunction
+
+" vim:ts=4:sw=4:et