在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
一、环境准备: 系统环境说明: 1 [root@docker golang]# cat /etc/redhat-release 2 CentOS Linux release 7.2.1511 (Core) 3 [root@docker golang]# uname -a 4 Linux 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 5 [root@docker golang]# 准备一个go文件,用于观察配置插件过程中的变化: 1 //hellogolang.go 2 package main 3 import "fmt" 4 func main() { 5 fmt.Println("Hello Golang!") 6 } 二、插件配置之路: 1、Vundle.vim: 1 #mkdir ~/.vim/bundle 2 #git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim 配置vimrc:创建~/.vimrc文件(如果你没有这个文件的话),在文件顶部添加有关Vundle.vim的配置: 1 set nocompatible " be iMproved, required 2 filetype off " required 3 4 " set the runtime path to include Vundle and initialize 5 set rtp+=~/.vim/bundle/Vundle.vim 6 call vundle#begin() 7 8 " let Vundle manage Vundle, required 9 Plugin 'gmarik/Vundle.vim' 10 11 " All of your Plugins must be added before the following line 12 call vundle#end() " required 13 filetype 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/
此时,再次编辑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/bin 不过这些代码多在code.google.com上托管,因此由于众所周知的原因,vim-go的自动安装很可能以失败告终,这样就需要你根据上 面日志中提到的各个工具的源码地址逐一去下载并本地安装。无法搭 梯@@子 的,可以通过http://gopm.io 下载相关包。 安装后,$GOBIN下的新增Binaries如下: 安装好这些Binaries后,我们来看看哪些特性被支持了。 再次编辑hellogolang.go: - 新起一行输入fmt.,然后ctrl+x, ctrl+o,Vim 会弹出补齐提示下拉框,不过并非实时跟随的那种补齐,这个补齐是由gocode提供的。 三、其他插件 到目前为止,我们还有若干特性没能实现,重点是: – 实时跟随的代码补齐 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-dev
构建(编译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:
1 " YCM settings 2 let g:ycm_key_list_select_completion = ['', ''] 3 let g:ycm_key_list_previous_completion = [''] 4 let g:ycm_key_invoke_completion = '<C-Space>' 5 6 7 " UltiSnips setting 8 let g:UltiSnipsExpandTrigger="<tab>" 9 let g:UltiSnipsJumpForwardTrigger="<c-b>" 10 let g:UltiSnipsJumpBackwardTrigger="<c-z>" 这样让YCM通过回车和向下的箭头来做list item正向选择,通过向上箭头做反向选择。通过ctrl+space来原地触发补齐提示。
而ultisnips则是用tab做snippet展开,ctrl+b正向切换占位符,ctrl+z反向切换占位符。
3、安装molokai theme
Molokai theme是TextMate的theme的vim port,看着截图挺不错的,于是也安装了一下。
mkdir ~/.vim/colors
四、.vimrc
前面讲到了vim-go有许多命令,在:xx模式下执行多显不便,于是你可以定义一些Mappings,比如:
" set mapleader
" vim-go custom mappings
这样我们在命令模式下,输入<,>+<r>就是运行 当前main包,以此类推。
另外下面这个配置使得我们在save file时既可以格式化代码,又可以自动插入包导入语句(或删除不用的包导入语句)。
" vim-go settings
到这里,我们的Vim Golang开发环境就基本搭建好了。snippet+实时补齐让你Coding如飞! 五、.vimrc文件 1 下面是截至目前为止全量.vimrc文件的内容: 2 3 set nocompatible " be iMproved, required 4 filetype off " required 5 colorscheme molokai 6 7 " set the runtime path to include Vundle and initialize 8 set rtp+=~/.vim/bundle/Vundle.vim 9 call vundle#begin() 10 11 " let Vundle manage Vundle, required 12 Plugin 'gmarik/Vundle.vim' 13 Plugin 'fatih/vim-go' 14 Plugin 'Valloric/YouCompleteMe' 15 16 Plugin 'SirVer/ultisnips' 17 18 " All of your Plugins must be added before the following line 19 call vundle#end() " required 20 filetype plugin indent on " required 21 22 " set mapleader 23 let mapleader = "," 24 25 " vim-go custom mappings 26 au FileType go nmap <Leader>s <Plug>(go-implements) 27 au FileType go nmap <Leader>i <Plug>(go-info) 28 au FileType go nmap <Leader>gd <Plug>(go-doc) 29 au FileType go nmap <Leader>gv <Plug>(go-doc-vertical) 30 au FileType go nmap <leader>r <Plug>(go-run) 31 au FileType go nmap <leader>b <Plug>(go-build) 32 au FileType go nmap <leader>t <Plug>(go-test) 33 au FileType go nmap <leader>c <Plug>(go-coverage) 34 au FileType go nmap <Leader>ds <Plug>(go-def-split) 35 au FileType go nmap <Leader>dv <Plug>(go-def-vertical) 36 au FileType go nmap <Leader>dt <Plug>(go-def-tab) 37 au FileType go nmap <Leader>e <Plug>(go-rename) 38 39 " vim-go settings 40 let g:go_fmt_command = "goimports" 41 42 " YCM settings 43 let g:ycm_key_list_select_completion = ['', ''] 44 let g:ycm_key_list_previous_completion = ['', ''] 45 let g:ycm_key_invoke_completion = '<C-Space>' 46 47 " UltiSnips settings 48 let g:UltiSnipsExpandTrigger="<tab>" 49 let g:UltiSnipsJumpForwardTrigger="<c-b>" 50 let g:UltiSnipsJumpBackwardTrigger="<c-z>"
|
请发表评论