LinuxでGolangの環境を整えるまで
ソースからGolangを入れて、Vimで編集できるようになるまで
参考
http://golang.jp/install/source
http://mattn.kaoriya.net/software/vim/20130531000559.htm
前提
mercurialとgitとbuild essential的なものとVimは事前にインストールされているとする。
ソースからのビルド
hg clone -u release https://code.google.com/p/go
してソースコードをクローンする
cd go/src
./all.bash
すると現在の環境に応じてビルド・テスト・ベンチマークが自動で行われる
環境変数の設定
export GOROOT=$HOME/go
export GOPATH=$HOME/.golang
export PATH=$GOROOT/bin:$PATH
export PATH=$GOPATH/bin:$PATH
こんな感じのことを~/.bash_profileとか~/.profileとかに書いておく
$GOPATHはgo get
で入れたパッケージが保存されるディレクトリ
ココらへんどこに書けばいいのか実は分かっていないし、ついでに環境変数変えた時に一般的にどうするかも分かってないので誰か教えて下しあ。迷ったら再ログインすればいいんだけど
godocを入れる
ドキュメントを読むために入れる
go get code.google.com/p/go.tools/cmd/godoc
エラーが出なければ何事もなくインストールできたってことになる文化らしい。
godoc {package_name}
すると端末上で読める。
godoc -http=:8080
とかするとブラウザーからlocalhost:8080
を開くことで読める
gocodeを入れる
入力補完するためのgocodeを入れる。
go get github.com/nsf/gocode
.vimrcの設定
goのシンタックスファイルの読み込み
set rtp+=$GOROOT/misc/vim
すればよしなにしてくれる。
また、VimにImportとかFmtとかGodocコマンドが増える。
:Import {package_name}
するとカーソル移動無しにインポートしてくれるし
:Fmt
するとgofmtによってソースコードが自動整形される。
:Godoc {package_name}
するとドキュメントが表示される。
ちなパッケージの名前はwildcharで補完できる。Vimだと既定値は<tab>
gocodeを使用した補完
gocodeに付属するsymlinkを作るシェルスクリプトを使ってもいいけれど、今時のvim環境的に.vim内がごちゃごちゃするのは個人的に好かない。ちなシェルスクリプトは$GOPATH/src/github.com/nsf/gocode/vim
内にある。
それか、.vimrcに以下の一文を載せる
exe "set rtp+=".globpath($GOPATH, "src/github.com/nsf/gocode/vim")
これで<c-x><c-o>
でオムニ補完ができるようになる。
neocomplechacheやらneocompleteやらを使う人は
if !exists('g:neocomplete#sources#omni#input_patterns')
let g:neocomplete#sources#omni#input_patterns = {}
endif
let g:neocomplete#sources#omni#input_patterns.go = '[^.[:digit:] *\t]\.\w*'
とか
if !exists('g:neocomplete#sources#omni#input_patterns')
let g:neocomplete#sources#omni#input_patterns = {}
endif
let g:neocomplete#sources#omni#input_patterns.go = '[^.[:digit:] *\t]\.\w*'
する感じ?
設定例
ネオコンの設定を除いた今使ってる設定がこれ
" golang
set rtp+=$GOROOT/misc/vim
exe "set rtp+=".globpath($GOPATH, "src/github.com/nsf/gocode/vim")
auto BufWritePre *.go Fmt
autocmd FileType go nnoremap <buffer> <F5> :call <SID>compileGo()<CR>
autocmd FileType go nnoremap <buffer> <F6> :call <SID>runGo()<CR>
autocmd FileType go nnoremap <buffer> <F7> :call <SID>runGoToFile()<CR>
function! s:compileGo()
:w
exe ':lcd %:p:h'
exe ":!go build %"
endfunction
function! s:runGo()
exe ':!./%:r'
endfunction
function! s:runGoToFile()
exe ":!%:r > %.data"
endfunction