您好,欢迎访问一九零五行业门户网

go语言环境vim配置详解

一、环境准备:
系统环境说明:
[root@docker golang]# cat /etc/redhat-release centos linux release 7.2.1511 (core) [root@docker golang]# uname -alinux docker 3.10.0-229.el7.x86_64 #1 smp fri mar 6 11:36:42 utc 2015 x86_64 x86_64 x86_64 gnu/linux[root@docker golang]#
准备一个go文件,用于观察配置插件过程中的变化:
//hellogolang.gopackage mainimport "fmt"func main() { fmt.println("hello golang!")}
二、插件配置之路:
1、vundle.vim:
#mkdir ~/.vim/bundle#git clone https://github.com/gmarik/vundle.vim.git ~/.vim/bundle/vundle.vim
配置vimrc:创建~/.vimrc文件(如果你没有这个文件的话),在文件顶部添加有关vundle.vim的配置:
set nocompatible " be improved, requiredfiletype off " required" set the runtime path to include vundle and initializeset rtp+=~/.vim/bundle/vundle.vimcall vundle#begin()" let vundle manage vundle, requiredplugin 'gmarik/vundle.vim'" all of your plugins must be added before the following linecall vundle#end() " requiredfiletype plugin indent on " required
此时vim仅安装了vundle.vim这一个插件。编辑hellogolang.go时与编辑普通文本文件无异,一切都还是vim的默认属性
2、vim-go
vim-go是当前使用最为广泛的用于搭建golang开发环境的vim插件,这里我同样使用vim-go作为核心和基础进行环境搭建的。vim-go利 用开源vim插件管理器安装,gmarik/vundle.vim是目前被推荐次数更多的vim插件管理器,超过了pathogen。
这里我们 就用vundle来作为vim的插件管理工具。
编辑~/.vimrc,在vundle#begin和vundle#end间增加一行:
plugin 'fatih/vim-go'
在vim内执行:plugininstall,
vundle.vim会在左侧打开一个vundle installer preview子窗口,窗口下方会提示:“processing 'fatih/vim-go'”,待安装完毕后,提示信息变 成“done!”。
这时,我们可以看到.vim/bundle下多了一个vim-go文件夹:
$ ls .vim/bundle/vim-go/ vundle.vim/
此时,再次编辑hellogolang.go,语法高亮有了, 保存时自动format(利用$gobin/gofmt)也有了,但其他高级功能,比如自动import缺失的 package、自动补齐仍然没有,我们还要继续安装一些东东。
3、安装go.tools binaries 
vim-go安装说明中提到所有必要的binary需要先安装好,比如gocode、godef、goimports等。
通过:goinstallbinaries,这些vim-go依赖的二进制工具将会自动被下载,并被安装到$gobin下或$gopath/bin下。(这个工具需要依赖git或hg,需要提前安装到你的os中。)
:goinstallbinaries的执行是交互式的,你需要回车确认:
vim-go: gocode not found. installing github.com/nsf/gocode to folder /home/tonybai/go/binvim-go: goimports not found. installing code.google.com/p/go.tools/cmd/goimports to folder /home/tonybai/go/bin/vim-go: godef not found. installing code.google.com/p/rog-go/exp/cmd/godef to folder /home/tonybai/go/bin/vim-go: oracle not found. installing code.google.com/p/go.tools/cmd/oracle to folder /home/tonybai/go/bin/vim-go: gorename not found. installing code.google.com/p/go.tools/cmd/gorename to folder /home/tonybai/go/bin/vim-go: golint not found. installing github.com/golang/lint/golint to folder /home/tonybai/go/bin/vim-go: errcheck not found. installing github.com/kisielk/errcheck to folder /home/tonybai/go/bin/
不过这些代码多在code.google.com上托管,因此由于众所周知的原因,vim-go的自动安装很可能以失败告终,这样就需要你根据上 面日志中提到的各个工具的源码地址逐一去下载并本地安装。无法搭梯子的,可以通过http://gopm.io 下载相关包。
安装后,$gobin下的新增binaries如下:
-rwxr-xr-x 1 tonybai tonybai 5735552 11 7 11:03 errcheck*-rwxr-xr-x 1 tonybai tonybai 9951008 11 7 10:33 gocode*-rwxr-xr-x 1 tonybai tonybai 5742800 11 7 11:07 godef*-rwxr-xr-x 1 tonybai tonybai 4994120 11 7 11:00 goimports*-rwxr-xr-x 1 tonybai tonybai 5750152 11 7 11:03 golint*-rwxr-xr-x 1 tonybai tonybai 6381832 11 7 11:01 gorename*-rwxr-xr-x 1 tonybai tonybai 2954392 11 7 10:38 gotags*-rwxr-xr-x 1 tonybai tonybai 9222856 11 7 11:01 oracle*
安装好这些binaries后,我们来看看哪些特性被支持了。
再次编辑hellogolang.go:
- 新起一行输入fmt.,然后ctrl+x, ctrl+o,vim 会弹出补齐提示下拉框,不过并非实时跟随的那种补齐,这个补齐是由gocode提供的。
– 输入一行代码:time.sleep(time.second),执行:goimports,vim会自动导入time包。
– 将光标移到sleep函数上,执行:godef或命令模式下敲入gd,vim会打开$goroot/src/time/sleep.go中 的sleep函数的定义。执行:b 1返回到hellogolang.go。
– 执行:golint,运行golint在当前go源文件上。
– 执行:godoc,打开当前光标对应符号的go文档。
– 执行:govet,在当前目录下运行go vet在当前go源文件上。
– 执行:gorun,编译运行当前main package。
– 执行:gobuild,编译当前包,这取决于你的源文件,gobuild不产生结果文件。
– 执行:goinstall,安装当前包。
– 执行:gotest,测试你当前路径下地_test.go文件。
– 执行:gocoverage,创建一个测试覆盖结果文件,并打开浏览器展示当前包的情况。
– 执行:goerrcheck,检查当前包种可能的未捕获的errors。
– 执行:gofiles,显示当前包对应的源文件列表。
– 执行:godeps,显示当前包的依赖包列表。
– 执行:goimplements,显示当前类型实现的interface列表。
– 执行:gorename [to],将当前光标下的符号替换为[to]。
三、其他插件
到目前为止,我们还有若干特性没能实现,重点是:
– 实时跟随的代码补齐
– code snippet support
1、安装ycm(your complete me)
在~/.vimrc中添加一行:
plugin 'valloric/youcompleteme'
保存退出后,再打开~/.vimrc并执行:plugininstall
安装完后,下面的提示栏提示:
ycm_client_support.[so|pyd|dll] and ycm_core.[so|pyd|dll] not detected; you need to compile ycm before using it. read the docs!
ycm是用了c++编写的模块对性能进行优化了,于是需要手工编译ycm的support库。步骤如下:
sudo yum install build-essential cmake python-devcd ~/.vim/bundle/youcompleteme./install.sh
构建(编译c++很慢,需要耐心的等一会)ok后,再打开hellogolang.go,逐字的实时补全功能就具备了!cool!
2、安装 ultisnips
vim-go默认是用ultisnips引擎插件,但这个插件需要单独安装。同样,我们利用vundle来安装它,在~/.vimrc中添加一行:
plugin 'sirver/ultisnips'
保存,退出vim
打开vim,执行:plugininstall
编辑hellogolang.go,按照go.snip中的说明,我们输入func后敲击tab键,我们发现期待的:
func name(params) type { }
并没有出现。反倒是ycm的下拉提示显示在那里让你选择。似乎是ultisnips和ycm的键组合冲突了。ultisnips官方说明也的确如 此。ultisnips默认是用tab展开snippet的,而ycm中的tab用来选择补齐项,我们可以通过设置来避免这些。
我们在.vimrc中添加如下setting:
" ycm settingslet g:ycm_key_list_select_completion = ['', '']let g:ycm_key_list_previous_completion = ['']let g:ycm_key_invoke_completion = '<c-space>'" ultisnips settinglet g:ultisnipsexpandtrigger="<tab>"let g:ultisnipsjumpforwardtrigger="<c-b>"let g:ultisnipsjumpbackwardtrigger="<c-z>"
这样让ycm通过回车和向下的箭头来做list item正向选择,通过向上箭头做反向选择。通过ctrl+space来原地触发补齐提示。
而ultisnips则是用tab做snippet展开,ctrl+b正向切换占位符,ctrl+z反向切换占位符。
四、.vimrc
前面讲到了vim-go有许多命令,在:xx模式下执行多显不便,于是你可以定义一些mappings,比如:
" set mapleaderlet mapleader = ","" vim-go custom mappingsau filetype go nmap <leader>s <plug>(go-implements)au filetype go nmap <leader>i <plug>(go-info)au filetype go nmap <leader>gd <plug>(go-doc)au filetype go nmap <leader>gv <plug>(go-doc-vertical)au filetype go nmap <leader>r <plug>(go-run)au filetype go nmap <leader>b <plug>(go-build)au filetype go nmap <leader>t <plug>(go-test)au filetype go nmap <leader>c <plug>(go-coverage)au filetype go nmap <leader>ds <plug>(go-def-split)au filetype go nmap <leader>dv <plug>(go-def-vertical)au filetype go nmap <leader>dt <plug>(go-def-tab)au filetype go nmap <leader>e <plug>(go-rename)
这样我们在命令模式下,输入<,>+<r>就是运行 当前main包,以此类推。
另外下面这个配置使得我们在save file时既可以格式化代码,又可以自动插入包导入语句(或删除不用的包导入语句)。
" vim-go settingslet g:go_fmt_command = "goimports"
到这里,我们的vim golang开发环境就基本搭建好了。snippet+实时补齐让你coding如飞!
五、.vimrc文件
下面是截至目前为止全量.vimrc文件的内容:set nocompatible " be improved, requiredfiletype off " requiredcolorscheme molokai" set the runtime path to include vundle and initializeset rtp+=~/.vim/bundle/vundle.vimcall vundle#begin()" let vundle manage vundle, requiredplugin 'gmarik/vundle.vim'plugin 'fatih/vim-go'plugin 'valloric/youcompleteme'plugin 'sirver/ultisnips'" all of your plugins must be added before the following linecall vundle#end() " requiredfiletype plugin indent on " required" set mapleaderlet mapleader = ","" vim-go custom mappingsau filetype go nmap <leader>s <plug>(go-implements)au filetype go nmap <leader>i <plug>(go-info)au filetype go nmap <leader>gd <plug>(go-doc)au filetype go nmap <leader>gv <plug>(go-doc-vertical)au filetype go nmap <leader>r <plug>(go-run)au filetype go nmap <leader>b <plug>(go-build)au filetype go nmap <leader>t <plug>(go-test)au filetype go nmap <leader>c <plug>(go-coverage)au filetype go nmap <leader>ds <plug>(go-def-split)au filetype go nmap <leader>dv <plug>(go-def-vertical)au filetype go nmap <leader>dt <plug>(go-def-tab)au filetype go nmap <leader>e <plug>(go-rename)" vim-go settingslet g:go_fmt_command = "goimports"" ycm settingslet g:ycm_key_list_select_completion = ['', '']let g:ycm_key_list_previous_completion = ['', '']let g:ycm_key_invoke_completion = '<c-space>'" ultisnips settingslet g:ultisnipsexpandtrigger="<tab>"let g:ultisnipsjumpforwardtrigger="<c-b>"let g:ultisnipsjumpbackwardtrigger="<c-z>"
更多golang知识请关注golang教程栏目。
以上就是go语言环境vim配置详解的详细内容。
其它类似信息

推荐信息