Vim 的 Go 支持非常强大,让我激动得颤抖不已

首先

如标题所述,这是一个总结用vim创建的便利的Go开发环境。特别是介绍了对代码阅读非常方便的设置。

请参阅

这篇文章是在写作时参考的一篇有用的文章。由于按照日期顺序排列,所以后面部分包含了一些旧的描述。

我们将发布vim-go-extra插件。
http://vim-jp.org/blog/2014/09/02/vim-go-extra.html

使用Homebrew和Vim配置Go 1.2.1环境(2014.03)

大天空:使用Vim进行Go语言开发的方法。
http://mattn.kaoriya.net/software/vim/20130531000559.htm

go的vim命令「Fmt」实际上已经在quickfix中进行了注册,这太棒了!
http://qiita.com/umisama/items/2e38139e0d3f4410446e

用于Go的vim配置
http://qiita.com/hnakamur/items/f39fde28bcfe4beaaaba

Golang的Vim :: Metal3d
http://www.metal3d.org/ticket/2013/07/07/vim-for-golang

Go语言开发环境(Vim + Vundle版本)
http://qiita.com/todogzm/items/3c281da10287f7383487

当新手学习Go语言时,可以在这里找到幸福的地方。
http://qiita.com/tenntenn/items/0e33a4959250d1a55045

使用vim的路径加速你的Go项目
http://mattyjwilliams.blogspot.jp/2013/01/使用vims路径加速你的go项目

在使用Vim编写Go代码时需要注意的事项

如何在 VimFiler 上实现类似于 NERDTree 的可舒适使用的资源管理器方法 – 真棒 < 很棒 < 不好

能够做到这一点

利用VimFiler和Tagbar,实现类似IDE的列表显示功能。

这是通过在VimFiler中使用VimFilerTree命令和TagBar插件中的Tagbar命令来执行的。在显示文件树方面,NERDTree是一种常见选择,但我个人更喜欢使用VimFiler。当将光标移动到文件名或函数名上并按Enter键时,可以进行跳转操作。

VimFilerTree + Tagbar

有时候也想要使用Unite-outline。

您也可以在Unite Outline中显示大纲。

Unite-outline

跳转到gd的定义

在下方窗口的第15行中的NewAnsiColorWriter上放置光标并输入了”gd”。
屏幕被分割,在上方窗口打开了包含该定义的文件。

Goto Declaration

在 Godoc 中显示文档。

在下面窗口的第17行的fmt.Println下,将光标放置在:执行了Godoc命令的输出。
屏幕被分割,上面的窗口打开了Godoc。

Godoc

环境建设

环境变量

如果是在mac上使用homebrew

export GOROOT=/usr/local/opt/go/libexec
export GOPATH=$HOME/go
export PATH=$GOPATH/bin:$GOROOT/bin:$PATH

如果是Windows的話。

GOROOT=C:\go
GOPATH=%USERPROFILE%\go
PATH=%GOPATH%\bin;%GOROOT%\bin;%PATH%

工具

命令将被安装在 $GOPATH/bin 目录下。

go get -u golang.org/x/tools/cmd/goimports
go get -u golang.org/x/tools/cmd/godoc
go get -u golang.org/x/tools/cmd/vet
go get -u golang.org/x/tools/cmd/cover
go get -u github.com/nsf/gocode
go get -u github.com/golang/lint/golint
go get -u github.com/rogpeppe/godef
go get -u github.com/jstemmer/gotags

对于Windows来说,我建议你在Windows应用程序中进行构建,这样当你在vim中执行命令时,窗口就不会显示出来了。

go get -u -ldflags -H=windowsgui golang.org/x/tools/cmd/goimports
go get -u -ldflags -H=windowsgui golang.org/x/tools/cmd/godoc
go get -u -ldflags -H=windowsgui golang.org/x/tools/cmd/vet
go get -u -ldflags -H=windowsgui golang.org/x/tools/cmd/cover
go get -u -ldflags -H=windowsgui github.com/nsf/gocode
go get -u -ldflags -H=windowsgui github.com/golang/lint/golint
go get -u -ldflags -H=windowsgui github.com/rogpeppe/godef
go get -u -ldflags -H=windowsgui github.com/jstemmer/gotags

