spacemacs/layers/+lang/go/README.org

166 lines
7.1 KiB
Org Mode
Raw Normal View History

#+TITLE: GO layer
2015-06-10 16:44:30 +00:00
[[file:img/go.png]]
2016-03-31 02:59:55 +00:00
* Table of Contents :TOC_4_gh:noexport:
- [[#description][Description]]
- [[#features][Features:]]
- [[#install][Install]]
- [[#pre-requisites][Pre-requisites]]
- [[#layer][Layer]]
- [[#configuration][Configuration]]
2016-03-30 02:42:45 +00:00
- [[#indentation][Indentation]]
- [[#tests][Tests]]
2016-10-03 04:20:52 +00:00
- [[#guru][Guru]]
- [[#autocomplete][Autocomplete]]
2016-03-31 02:59:55 +00:00
- [[#working-with-go][Working with Go]]
- [[#go-commands-start-with-m][Go commands (start with =m=):]]
- [[#go-guru][Go Guru]]
2015-06-10 16:44:30 +00:00
* Description
This layer adds extensive support for go.
** Features:
- gofmt/goimports on file save
- Auto-completion using [[https://github.com/nsf/gocode/tree/master/emacs][go-autocomplete]] (with the =auto-completion= layer)
- Source analysis using [[https://godoc.org/golang.org/x/tools/cmd/guru][go-guru]]
2016-04-11 14:08:56 +00:00
- Linting with flycheck's built-in checkers or flycheck-gometalinter
- Coverage profile visualization
2015-06-10 16:44:30 +00:00
* Install
** Pre-requisites
You will need =gocode= and =godef=:
2015-06-10 16:44:30 +00:00
#+BEGIN_SRC sh
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
2015-12-03 21:17:34 +00:00
go get -u -v golang.org/x/tools/cmd/gorename
go get -u -v github.com/golang/tools/cmd/goimports
2015-06-10 16:44:30 +00:00
#+END_SRC
If you wish to use =gometalinter= set the value of =go-use-gometalinter= to t:
2016-05-04 05:25:19 +00:00
#+begin_src emacs-lisp
(go :variables go-use-gometalinter t)
#+end_src
2016-05-05 10:47:04 +00:00
and install the tool:
2016-04-11 14:08:56 +00:00
#+BEGIN_SRC sh
go get -u -v github.com/alecthomas/gometalinter
gometalinter --install --update
#+END_SRC
For more information read [[https://github.com/alecthomas/gometalinter/blob/master/README.md][gometalinter README.md]]
and [[https://github.com/favadi/flycheck-gometalinter/blob/master/README.md][flycheck-gometalinter README.md]]
2015-10-27 10:59:05 +00:00
Make sure that =gocode= executable is in your PATH. For information about
2017-03-15 03:32:39 +00:00
setting up =$PATH=, check out the corresponding section in the FAQ (~SPC h f
2015-10-29 12:41:05 +00:00
$PATH RET~).
2015-06-10 16:44:30 +00:00
For best results, make sure that the =auto-completion= and =syntax-checking=
layers are enabled as well.
2015-06-10 16:44:30 +00:00
** 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.
2015-06-10 16:44:30 +00:00
* Configuration
By default, go buffers are run through =gofmt= on save. To use a different
formatter, set the value of =gofmt-command=, e.g.
#+begin_src emacs-lisp
(setq gofmt-command "goimports")
#+end_src
or
#+begin_src emacs-lisp
(go :variables gofmt-command "goimports")
#+end_src
2016-03-30 02:42:45 +00:00
** Indentation
2016-04-05 10:22:32 +00:00
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.
2016-03-30 02:42:45 +00:00
#+begin_src emacs-lisp
(go :variables go-tab-width 4)
#+end_src
** 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.
2015-06-10 16:44:30 +00:00
=go-coverage-display-buffer-func= controls how =go-coverage= should display
the coverage buffer. See [[https://www.gnu.org/software/emacs/manual/html_node/elisp/Choosing-Window.html][=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.
2016-10-03 04:20:52 +00:00
** 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 run =go install
./...= for you.
- You can configure your task runner to run =go install ./...= command on every
file change.
* Working with Go
2015-06-10 16:44:30 +00:00
** Go commands (start with =m=):
| Key Binding | Description |
|-------------+---------------------------------------------------------------------------------------|
| ~SPC m h h~ | godoc at point |
| ~SPC m i g~ | goto imports |
| ~SPC m i a~ | add import |
| ~SPC m i r~ | remove unused import |
| ~SPC m e b~ | go-play buffer |
| ~SPC m e r~ | go-play region |
| ~SPC m e d~ | download go-play snippet |
| ~SPC m x x~ | run "go run" for the current 'main' package |
| ~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 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 t~ | run "go test" for the function you're currently in (while you're in a _.test.go file) |
| ~SPC m t s~ | run "go test" for the suite you're currently in (requires gocheck) |
2015-06-10 16:44:30 +00:00
** Go Guru
| Key Binding | Description |
|-------------+------------------------------------------------------|
| ~SPC m f d~ | go-guru describe symbol at point |
| ~SPC m f f~ | go-guru show free variables |
| ~SPC m f i~ | go-guru show implements relation |
| ~SPC m f c~ | go-guru show channel sends/receives |
| ~SPC m f r~ | go-guru show referrers |
| ~SPC m f j~ | go-guru jump to symbol definition |
| ~SPC m f p~ | go-guru show what the select expression points to |
| ~SPC m f s~ | go-guru show callstack |
| ~SPC m f e~ | go-guru show possible contants/types for error value |
| ~SPC m f <~ | go-guru show possible callers |
| ~SPC m f >~ | go-guru show call targets |
| ~SPC m f o~ | go-guru set analysis scope |