vim 配置golang环境

1.写在前面

由于最近工作中使用golang开发比较多,而大部分工作都是使用vim完成,在配置vim的golang环境时,发现已经有很多配置的解决方案,vim有很多插件支持golang开发环境,对我而言,配置以下四个插件就够用了:

其中:

  • vim-go是针对go语言的vim插件。支持代码格式化、语法检查、语法高亮、调试等非常多的功能。
  • tagbar用于方便查看代码结构。
  • nerdtree用于管理和查看代码目录结构。
  • YouCompleteMe用于代码自动补全。

先来看一下整体效果吧:



左边是代码目录树,中间是代码编辑区域,右边是代码类结构等信息,底部是状态栏。

2.依赖环境

2.1 安装go环境

参考go官网,按步骤安装,配置好GOROOTGOPATH环境变更即可,配置go的vim IDE环境需要依赖vim和vim-go插件。

vim-go插件需要vim使用8.0以上的版本,而YouCompleteMe需要python2.7.1+或3.5.1+。如果你系统的vim和python版本满足条件,可以忽略下面两个步骤。

2.2. 安装vim8.0+

推荐使用源码方式安装,先从github上下载vim源代码:

git clone https://github.com/vim/vim.git

src/INSTALL安装文档中有针对各个系统的安装步骤,依照步骤安装就好,需要注意的是:由于YouCompleteMe需要vim有python支持,python版本需要2.7.1+或3.5.1+。可以先查看你的vim是否已经支持python:

>vim --version | grep python
+cmdline_hist      +langmap          -python            +visual
+cmdline_info      +libcall          -python3           +visualextra

-号表示不支持,重新编译在./configure的时候加上--enable-pythoninterp=yes参数就行,如果是python3,则加上--enable-python3interp=yes

2.3. 安装python2.7.1+

# Python2.7.1:
wget http://python.org/ftp/python/2.7.14/Python-2.7.14.tar.xz
tar xf Python-2.7.14.tar.xz
cd Python-2.7.14
./configure --prefix=/usr/local/python27 --enable-unicode=ucs4 --enable-shared 
make && make install

需要注意的是:

  • make install需要管理员权限进行安装
  • 编译python的时候加上--enable-unicode和--enable-shared,主要是vim打开python支持后需要python动态库支持,并且unicode需要支持ucs4。

3.环境搭建

3.1.vim基本础配置

参考vim无插件配置

3.2.vim插件安装

我使用Vundle管理vim插件。插件安装比较简单,先打开~/.vimrc,进行需要的插件配置,在配置前建议阅读Vundle的README.md。安装比较简单,如下:

  1. clone vundle.vim.git
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

2.配置插件

set nocompatible              " be iMproved, required
filetype off                  " required

" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()

" let Vundle manage Vundle, required
Plugin 'VundleVim/Vundle.vim'

Plugin 'fatih/vim-go'

Plugin 'majutsushi/tagbar'

Plugin 'scrooloose/nerdtree'

Plugin 'Valloric/YouCompleteMe'

" All of your Plugins must be added before the following line
call vundle#end()            " required
filetype plugin indent on    " required

配置完后,在vim命令模式下执行:

:PluginInstall

插件会自动下载安装,看见上面显示 Finishing ... Done 的内容,插件安装成功。

3.3安装vim-go

安装完vim-go插件后,vim-go本身依赖一些包,在vim命令模块下执行:

:GoInstallBinaries

在安装过程中,不出意外,你会遇到安装失败的情况,请在下面遇到的问题中找解决方案。

3.4.编译YouCompleteMe

安装完YouCompleteMe后,还需要单独编译才能运行YouaCompleteMe:

cd ~/.vim/plugged/YouCompleteMe
sh install.py --go-completer 

YouCompleteMe支持多语言,其它语言支持请参考YouCompleteMe源代码目录下的README.md文件。

3.5.插件的配置

我对NERDTree、YouCompleteMe以及tagbar的配置比较简单,需要更多配置请参考各个插件的README.md

3.5.1 vim-go插件

