VimでGoする
メディアシステム開発部の北田です。 auスマートパスのサーバサイド開発を担当しております。
担当サービスのQCDと個人的な問題意識から、Go言語の導入に取り組んでいます。 今回は、VimmerがGo言語と向き合う際のtipsについてまとめました。
はじめに
無用な混乱を避けるため、注意事項及び前提条件を設けました。 はじめにお読みください。
ソースコード
本稿で利用するソースコードは、GitHubの公開リポジトリに格納してあります。 断りがない場合、カレントディレクトリは、以下の通りです。
$ pwd
/path/to/mediba-kitada/mbo/2016first/blog_vim-go
省略したこと
- Vim及びGo言語の概要については省略しています。
- 以下のツールを利用しますが、概要については省略します。
サポートする環境
Mac(OS X)オンリーです。以下のバージョンをサポートしています。
- Yosemite
- El Capitan
以下のVimをサポートしています。
ディストリビューション | バージョン | 備考 |
---|---|---|
MacVim | 7.4 | 筆者環境は、luaサポートをonにしてあります |
- 利用するVim pluginは、以下の通りです。
名称 | バージョン | 備考 |
---|---|---|
vim-go | master | - |
以下のGo言語をサポートしています。
- 1.1以上
以下のshellをサポートしています。
- zsh
想定読者
上記を踏まえ本稿の想定読者は、以下の通りです。
- Go言語のチュートリアルをやってみて、何かを見出した
- Go言語と長くお付き合いしたい一般的なVimmer
私です。
導入
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
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
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
ファイル書き込み時に :GoFmt によるフォーマットと、 :GoImports コマンドによるパッケージのインポートが実行されていることがわかります。
テストも実行してみましょう。
$ vi src/animals/elephant.go
" テストの実行
\gt
自動補完
neocompleteをインストール、設定していれば自動補完もかっこ良くなります。
課題
本稿では対応出来ていないvim-goのカスタマイズについて簡単に触れておきます。
Tagbar
- ctagsを適切に設定することで関数の一覧バッファをサイドビューとして表示し、タグジャンプにも利用出来ます。
Neovim対応
- vim-go開発者のfaithさんもNeovimを利用しだしたとのことですが、まだうまく動いておらず、ベータとして提供している様です。
おわりに
Vimmer向けにGo言語開発環境の実践的な内容をまとめてみました。ここでは触れていませんが、ビルドコマンドも提供されており、vim-goさえあればVimmerのGo言語開発は何とかなるのではと見込んでおります。これは、シンプルな規約に沿ってデザインされたGo言語の恩恵のひとつなのかもしれません。
弊社では、バックエンド(サーバサイド)エンジニアを鋭意募集しています。Go言語の他にもモダンな技術の導入には前向きに取り組んでおりますので、腕自慢の方はぜひご応募ください。