2015-12-02 14:23:39 +00:00
#+TITLE : GO layer
2015-06-10 16:44:30 +00:00
2019-05-07 08:53:56 +00:00
#+TAGS : general|layer|multi-paradigm|programming
2019-05-05 17:26:40 +00:00
2015-06-10 16:44:30 +00:00
[[file:img/go.png ]]
2019-05-07 20:05:06 +00:00
* Table of Contents :TOC_5_gh:noexport:
2017-05-22 14:16:12 +00:00
- [[#description ][Description ]]
- [[#features ][Features: ]]
- [[#install ][Install ]]
- [[#pre-requisites ][Pre-requisites ]]
2018-06-11 22:05:13 +00:00
- [[#lsp-backend ][LSP backend ]]
2017-05-22 14:16:12 +00:00
- [[#layer ][Layer ]]
- [[#configuration ][Configuration ]]
- [[#indentation ][Indentation ]]
- [[#tests ][Tests ]]
- [[#guru ][Guru ]]
- [[#autocomplete ][Autocomplete ]]
- [[#working-with-go ][Working with Go ]]
- [[#go-commands-start-with-m ][Go commands (start with =m=): ]]
- [[#go-guru ][Go Guru ]]
2017-05-25 11:19:50 +00:00
- [[#refactoring ][Refactoring ]]
2015-06-10 16:44:30 +00:00
* Description
2018-02-14 22:18:09 +00:00
This layer adds extensive support for go to Spacemacs.
2015-06-10 16:44:30 +00:00
2015-06-10 21:16:01 +00:00
** Features:
2018-07-26 23:05:02 +00:00
- gofmt/goimports on file save (to enable, see [[#configuration ][Configuration ]])
2015-09-30 09:37:59 +00:00
- Auto-completion using [[https://github.com/nsf/gocode/tree/master/emacs ][go-autocomplete ]] (with the =auto-completion= layer)
2017-04-26 13:50:19 +00:00
- Source analysis using [[https://docs.google.com/document/d/1_Y9xCEMj5S-7rv2ooHpZNH15JgRT5iM742gJkw5LtmQ ][go-guru ]]
2017-05-25 11:19:50 +00:00
- Refactoring with [[http://gorefactor.org/ ][godoctor ]]
2017-12-05 14:48:29 +00:00
- Edit struct field tag with [[https://github.com/fatih/gomodifytags ][gomodifytags ]]
2019-05-26 20:58:52 +00:00
- Linting with flycheck's built-in checkers or flycheck-gometalinter
2016-03-04 13:10:05 +00:00
- Coverage profile visualization
2018-03-29 09:51:31 +00:00
- Test generation with [[https://github.com/s-kostyaev/go-gen-test ][go-gen-test ]]
2018-06-09 04:49:07 +00:00
- Get packages faster with [[https://github.com/haya14busa/gopkgs ][gopkgs ]]
2018-06-09 04:58:50 +00:00
- Fill a structure with default values using the [[https://github.com/davidrjenni/reftools/tree/master/cmd/fillstruct ][fillstruct ]]
2018-06-11 22:05:13 +00:00
- LSP backend
2015-06-10 16:44:30 +00:00
* Install
** Pre-requisites
2018-04-11 11:54:35 +00:00
You will need =gocode= , =gogetdoc= , =godef= , =godoctor= and many others
to get all the goodies of this layer:
2015-06-10 16:44:30 +00:00
#+BEGIN_SRC sh
2018-08-28 08:33:43 +00:00
go get -u -v github.com/mdempsky/gocode
2015-08-02 07:41:48 +00:00
go get -u -v github.com/rogpeppe/godef
2016-08-05 23:07:46 +00:00
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
2017-05-28 09:10:05 +00:00
go get -u -v golang.org/x/tools/cmd/goimports
2018-09-11 12:06:27 +00:00
go get -u -v golang.org/x/tools/cmd/godoc
2018-02-14 22:18:09 +00:00
go get -u -v github.com/zmb3/gogetdoc
2018-03-29 09:51:31 +00:00
go get -u -v github.com/cweill/gotests/ ...
2018-03-29 10:19:21 +00:00
go get -u github.com/haya14busa/gopkgs/cmd/gopkgs
2018-03-30 16:39:46 +00:00
go get -u -v github.com/davidrjenni/reftools/cmd/fillstruct
2018-04-11 11:54:35 +00:00
go get -u github.com/josharian/impl
2015-06-10 16:44:30 +00:00
#+END_SRC
2018-10-15 13:28:27 +00:00
If you wish to use a linters aggregator tool, you can enable =gometalinter= or =golangci-lint= .
2018-06-07 19:37:52 +00:00
2016-05-30 02:39:21 +00:00
If you wish to use =gometalinter= set the value of =go-use-gometalinter= to t:
2016-05-04 05:25:19 +00:00
2018-09-19 03:54:47 +00:00
#+BEGIN_SRC emacs-lisp
2016-05-04 05:25:19 +00:00
(go :variables go-use-gometalinter t)
2018-09-19 03:54:47 +00:00
#+END_SRC
2016-05-04 05:25:19 +00:00
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 ]]
2018-06-07 19:37:52 +00:00
If you wish to use =golangci-lint= set the value of =go-use-golangci-lint= to t:
2018-09-19 03:54:47 +00:00
#+BEGIN_SRC emacs-lisp
2018-06-07 19:37:52 +00:00
(go :variables go-use-golangci-lint t)
2018-09-19 03:54:47 +00:00
#+END_SRC
2018-06-07 19:37:52 +00:00
and install the tool:
#+BEGIN_SRC sh
go get -u github.com/golangci/golangci-lint/cmd/golangci-lint
#+END_SRC
For more information read [[https://github.com/golangci/golangci-lint ][golangci-lint README.md ]]
and [[https://github.com/weijiangan/flycheck-golangci-lint ][flycheck-golangci-lint README.md ]]
2017-05-25 11:19:50 +00:00
If you wish to use =godoctor= for refactoring, install it too:
#+BEGIN_SRC sh
go get -u -v github.com/godoctor/godoctor
go install github.com/godoctor/godoctor
#+END_SRC
2017-12-05 14:48:29 +00:00
If you want to use =gomodifytags= to edit field tags, install it too:
#+BEGIN_SRC sh
go get -u -v github.com/fatih/gomodifytags
#+END_SRC
2017-05-25 11:19:50 +00:00
Make sure that the =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
2015-09-30 09:37:59 +00:00
For best results, make sure that the =auto-completion= and =syntax-checking=
layers are enabled as well.
2018-06-11 22:05:13 +00:00
** LSP backend
2018-09-19 03:54:47 +00:00
To enable the LSP backend set the layer variable =go-backend= :
2018-06-11 22:05:13 +00:00
#+BEGIN_SRC elisp
2018-09-19 03:54:47 +00:00
(go :variables go-backend 'lsp)
2018-06-11 22:05:13 +00:00
#+END_SRC
2019-01-10 20:03:57 +00:00
You also need to install the Go Language Server.
Consult the installation command for the desired language server found at [[https://www.github.com/emacs-lsp/lsp-mode/ ][lsp-mode ]] for instructions.
2018-06-11 22:05:13 +00:00
Backend can be chosen on a per project basis using directory local variables
(files named =.dir-locals.el= at the root of a project), an example to use the
2018-08-12 14:59:50 +00:00
=go-mode= backend:
2018-06-11 22:05:13 +00:00
#+BEGIN_SRC elisp
2018-09-19 03:54:47 +00:00
;;; Directory Local Variables
;;; For more information see (info "(emacs) Directory Variables")
2018-06-11 22:05:13 +00:00
2018-09-19 03:54:47 +00:00
((go-mode (go-backend . go-mode)))
2018-06-11 22:05:13 +00:00
#+END_SRC
*Note:* you can easily add a directory local variable with ~SPC f v d~ .
2015-06-10 16:44:30 +00:00
** Layer
2016-01-06 05:21:55 +00:00
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
2015-09-30 09:01:28 +00:00
* Configuration
2018-07-26 23:05:02 +00:00
To run =gofmt= before save, set the value to a non-nil, e.g.
2018-09-19 03:54:47 +00:00
#+BEGIN_SRC emacs-lisp
2018-07-26 23:05:02 +00:00
(setq go-format-before-save t)
2018-09-19 03:54:47 +00:00
#+END_SRC
2018-07-26 23:05:02 +00:00
To use a different formatter, set the value of =gofmt-command= , e.g.
2015-09-30 09:01:28 +00:00
2018-09-19 03:54:47 +00:00
#+BEGIN_SRC emacs-lisp
2015-09-30 09:01:28 +00:00
(setq gofmt-command "goimports")
2018-09-19 03:54:47 +00:00
#+END_SRC
2015-10-30 11:20:58 +00:00
or
2018-09-19 03:54:47 +00:00
#+BEGIN_SRC emacs-lisp
2015-10-19 13:21:39 +00:00
(go :variables gofmt-command "goimports")
2018-09-19 03:54:47 +00:00
#+END_SRC
2015-09-30 09:01:28 +00:00
2019-04-04 05:20:48 +00:00
To run current main package with command line arguments, set the value of
=go-run-args= as file local variable, e.g.
#+BEGIN_SRC emacs-lisp
// Local Variables:
// go-run-args: "--output run.log"
// End:
#+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
2018-09-19 03:54:47 +00:00
#+BEGIN_SRC emacs-lisp
2016-03-30 02:42:45 +00:00
(go :variables go-tab-width 4)
2018-09-19 03:54:47 +00:00
#+END_SRC
2016-03-30 02:42:45 +00:00
2019-05-26 20:58:52 +00:00
If you're using =.editorconfig= in your project, set the value to nil to avoid
2018-08-07 07:36:37 +00:00
confliction, e.g.
2018-09-19 03:54:47 +00:00
#+BEGIN_SRC emacs-lisp
2018-08-07 07:36:37 +00:00
(go :variables go-tab-width nil)
2018-09-19 03:54:47 +00:00
#+END_SRC
2018-08-07 07:36:37 +00:00
2016-04-05 02:36:51 +00:00
** Tests
2019-05-26 20:58:52 +00:00
If you're using =gocheck= in your project you can use the
2015-10-30 11:20:58 +00:00
=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
2016-03-04 13:10:05 +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= .
2017-01-15 17:31:33 +00:00
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.
2017-01-06 19:06:30 +00:00
To provide additional arguments to go test, specify =go-use-test-args= .
2018-07-10 10:57:25 +00:00
2018-09-19 03:54:47 +00:00
#+BEGIN_SRC emacs-lisp
2017-01-06 19:06:30 +00:00
(go :variables go-use-test-args "-race -timeout 10s"
2018-09-19 03:54:47 +00:00
#+END_SRC
2017-01-06 19:06:30 +00:00
2016-10-03 04:20:52 +00:00
** Guru
2019-05-26 20:58:52 +00:00
Go Oracle has been deprecated as of October 1, 2016, it's replacement is =go-guru= .
2016-10-03 04:20:52 +00:00
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~ .
2018-09-19 03:54:47 +00:00
The scope is a comma separated set of packages, and =go= ’ s recursive operator is
2016-10-03 04:20:52 +00:00
supported. In addition, you can prefix with =-= to exclude a package from
searching.
In addition, =GOPATH= must be set prior to =go-guru= initialization.
2016-11-28 04:04:51 +00:00
** Autocomplete
2018-02-14 22:18:09 +00:00
For auto-completion there are actually two choices. First there is the classic =gocode= .
This has been around for quite a long time now, however =gocode= has many shortcomings like
not being able to show documentation for build-in objects or being fully dependent on installed binary
files to provide its suggestions.
A more modern and complete solution is provided by =gogetdoc= which is able to
precisely detect all documentations in your go projects independent on where
they have been added. This is also the choice recommended from =go-mode.el= .
To choose =gocode= nothing more needs to be done. To use =gogetdoc= you need to set
2018-09-19 03:54:47 +00:00
#+BEGIN_SRC emacs-lisp
2018-02-14 22:18:09 +00:00
(go :variables godoc-at-point-function 'godoc-gogetdoc)
2018-09-19 03:54:47 +00:00
#+END_SRC
2018-02-14 22:18:09 +00:00
in your =dotfile= .
If you choose to use =gocode= there are some suggestions to improve its results.
As =gocode= uses the output from installed binary files to provide its suggestions.
2016-11-28 04:04:51 +00:00
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.
2018-09-19 03:54:47 +00:00
- Run =gocode set autobuild true= to have gocode attempt to run =go install ./...=
for you.
2016-11-28 04:04:51 +00:00
- You can configure your task runner to run =go install ./...= command on every
file change.
2015-10-30 11:20:58 +00:00
* Working with Go
2015-06-10 16:44:30 +00:00
** Go commands (start with =m=):
2015-10-30 11:20:58 +00:00
2018-12-05 03:03:03 +00:00
| Key binding | Description |
2018-06-09 04:34:40 +00:00
|---------------+---------------------------------------------------------------------------------------|
2019-05-26 20:58:52 +00:00
| ~SPC m =~ | run "go fmt" |
2018-06-09 04:34:40 +00:00
| ~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 |
2018-06-09 05:09:11 +00:00
| ~SPC m h h~ | godoc at point |
2018-06-09 04:34:40 +00:00
| ~SPC m i a~ | add import |
| ~SPC m i g~ | goto imports |
| ~SPC m i r~ | remove unused import |
| ~SPC m r n~ | go rename |
2019-05-26 20:58:52 +00:00
| ~SPC m t P~ | run "go test" for the current package and all packages under it |
2018-06-09 04:34:40 +00:00
| ~SPC m t g f~ | generate tests for all exported functions |
| ~SPC m t g F~ | generate tests for all functions |
2018-06-09 05:09:11 +00:00
| ~SPC m t g g~ | DWIM generate test for the function in the active region |
2019-05-26 20:58:52 +00:00
| ~SPC m t p~ | run "go test" for the current package |
| ~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 |
2015-06-10 16:44:30 +00:00
2016-08-05 23:07:46 +00:00
** Go Guru
2018-12-05 03:03:03 +00:00
| Key binding | Description |
2016-08-05 23:07:46 +00:00
|-------------+------------------------------------------------------|
2017-12-18 03:12:44 +00:00
| ~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 |
2016-08-05 23:07:46 +00:00
| ~SPC m f d~ | go-guru describe symbol at point |
2017-12-18 03:12:44 +00:00
| ~SPC m f e~ | go-guru show possible contants/types for error value |
2016-08-05 23:07:46 +00:00
| ~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 |
2017-12-18 03:12:44 +00:00
| ~SPC m f o~ | go-guru set analysis scope |
2016-08-05 23:07:46 +00:00
| ~SPC m f p~ | go-guru show what the select expression points to |
2017-12-18 03:12:44 +00:00
| ~SPC m f r~ | go-guru show referrers |
2016-08-05 23:07:46 +00:00
| ~SPC m f s~ | go-guru show callstack |
2017-05-25 11:19:50 +00:00
** Refactoring
2019-01-13 19:53:55 +00:00
| Key binding | Description |
2018-12-04 02:47:48 +00:00
|-------------+-----------------------------------------------------------------|
| ~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 i~ | Generate method stubs for implementing an interface (=go-impl=) |
| ~SPC m r n~ | Rename (with =godoctor=) |
| ~SPC m r N~ | Rename (with =go-rename=) |
| ~SPC m r s~ | Fill structure with default values |
| ~SPC m r t~ | Toggle declaration and assignment |