let g:go_fmt_command = "goimports" " 格式化将默认的 gofmt 替换
let g:go_autodetect_gopath = 1
let g:go_list_type = "quickfix"
let g:go_version_warning = 1
let g:go_highlight_types = 1
let g:go_highlight_fields = 1
let g:go_highlight_functions = 1
let g:go_highlight_function_calls = 1
let g:go_highlight_operators = 1
let g:go_highlight_extra_types = 1
let g:go_highlight_methods = 1
let g:go_highlight_generate_tags = 1
let g:godef_split=2

3.5.2 NERDTree插件

" 打开和关闭NERDTree快捷键
map <F10> :NERDTreeToggle<CR>
" 设置宽度
" let NERDTreeWinSize=25

3.5.3 tagbar插件

nmap <F9> :TagbarToggle<CR>
let g:tagbar_width=25
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'
\ }

4.遇到的问题

4.1.vim-go执行:GoInstallBinaries失败

表现为:

vim-go: guru not found. Installing golang.org/x/tools/cmd/guru to folder /home/xxx/repos/gopath/bin/
vim-go: Error downloading golang.org/x/tools/cmd/guru: Fetching https://golang.org/x/tools/cmd/guru?go-get=1
vim-go: https fetch failed: Get https://golang.org/x/tools/cmd/guru?go-get=1: dial tcp 216.239.37.1:443: i/o timeout
vim-go: package golang.org/x/tools/cmd/guru: unrecognized import path "golang.org/x/tools/cmd/guru" (https fetch: Get https://gola
ng.org/x/tools/cmd/guru?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)
vim-go: Error installing golang.org/x/tools/cmd/guru: can't load package: package golang.org/x/tools/cmd/guru: cannot find package "golang.org/x/tools/cmd/guru"

原因是在执行:GoInstallBinaries执行时会使用go get 安装依赖包(依赖包在~/.vim/bundle/vim-go/plugin/go.vim中可以看到),由于国内无法访问https://golang.org,故会出现io timeout的情况,好在google已经将这些代码上传至github上。直接clone在本地再安装即可,以安装guru为例:

# 先在$GOPATH目录下本地建立golang.org\x
mkdir -p %GOPATH%/src/golang.org/x

# 将tools代码库clone到本地
git clone https://github.com/golang/tools.git %GOPATH%/src/golang.org/x/tools

# 安装guru
go install golang.org/x/tools/cmd/guru

# 安装成功后就可以在$GOPATH/bin 目录下看到guru的二进制文件了

安装其它依赖包方法同上,不再累赘。

4.2.YouCompleteMe安装后不可用

安装完YouaCompleteMe插件后,打开vim提示:

YouCompleteMe unavailable: requires Vim compiled with Python (2.7.1+ or 3.5.1+) support

原因是YouCompleteMe需要vim支持python,在编译vim的时候指定--enable-pythoninterp=yes即可,如果是python3,则指定--enable-python3interp=yes

4.3.vim加载libpython2.7.so.1.0动态库失败

表现为:

/usr/local/bin/vim: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory

当vim开启python支持后,需要依赖python共享库,使用ldd命令可以查看vim依赖的动态库:

> ldd /usr/local/bin/vim

发现的确没有找到libpython2.7.so.1.0。原因是在源码编译python的时候没有指定--enable-shared导致,重新编译python即可。由于python源码安装时,默认安装到/usr/local/python27下,如果仍然没有找到,可以将/usr/local/python27/lib下生成的libpython2.7.so.1.0库拷贝到/usr/lib64/下(64位环境),也可以在/etc/ld.so.conf指定动态库加载目录。

4.4.undefined symbol pyunicodeucs4_asencodedstring

原因是源码编译python的时候没有开启asencodedstring支持,在编译python的时候加上以下参数就行:

./configure --prefix=/usr/local/python27 --enable-shared 

5.更多参考

1.https://learnku.com/articles/24924
2.https://github.com/fatih/vim-go
3.https://github.com/VundleVim/Vundle.vim/blob/master/CONTRIBUTING.md
4.https://github.com/majutsushi/tagbar
5.https://github.com/ycm-core/YouCompleteMe
6.https://github.com/vim/vim
7.https://ephrain.net/python-出現-undefined-symbol-pyunicodeucs4_asencodedstring-錯誤/
8.https://github.com/scrooloose/nerdtree
9.https://danieleriksson.net/2017/02/08/how-to-install-latest-python-on-centos/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267