Vim for Golang
Developping with Go is easy, a simple text editor and you’re ready to work. But it’s very confortable to have syntax highlight, checker and outline view. There are lot of possible configurations for a lot of editors. My preference is Vim + some plugins. Let me show you how I configured my “Go vim IDE”
At first, be sure you’ve installed a recent Go implementation. My configuration works with Go version > 1.x.
I’m working on Fedora (18) with a vim version 7.3.
What we will do:
- install pathogen (or Vundle)
- install syntastic
- install gocode
- install tagbar + configuration
- install nerdtree (optional)
Pathogen
Pathogen is like Vundle, it allows you to install plugins inside a deported directory that is easier to manage. To install pathogen:
mkdir -p ~/.vim/autoload ~/.vim/bundle; \
curl -Sso ~/.vim/autoload/pathogen.vim \
https://raw.github.com/tpope/vim-pathogen/master/autoload/pathogen.vim
Then, in your ~/.vimrc, append this line before any “filetype” directive or “syntax”:
execute pathogen#infect()
You’ll see my own vimrc plugin at the end of post.
Ok, you’re done, now to install plugins, you just have to put it in ~/.vim/bundle - this is what we will do.
Syntastic
I will be honest, I don’t know if syntastic is required, but if you develop with other langages (as Python, C, Java…) with vim, you will love this plugin.
Syntastic is a vim plugin that is very powerfull. It will show you errors and warnings for a large variety of langage when you save your vim buffer. TO install this plugin, now you’ve got pathogen installed, is easy:
cd ~/.vim/bundle
git clone https://github.com/scrooloose/syntastic.git
That’s all
Vim for go
Before installing Gocode, let’s install the given vim configuration from your Go installation.
Be sure that your environment variable contains somthing:
$ echo $GOROOT
/home/patachou/src/go
Then type:
ln -s $GOROOT/misc/vim ~/.vim/bundle/go-vim
That link configuration to the “bundle” directory for vim.
Now, the entire vim configuration is ready to use (thanks again to pathogen)
Gocode
Now, let’s install the Go part. Gocode is a “service” that will be connected to your vim instance. It will add lot of very interessing functionnalities as:
- code check
- code completion
In your terminal, execute this:
go get -u github.com/nsf/gocode
This add the “gocode” command. Vim will use if needed. The deamon will start at time.
Some vim configuration
We will need some additional vim configuration. Open your ~/.vimrc and append:
set omnifunc=syntaxcomplete#Complete
This activate “omnifunc” for the whole possible languages that implement completion.
So to conclude, this is my (cleaned for the article) vimrc file:
execute pathogen#infect()
set modeline
set number
syntax on
set omnifunc=syntaxcomplete#Complete
set mouse=a
set autoindent
set ts=4 sts=4 sw=4 expandtab
filetype plugin indent on " required!
filetype plugin on
With this lines, I’ve got:
- pathogen that checks my ~/.vim/bundle directory
- modeline that can read some “vim directives in comments” (optionnal)
- line number
- syntax is on
- completion ok
- mouse that can be used to navigate in NerdTree, and Tagbar (after the test, be patient ;) )
- indentation auto
- tab makes 4 spaces
- plugin for indentation + autocommand (required by gocode)
Ok, make a test now
Testing installation
Before to try, keep the shortcuts in mind: CTRL+x - o ==> autocompletion from “omnifunc”
Now, go to a temporary directory, for example /tmp and make a test directory:
cd /tmp; mkdir testgo; cd testgo
And try:
vim main.go
You will have vim opened, append this lines:
package main
import "fmt"
func main() {
// place your cursor after the "."
fmt.
}
After dot (.) press “CTRL+x” then “o”, and you will see a menu that lets you choose the method to use.
This works with any variables, package, builtins…
Append 2 plugins that will change your life
There are 2 plugins that can be very cool to use: Nerdtree and tagbar.
Nerdtree is a directory viewer that shows you your project directory. There are a lot of options, but you can use “as is”. NERDTree is made by the same author that syntastic.
Let’s install:
cd ~/.vim/bundle
git clone https://github.com/scrooloose/nerdtree.git
Now install the second plugin, tagbar that is an outline viewer that works with a lot of languages (excpeting go… buuuuuuut):
cd ~/.vim/bundle
git clone git://github.com/majutsushi/tagbar
To let tagbar useable with Go, we need to install “gotags” and append a vim configuration…:
go get -u github.com/jstemmer/gotags
And append this to the file ~/.vim/ftplugin/go.vim (theorically, gocode has created this file and append a omnifunc method on top, don’t remove this line, append this after):
" 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'
\ }
Right ok !
Test tagbar and NERDTree
You can do:
- type :NERDTree in vim
- open vim with +NERDTree argument
To open Tagbar, type :TagbarOpen
This is what I’ve got:

One shot
Let’s resume what we’ve made:
mkdir -p ~/.vim/autoload ~/.vim/bundle; \
curl -Sso ~/.vim/autoload/pathogen.vim \
https://raw.github.com/tpope/vim-pathogen/master/autoload/pathogen.vim
ln -s $GOROOT/misc/vim ~/.vim/bundle/go-vim
cd ~/.vim/bundle
git clone https://github.com/scrooloose/syntastic.git
git clone https://github.com/scrooloose/nerdtree.git
git clone git://github.com/majutsushi/tagbar
go get -u github.com/nsf/gocode
go get -u github.com/jstemmer/gotags
In ~/.vimrc:
execute pathogen#infect()
set modeline
set number
syntax on
set omnifunc=syntaxcomplete#Complete
set mouse=a
set autoindent
set ts=4 sts=4 sw=4 expandtab
filetype plugin indent on " required!
filetype plugin on
Open one time a gocode, use completion, that creates ~/.vim/ftplugin/go.vim
Then append to ~/.vim/ftplugin/go.vim:
" 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'
\ }
That’s all folks