using-go-in-emacs.org
GO layer
Description
This layer adds extensive support for go.
Features:
- gofmt/goimports on file save
- Auto-completion using go-autocomplete (with the
auto-completion
layer) - Source analysis using go-guru
- Refactoring with godoctor
- Edit struct field tag with gomodifytags
- Linting with flycheck's built-in checkers or flycheck-gometalinter
- Coverage profile visualization
Install
Pre-requisites
You will need gocode
, godef
and godoctor
:
go get -u -v github.com/nsf/gocode
go get -u -v github.com/rogpeppe/godef
go get -u -v golang.org/x/tools/cmd/guru
go get -u -v golang.org/x/tools/cmd/gorename
go get -u -v golang.org/x/tools/cmd/goimports
If you wish to use gometalinter
set the value of go-use-gometalinter
to t:
(go :variables go-use-gometalinter t)
and install the tool:
go get -u -v github.com/alecthomas/gometalinter
gometalinter --install --update
For more information read gometalinter README.md and flycheck-gometalinter README.md
If you wish to use godoctor
for refactoring, install it too:
go get -u -v github.com/godoctor/godoctor
go install github.com/godoctor/godoctor
If you want to use gomodifytags
to edit field tags, install it too:
go get -u -v github.com/fatih/gomodifytags
Make sure that the gocode
executable is in your PATH. For information about
setting up $PATH
, check out the corresponding section in the FAQ (SPC h f
$PATH RET
).
For best results, make sure that the auto-completion
and syntax-checking
layers are enabled as well.
Layer
To use this configuration layer, add it to your ~/.spacemacs
. You will need to
add go
to the existing dotspacemacs-configuration-layers
list in this
file.
Configuration
By default, go buffers are run through gofmt
on save. To use a different
formatter, set the value of gofmt-command
, e.g.
(setq gofmt-command "goimports")
or
(go :variables gofmt-command "goimports")
Indentation
By default, the tab width in Go mode is 8 spaces. To use a different value set
the layer variable go-tab-width
, e.g.
(go :variables go-tab-width 4)
Tests
If you're using gocheck
in your project you can use the
go-use-gocheck-for-testing
variable to enable suite testing and to get single
function testing to work.
go-coverage-display-buffer-func
controls how go-coverage
should display
the coverage buffer. See display-buffer
for a list of possible functions.
The default value is display-buffer-reuse-window
.
Tests are run in a compilation buffer displayed in a popup window that can be
closed by pressing C-g
from any other window. The variable
go-test-buffer-name
can be customized to set the output buffer name.
To provide additional arguments to go test, specify go-use-test-args
.
(go :variables go-use-test-args "-race -timeout 10s"
Guru
Go Oracle has been deprecated as of October 1, 2016, it's replacement is go-guru
.
If you would like to use the goguru
bindings in your work, you will need to
install it, and in your project you will need to set the scope with SPC m f o
.
The scope is a comma separated set of packages, and go
's recursive operator is
supported. In addition, you can prefix with -
to exclude a package from
searching.
In addition, GOPATH
must be set prior to go-guru
initialization.
Autocomplete
gocode
uses the output from installed binary files to provide its suggestions.
You have a few options to ensure you always get up to date suggestions:
- Run
go install ./...
in your package directory when you make a file change. - Run
gocode set autobuild true
to have gocode attempt to rungo install ./...
for you. - You can configure your task runner to run
go install ./...
command on every file change.
Working with Go
Go commands (start with m
):
Key Binding | Description |
---|---|
SPC m e b | go-play buffer |
SPC m e d | download go-play snippet |
SPC m e r | go-play region |
SPC m g a | jump to matching test file or back from test to code file |
SPC m g c | open a clone of the current buffer with a coverage info (go tool cover -h for help) |
SPC m g g | go jump to definition |
SPC m i a | add import |
SPC m i g | goto imports |
SPC m i r | remove unused import |
SPC m h h | godoc at point |
SPC m r n | go rename |
SPC m t p | run "go test" for the current package |
SPC m t P | run "go test" for the current package and all packages under it |
SPC m t s | run "go test" for the suite you're currently in (requires gocheck) |
SPC m t t | run "go test" for the function you're currently in (while you're in a _.test.go file) |
SPC m x x | run "go run" for the current 'main' package |
Go Guru
Key Binding | Description |
---|---|
SPC m f < | go-guru show possible callers |
SPC m f > | go-guru show call targets |
SPC m f c | go-guru show channel sends/receives |
SPC m f d | go-guru describe symbol at point |
SPC m f e | go-guru show possible contants/types for error value |
SPC m f f | go-guru show free variables |
SPC m f i | go-guru show implements relation |
SPC m f j | go-guru jump to symbol definition |
SPC m f o | go-guru set analysis scope |
SPC m f p | go-guru show what the select expression points to |
SPC m f r | go-guru show referrers |
SPC m f s | go-guru show callstack |
Refactoring
Key Binding | Description |
---|---|
SPC m r d | Add comment stubs |
SPC m r e | Extract code as new function |
SPC m r f | Add field tags |
SPC m r F | Remove field tags |
SPC m r n | Rename (with godoctor ) |
SPC m r N | Rename (with go-rename ) |
SPC m r t | Toggle declaration and assignment |