SublimeText3でのGo言語開発環境セットアップ


SublimeText好きとしては、Go開発環境もSublimeにしたい。

# 前提環境
他の環境で動かなかったらゴメンナサイ。

* Mac Yosemite
* go version go1.4.2 darwin/amd64 (`brew install go`)

# SublimeText3インストール ＆ Go基本設定
そろそろSublimeText3も安定していると思います。


また、Goの基本的なインストールは済んでいるものとします。
※Goのインストール、GOPATH, GOROOTの設定 など。他の記事などをご参考に！！

# Go開発環境のためのsublime text3 package

## [GoSublime](https://packagecontrol.io/packages/GoSublime)

SublimeでGoをやるといったらまずこの総合パッケージを入れます

* Go言語シンタックス
* 各種Go関連コマンド（`gofmt`, `goimports`）との連携
* パッケージインポートの補助（`command + . -> command + p`)
* 他、色々。（`command + . -> command + .`でメニューがでてきます）

### goimports
設定をする際に`goimports`[^1]を入れておきましょう。

[^1]: `goimports` とは `gofmt`にpackageのインポート・アンインポートをつけた拡張コマンドです。

```bash
$ go get golang.org/x/tools/cmd/goimports
```

### 設定ファイル
`メニュー -> Sublime Text -> Preference -> Package Settings -> GoSublime -> Settings - User`
または`command + . -> command + 5`でも開きます。

GOPATHは自分の環境のGOPATHに合わせてください。

```json:GoSublime.sublime-settings
{
    "env": {
        "GOPATH": "/path/to/gopath",
        "PATH": "$GOPATH/bin:$PATH"
    },
    "shell": ["/bin/bash", "--login", "-c", "$CMD"],
    "fmt_cmd": ["goimports"],
    "comp_lint_enabled": false,
}
```

※もしかすると、shell, GOPATH, PATHは設定不要かもしれません（未検証）。
設定値は自分の環境に合わせてください。

## [Godef](https://packagecontrol.io/packages/Godef)

* GoSublime に存在する `GoToDefinition` は `GsDoc: no docs found` と表示されてマトモに動かない（僕の設定の仕方が悪いだけかもしれない・・）
* Packageの`Go To Definition` は、実は同じ関数名をリストアップしているだけ。自分で定義元を選ばなくてはならない

こんな状況ではIDEに匹敵する定義ジャンプとはいえないので、`Godef`を導入します。

### godefの導入

```bash
$ go get -v github.com/rogpeppe/godef
```

### 設定ファイル
`メニュー -> Sublime Text -> Preference -> Package Settings -> GoSublime -> Settings - User`
GOPATHは自分の環境のGOPATHに合わせてください。(~ とか $HOME は使えないので要注意です。）

```json:Godef.sublime-settings
{
    "gopath": "/path/to/gopath/"
}
```

※プラグインの説明書きをみると、設定しなくても環境変数のGOPATH見に行くぜ！って書いてあるので、敢えて設定する必要がないかもしれません。

### キーバインドの修正
`command + d` をGodefへ割り当てるという暴挙にでてきますので、キーバインドを直しましょう。
`メニュー -> Sublime Text -> Preference -> Key Binds - User`

以下を追加

```json:Default(OSX).sublime-keymap
    { "keys": ["super+d"], "command": "find_under_expand" },
    { "keys": ["ctrl+d"], "command": "godef" },
```

ちなみにコレを追加しておくと、JumpBackもしてくれるそうです。
ショートカットキーの重複を確認しておくといいです[^3]

[^2]: Macで`super`と表現されているものは`command`キーのことです。
[^3]: [Keymaps](https://packagecontrol.io/packages/Keymaps) で、キーバインドのチートシートが作れます。このプラグインは変数のキャメル・スネークケースの変換などが入っていてオススメです。

```json:Default(OSX).sublime-keymap
  { "keys": ["ctrl+j"], "command": "jump_forward"},
  { "keys": ["ctrl+k"], "command": "jump_back"},
```

### 使用方法

ジャンプしたい関数にカーソルを合わせて、`ctrl + d` で定義ジャンプします。

## [SublimeLinter](https://packagecontrol.io/packages/SublimeLinter)
Sublimeで各言語のLinterを動かすベースとなるプログラムです。

### 設定ファイル
`メニュー -> Sublime Text -> Preference -> Package Settings -> SublimeLinter -> Settings - User`

```json:SublimeLinter.sublime-settings
{
    "user": {
        "debug": false,
        "delay": 0.25,
        "error_color": "D02000",
        "gutter_theme": "Packages/SublimeLinter/gutter-themes/Default/Default.gutter-theme",
        "gutter_theme_excludes": [],
        "lint_mode": "load/save",
        "linters": {
            "golint": {
                "@disable": false,
                "args": [],
                "excludes": []
            },
            "gotype": {
                "@disable": false,
                "args": [],
                "excludes": []
            }
        },
        "mark_style": "solid underline",
        "no_column_highlights_line": false,
        "passive_warnings": false,
        "paths": {
            "linux": [],
            "osx": [
                "/path/to/gopath/bin/"
            ],
            "windows": []
        },
        "python_paths": {
            "linux": [],
            "osx": [],
            "windows": []
        },
        "rc_search_limit": 3,
        "shell_timeout": 10,
        "show_errors_on_save": true,
        "show_marks_in_minimap": true,
        "syntax_map": {
            "html (django)": "html",
            "html (rails)": "html",
            "html 5": "html",
            "php": "html",
            "python django": "python"
        },
        "warning_color": "DDB700",
        "wrap_find": true
    }
}
```


色々書いてありますが、見るべき箇所は数点です

### paths
`"paths": {"osx": ["/path/to/gopath/bin/"]` には、`$GOPATH/bin/`を指定します。
設定しないとLinterが動きません。
フルパスで書いておきます。

### lintの表現

* `lint_mode`: いつLinterを動かすか
* `mark_style`: Lintのエラーをエディタ上でどう表現するか
* `show_errors_on_save`: 保存時にLintのエラーを表示するか（`True`が本当にオススメです）

この３設定は、`メニュー -> Tools -> SublimeLinter` からも設定すると、設定値一覧がでてくるので便利です。


## [SublimeLinter-contrib-golint](https://packagecontrol.io/packages/SublimeLinter-contrib-golint)

goのlinterをまず導入します

```bash
$ go get -u github.com/golang/lint/golint
```

packageをインストールします。

SublimeText3を再起動してください。
コメントのないパブリック関数の`func`にオレンジのアンダーバーがあれば成功です。

![kobito.1431054640.413542.png](https://qiita-image-store.s3.amazonaws.com/2295/4239/50e1a96f-acd4-214e-afd0-443acc913a2a.png "kobito.1431054640.413542.png")


## [GoToTest](https://packagecontrol.io/packages/GoToTest)
`Command + Shift + .` で、プログラムファイル、テストファイルと交互に遷移します。
※プログラムファイル hoge.go に対して、テストファイル hoge_test.go が存在する場合のみ

## [Go Toggle Declare](https://packagecontrol.io/packages/Go%20Toggle%20Declare)

このプラグインを入れると、`shift + tab` でカーソル行の `:=` を `=` へtoggleしてくれます。
暴力的なショートカットかと思いきや、実は`gofmt`, `goimports`のおかげで、Goの開発ではtabやuntabを使いません。

# 最後に
これでうまく動かない場合はぜひコメ欄で教えて下さい。さらの状態のMacでトライしておりませんで。。