vimrc其实是一个文件,被用来配置Vim编辑器的行为和外观。

这是各种vim插件、Go设置以及用于VimFiler的树形显示的设置。

" for Neobundle {{{
if has('win32')
    let s:vim_home=expand('~/vimfiles')
else
    let s:vim_home=expand('~/.vim')
endif
if has('vim_starting')
    let &runtimepath.=printf(',%s/bundle/neobundle.vim', s:vim_home)
endif

set nocompatible
call neobundle#begin(expand(s:vim_home.'/bundle/'))
NeoBundleFetch 'Shougo/neobundle.vim'
call neobundle#end()

NeoBundle 'majutsushi/tagbar'
NeoBundle 'Shougo/vimfiler'
NeoBundle 'Shougo/vimproc'
NeoBundle 'Shougo/unite.vim'
NeoBundle 'Shougo/unite-outline'
NeoBundle 'dgryski/vim-godef'
NeoBundle 'vim-jp/vim-go-extra'
" vim-ft-goは最新版のvimを使えない場合のみ
NeoBundle 'google/vim-ft-go'
set rtp^=$GOPATH/src/github.com/nsf/gocode/vim

filetype plugin indent on
syntax on
NeoBundleCheck
" }}}

" for golang {{{
set path+=$GOPATH/src/**
let g:gofmt_command = 'goimports'
au BufWritePre *.go Fmt
au BufNewFile,BufRead *.go set sw=4 noexpandtab ts=4 completeopt=menu,preview
au FileType go compiler go
" }}}

" VimFilerTree {{{
command! VimFilerTree call VimFilerTree(<f-args>)
function VimFilerTree(...)
    let l:h = expand(a:0 > 0 ? a:1 : '%:p:h')
    let l:path = isdirectory(l:h) ? l:h : ''
    exec ':VimFiler -buffer-name=explorer -split -simple -winwidth=45 -toggle -no-quit ' . l:path
    wincmd t
    setl winfixwidth
endfunction
autocmd! FileType vimfiler call g:my_vimfiler_settings()
function! g:my_vimfiler_settings()
    nmap     <buffer><expr><CR> vimfiler#smart_cursor_map("\<Plug>(vimfiler_expand_tree)", "\<Plug>(vimfiler_edit_file)")
    nnoremap <buffer>s          :call vimfiler#mappings#do_action('my_split')<CR>
    nnoremap <buffer>v          :call vimfiler#mappings#do_action('my_vsplit')<CR>
endfunction

let my_action = {'is_selectable' : 1}
function! my_action.func(candidates)
    wincmd p
    exec 'split '. a:candidates[0].action__path
endfunction
call unite#custom_action('file', 'my_split', my_action)

let my_action = {'is_selectable' : 1}
function! my_action.func(candidates)
    wincmd p
    exec 'vsplit '. a:candidates[0].action__path
endfunction
call unite#custom_action('file', 'my_vsplit', my_action)
" }}}
" gotags {{{
let g:tagbar_type_go = {
    \ 'ctagstype' : 'go',
    \ 'kinds'     : [
        \ 'p:package',
        \ 'i:imports:1',
        \ 'c:constants',
        \ 'v:variables',
        \ 't:types',
        \ 'n:interfaces',
        \ 'w:fields',
        \ 'e:embedded',
        \ 'm:methods',
        \ 'r:constructor',
        \ 'f:functions'
    \ ],
    \ 'sro' : '.',
    \ 'kind2scope' : {
        \ 't' : 'ctype',
        \ 'n' : 'ntype'
    \ },
    \ 'scope2kind' : {
        \ 'ctype' : 't',
        \ 'ntype' : 'n'
    \ },
    \ 'ctagsbin'  : 'gotags',
    \ 'ctagsargs' : '-sort -silent'
\ }
" }}}
广告
将在 10 秒后关闭
bannerAds