VimでGoする

メディアシステム開発部の北田です。 auスマートパスのサーバサイド開発を担当しております。

担当サービスのQCDと個人的な問題意識から、Go言語の導入に取り組んでいます。 今回は、VimmerがGo言語と向き合う際のtipsについてまとめました。

はじめに

無用な混乱を避けるため、注意事項及び前提条件を設けました。 はじめにお読みください。

ソースコード

本稿で利用するソースコードは、GitHubの公開リポジトリに格納してあります。 断りがない場合、カレントディレクトリは、以下の通りです。

$ pwd
/path/to/mediba-kitada/mbo/2016first/blog_vim-go

省略したこと

サポートする環境

  • Mac(OS X)オンリーです。以下のバージョンをサポートしています。

    • Yosemite
    • El Capitan
  • 以下のVimをサポートしています。

ディストリビューションバージョン備考
MacVim7.4筆者環境は、luaサポートをonにしてあります
  • 利用するVim pluginは、以下の通りです。
名称バージョン備考
vim-gomaster-
  • 以下のGo言語をサポートしています。

    • 1.1以上
  • 以下のshellをサポートしています。

    • zsh

想定読者

上記を踏まえ本稿の想定読者は、以下の通りです。

私です。

導入

vim-goをインストールしていきます。
vim-goは、Go言語向けVim pluginで他のpluginに比べ圧倒的な支持を得ています。 neobundleを用いて以下の様に導入していきましょう。

$ vi ~/.vimrc  

" golang  
NeoBundle 'fatih/vim-go'  

" コマンドモードで.vimrcをリロード  
:source $MYVIMRC  

" コマンドモードでNeoBundleInstall  
:NeoBundleInstall  

試運転をしてみましょう。
フォーマットが出鱈目なエントリーポイントを用意し、セーブしてみます。

# フォーマットが出鱈目なエントリーポイントを開く  
$ vi src/main/main.go  

" コマンドモードでGoFmt  
:GoFmt  

GoFmt

vim-goの :GoFmt コマンドでフォーマットされていることがわかります。

カスタマイズ

ツール群のインストール

vim-goは、 :GoInstallBinaries コマンドを用いてGo言語での開発に便利なツール群をインストールしてくれます。プロジェクトで開発するパッケージとvim-goで利用するパッケージの混同(同一ディレクトリに配置される)を避けるため、shellで環境変数GOPATHを利用して、インストールしていきましょう。

# 共有のGo言語環境の各ディレクトリを作成  
$ mkdir -p {$HOME/go,$HOME/go/bin,$HOME/go/pkg,$HOME/go/src}  

# shellの設定ファイルにGOPATHを設定  
$ vi $HOME/.zshrc  

# 共通のGo言語環境変数とそのパス  
export $GOPATH="$HOME/go"  
# ツール群のバイナリファイルが格納される  
export $GOBIN="$GOPATH/gin"  

# shellの設定を更新  
$ source $HOME/.zshrc  

Vimを起動し、 :GoInstallBinaries コマンドでツール群をshellの設定ファイルで指定したパスにインストールします。

# プロジェクトのルートディレクトリ(.envrcが格納されているディレクトリ)から離れる  
$ cd $HOME  
# Vimを起動しコマンドモードで GoInstallBinaries を実行  
$ vi  

:GoInstallBinaries  

# ツール群が共通のGo言語環境のパスにインストールされていることを確認する  
$ tree $GOPATH/bin  
/Users/mediba-kitada/go/bin  
├── asmfmt  
├── errcheck  
├── gocode  
├── gogetdoc  
├── goimports  
├── golint  
├── gometalinter  
├── gorename  
├── gotags  
├── guru  
└── motion  

ツール群の試運転をしてみましょう。animalsパッケージのmonkey.goを修正します。

$ vi src/animals/monkey.go  

" コマンドモードでGoImports  
:GoImports  

GoImports

vim-goの :GoImports コマンドでfmtパッケージがインポートされていることがわかります。

vim-goの設定

デフォルトではシンタックスハイライトがオフになっていますので、設定ファイルを用いて設定をカスタマイズしていきましょう。 :GoFmt コマンドを実行した際の挙動もカスタマイズしてみます。

$ vi $HOME/.vimrc  
" vim-go  
"" mapping  
""" go runのキーマッピング  
au FileType go nmap gr (go-run)  
""" go testのキーマッピング  
au FileType go nmap gt (go-test)  
"" highlight  
let g:go_hightlight_functions = 1  
let g:go_hightlight_methods = 1  
let g:go_hightlight_structs = 1  
let g:go_hightlight_interfaces = 1  
let g:go_hightlight_operators = 1  
let g:go_hightlight_build_constraints = 1  
"" GoFmt時にインポートするパッケージを整理(GoFmtはファイル書き込み時に自動的に実行される)  
let g:go_fmt_command = "goimports"  

試運転をしてみましょう。先ほどと同様にanimalsパッケージのmonkey.goを修正します。

$ vi src/animals/monkey.go  

" バッファの内容をファイルに書込  
:w  

write

ファイル書き込み時に :GoFmt によるフォーマットと、 :GoImports コマンドによるパッケージのインポートが実行されていることがわかります。

テストも実行してみましょう。

$ vi src/animals/elephant.go  

" テストの実行  
\gt  

go test

自動補完

neocompleteをインストール、設定していれば自動補完もかっこ良くなります。

https://gyazo.com/659531f90a07c84c1c42c28492de63f9

課題

本稿では対応出来ていないvim-goのカスタマイズについて簡単に触れておきます。

Tagbar

  • ctagsを適切に設定することで関数の一覧バッファをサイドビューとして表示し、タグジャンプにも利用出来ます。

Neovim対応

おわりに

Vimmer向けにGo言語開発環境の実践的な内容をまとめてみました。ここでは触れていませんが、ビルドコマンドも提供されており、vim-goさえあればVimmerのGo言語開発は何とかなるのではと見込んでおります。これは、シンプルな規約に沿ってデザインされたGo言語の恩恵のひとつなのかもしれません。
弊社では、バックエンド(サーバサイド)エンジニアを鋭意募集しています。Go言語の他にもモダンな技術の導入には前向きに取り組んでおりますので、腕自慢の方はぜひご応募ください。