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