summaryrefslogtreecommitdiffstats
path: root/doc/vim-go.txt
diff options
context:
space:
mode:
Diffstat (limited to 'doc/vim-go.txt')
-rw-r--r--doc/vim-go.txt2706
1 files changed, 2706 insertions, 0 deletions
diff --git a/doc/vim-go.txt b/doc/vim-go.txt
new file mode 100644
index 00000000..480b4848
--- /dev/null
+++ b/doc/vim-go.txt
@@ -0,0 +1,2706 @@
+if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'go') == -1
+
+*vim-go.txt* Go development plugin
+*vim-go*
+
+==============================================================================
+# #
+# ## ## #### ## ## ###### ####### #
+# ## ## ## ### ### ## ## ## ## #
+# ## ## ## #### #### ## ## ## #
+# ## ## ## ## ### ## ####### ## #### ## ## #
+# ## ## ## ## ## ## ## ## ## #
+# ## ## ## ## ## ## ## ## ## #
+# ### #### ## ## ###### ####### #
+# #
+==============================================================================
+CONTENTS *go-contents*
+
+ 1. Intro........................................|go-intro|
+ 2. Install......................................|go-install|
+ 3. Commands.....................................|go-commands|
+ 4. Mappings.....................................|go-mappings|
+ 5. Text Objects.................................|go-text-objects|
+ 6. Functions....................................|go-functions|
+ 7. Settings.....................................|go-settings|
+ 8. Syntax highlighting..........................|go-syntax|
+ 9. Debugger.....................................|go-debug|
+ 10. FAQ/Troubleshooting..........................|go-troubleshooting|
+ 11. Development..................................|go-development|
+ 12. Donation.....................................|go-donation|
+ 13. Credits......................................|go-credits|
+
+==============================================================================
+INTRO *go-intro*
+
+Go (golang) support for Vim. vim-go comes with sensible predefined settings
+(e.g. automatic `gofmt` on save), has code completion, snippet support,
+improved syntax highlighting, go toolchain commands, etc. It is highly
+customizable, and individual features can be toggled easily. vim-go leverages
+a number of tools developed by the Go community to provide a seamless Vim
+experience.
+
+ * Compile your package with |:GoBuild|, install it with |:GoInstall| or
+ test it with |:GoTest|. Run a single test with |:GoTestFunc|).
+ * Quickly execute your current file(s) with |:GoRun|.
+ * Improved syntax highlighting and folding.
+ * Debug programs with integrated `delve` support with |:GoDebugStart|.
+ * Code completion support via `gocode` and `gopls`.
+ * `gofmt` or `goimports` on save keeps the cursor position and undo history.
+ * Go to symbol/declaration with |:GoDef|.
+ * Look up documentation with |:GoDoc| or |:GoDocBrowser|.
+ * Easily import packages via |:GoImport|, remove them via |:GoDrop|.
+ * Precise type-safe renaming of identifiers with |:GoRename|.
+ * See which code is covered by tests with |:GoCoverage|.
+ * Add or remove tags on struct fields with |:GoAddTags| and |:GoRemoveTags|.
+ * Call `golangci-lint` with |:GoMetaLinter| to invoke all possible linters
+ (`golint`, `vet`, `errcheck`, `deadcode`, etc.) and put the result in the
+ quickfix or location list.
+ * Lint your code with |:GoLint|, run your code through |:GoVet| to catch
+ static errors, or make sure errors are checked with |:GoErrCheck|.
+ * Advanced source analysis tools utilizing `guru`, such as |:GoImplements|,
+ |:GoCallees|, and |:GoReferrers|.
+ * Automatic `GOPATH` detection which works with `gb` and `godep`. Change or
+ display `GOPATH` with |:GoPath|.
+ * Integrated and improved snippets, supporting `ultisnips`, `neosnippet`,
+ and `vim-minisnip`.
+ * Share your current code to play.golang.org with |:GoPlay|.
+ * On-the-fly information about the word under the cursor. Plug it into your
+ custom Vim function.
+ * Text objects such as "a function" (|go-af|) or "inner function" (|go-if|).
+ * Most commands are run asynchronous in Neovim and Vim 8. Fully async
+ building and testing.
+ * Integrated with the Neovim terminal, launch |:GoRun| and other Go commands
+ in a terminal buffer.
+ * Switch between `file.go` and `file_test.go` code with |:GoAlternate|.
+ * Supports integration with the Tagbar and ctrlp.vim plugins.
+ * ...and more...
+
+==============================================================================
+INSTALL *go-install*
+
+vim-go requires at least Vim 8.0.1453 or Neovim 0.4.0. On macOS, if you are
+still using your system version of vim, you can use homebrew to keep your
+version of Vim up-to-date with the following terminal command:
+>
+ brew install vim
+
+The latest stable release, https://github.com/fatih/vim-go/releases/latest, is
+the recommended version to use. If you choose to use the master branch
+instead, please do so with caution; it is a _development_ branch.
+
+vim-go follows the standard runtime path structure and should work with any of
+the major plugin managers.
+
+For Pathogen or Vim |packages|, just clone the repo. For other plugin managers
+you may also need to add the lines to your vimrc to execute the plugin
+manager's install command.
+
+* Vim 8 |packages| >
+
+ git clone https://github.com/fatih/vim-go.git \
+ ~/.vim/pack/plugins/start/vim-go
+<
+* https://github.com/tpope/vim-pathogen >
+
+ git clone https://github.com/fatih/vim-go.git ~/.vim/bundle/vim-go
+<
+* https://github.com/junegunn/vim-plug >
+
+ Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' }
+<
+* https://github.com/Shougo/neobundle.vim >
+
+ NeoBundle 'fatih/vim-go'
+<
+* https://github.com/gmarik/vundle >
+
+ Plugin 'fatih/vim-go'
+<
+* Manual (not recommended) >
+
+ Copy all of the files into your `~/.vim` directory
+<
+
+You will also need to install all the necessary binaries. vim-go makes it easy
+to install all of them by providing a command, |:GoInstallBinaries|, to
+`go get` all the required binaries. The binaries will be installed to $GOBIN
+or $GOPATH/bin (default: $HOME/go/bin). It requires `git`.
+
+Depending on your installation method, you may have to generate the plugin's
+|:helptags| manually (e.g. `:helptags ALL`).
+
+Code completion is enabled by default via 'omnifunc', which you can trigger
+with |i_CTRL-X_CTRL-O| (`<C-x><C-o>`).
+
+Supported Go plugins~ *vim-go-plugins*
+
+The following plugins are supported for use with vim-go:
+
+* Real-time completion (Vim):
+ https://github.com/Shougo/neocomplete.vim
+
+* Real-time completion (Neovim and Vim 8):
+ https://github.com/Shougo/deoplete.nvim
+
+ Add the following line to your vimrc. This instructs deoplete to use omni
+ completion for Go files.
+
+ call deoplete#custom#option('omni_patterns', { 'go': '[^. *\t]\.\w*' })
+
+* Display source code navigation in a sidebar:
+ https://github.com/majutsushi/tagbar
+
+* Snippets:
+ https://github.com/Shougo/neosnippet.vim or
+ https://github.com/SirVer/ultisnips or
+ https://github.com/joereynolds/vim-minisnip
+
+* Interactive |:GoDecls| and |:GoDeclsDir|:
+ https://github.com/ctrlpvim/ctrlp.vim or
+ https://github.com/junegunn/fzf.vim or
+ https://github.com/Shougo/unite.vim or
+ https://github.com/Shougo/denite.nvim
+
+==============================================================================
+COMMANDS *go-commands*
+
+ *:GoReportGitHubIssue*
+:GoReportGitHubIssue
+ GoReportGitHubIssue opens the default browser and starts a new bug report
+ with useful system information.
+
+ *:GoPath*
+:GoPath [path]
+
+ GoPath sets and overrides GOPATH with the given {path}. If no {path} is
+ given it shows the current GOPATH. If `""` is given as path, it clears
+ current `GOPATH` which was set with |:GoPath| and restores `GOPATH` back
+ to the initial value which was sourced when Vim was started.
+
+ *:GoImport*
+:GoImport[!] [path]
+
+ Import ensures that the provided package {path} is imported in the current
+ Go buffer, using proper style and ordering. If {path} is already being
+ imported, an error will be displayed and the buffer will be untouched.
+
+ If [!] is given it will download the package with `go get`
+
+ *:GoImportAs*
+:GoImportAs [localname] [path]
+
+ Same as Import, but uses a custom local name for the package.
+
+ *:GoDrop*
+:GoDrop [path]
+
+ Remove the import line for the provided package {path}, if present in the
+ current Go buffer. If {path} is not being imported, an error will be
+ displayed and the buffer will be untouched.
+
+ *:GoLint*
+:GoLint! [packages]
+
+ Run golint for the directory under your current file, or for the given
+ packages.
+
+ If [!] is not given the first error is jumped to.
+
+ *:GoDoc*
+:GoDoc [word]
+
+ Open the relevant GoDoc in split window for either the word[s] passed to
+ the command or by default, the word under the cursor.
+
+ *:GoDocBrowser*
+:GoDocBrowser [word]
+
+ Open the relevant GoDoc in browser for either the word[s] passed to the
+ command or by default, the word under the cursor. By default it opens the
+ documentation in 'https://pkg.go.dev'. To change it see |'g:go_doc_url'|.
+
+ *:GoFmt*
+:GoFmt
+
+ Filter the current Go buffer through gofmt. It tries to preserve cursor
+ position and avoids replacing the buffer with stderr output.
+
+ *:GoImports*
+:GoImports
+
+ Filter the current Go buffer through goimports (needs to be installed).
+ `goimports` automatically discards/add import path based on the code. Like
+ |:GoFmt|, It tries to preserve cursor position and avoids replacing the
+ buffer with stderr output.
+
+ *:GoPlay*
+:[range]GoPlay
+
+ Share snippet to play.golang.org. If no [range] is given it shares
+ the whole file, otherwise the selected lines are shared. Snippet URL
+ is copied to system clipboard if Vim is compiled with 'clipboard' or
+ 'xterm-clipboard' otherwise it's get yanked into the `""` register.
+
+ *:GoVet*
+:GoVet[!] [options]
+
+ Run `go vet` for the directory under your current file. Vet examines Go
+ source code and reports suspicious constructs, such as Printf calls whose
+ arguments do not align with the format string. Vet uses heuristics that do
+ not guarantee all reports are genuine problems, but it can find errors not
+ caught by the compilers.
+
+ You may optionally pass any valid go vet flags/options.
+
+ If [!] is not given the first error is jumped to.
+
+ *:GoDef*
+:GoDef
+gd
+CTRL-]
+g<C-LeftMouse>
+<C-LeftMouse>
+
+ Go to declaration/definition for the identifier under the cursor. By
+ default the CTRL-] shortcut, the mapping `gd` and <C-LeftMouse>,
+ g<LeftMouse> are enabled to invoke :GoDef for the identifier under the
+ cursor. See |'g:go_def_mapping_enabled'| to disable them. No explicit
+ arguments are supported.
+
+ vim-go also keeps a per-window location stack, roughly analogous to how
+ Vim's internal |tags| functionality works. This is pushed to every time a
+ jump is made using the GoDef functionality. In essence, this is a LIFO
+ list of file locations you have visited with :GoDef that is retained to
+ help you navigate software.
+
+ The per-window location stack is shared with |:GoDefType|.
+
+ *:GoDefType*
+:GoDefType
+
+ Go to type definition for the identifier under the cursor.
+
+ The per-window location stack is shared with |:GoDef|.
+ *:GoDefStack*
+:GoDefStack [number]
+
+ This command Jumps to a given location in the jumpstack, retaining all
+ other entries. Jumps to non-existent entries will print an informative
+ message, but are otherwise a noop.
+
+ If no argument is given, it will print out an interactive list of all
+ items in the stack. Its output looks like this:
+
+ 1 /path/first/file.go|1187 col 16|AddThing func(t *Thing)
+ > 2 /path/thing/thing.go|624 col 19|String() string
+ 3 /path/thing/thing.go|744 col 6|func Sprintln(a ...interface{}) string
+
+ This list shows the identifiers that you jumped to and the file and cursor
+ position before that jump. The older jumps are at the top, the newer at
+ the bottom.
+
+ The '>' points to the active entry. This entry and any newer entries
+ below it will be replaced if |:GoDef| is done from this location. The
+ CTRL-t and |:GoDefPop| command will jump to the position above the active
+ entry.
+
+ Jumps to non-existent entries will print an informative message, but are
+ otherwise a noop.
+
+ *:GoDefStackClear*
+:GoDefStackClear
+
+ Clears the current stack list and resets it.
+
+ *:GoDefPop*
+:GoDefPop [count]
+CTRL-t
+
+ Navigate to the [count] earlier entry in the jump stack, retaining the
+ newer entries. If no argument is given, it will jump to the next most
+ recent entry (`:GoDefPop 1`). If [count] is greater than the number of
+ prior entries, an error will be printed and no jump will be performed.
+
+ If you have used :GoDefPop to jump to an earlier location, and you issue
+ another :GoDef command, the current entry will be replaced, and all newer
+ entries will be removed, effectively resuming the stack at that location.
+
+ By default [count]CTRL-t is enabled to invoke :GoDefPop. Similarly,
+ hitting CTRL-t without a prior count is equivalent to `:GoDefPop 1`. See
+ |'g:go_def_mapping_enabled'| to disable this.
+
+ *:GoRun*
+:GoRun[!] [expand]
+
+ Build and run your current main package. By default all main files for the
+ current file is used. If an argument is passed, [expand] is used as file
+ selector. For example use `:GoRun %` to select the current file only.
+
+ You may optionally pass any valid go run flags/options. For a full list
+ please see `go help run`.
+
+ If [!] is not given the first error is jumped to.
+
+ If using neovim then `:GoRun` will run in a new terminal according to
+ |'g:go_term_mode'|.
+
+ The working directory will be the directory containing the current buffer.
+
+
+ *:GoBuild*
+:GoBuild[!] [expand]
+
+ Build your package with `go build`. Errors are populated in the quickfix
+ window. It automatically builds only the files that depends on the current
+ file. `:GoBuild` doesn't produce a result file.
+ Use |:make| to create a result file.
+
+ You may optionally pass any valid go build flags/options. For a full list
+ please see `go help build`. Options are expanded with [expand].
+
+ If [!] is not given the first error is jumped to.
+
+ If using neovim then this command is fully async, it does not block the
+ UI.
+
+ *:GoGenerate*
+:GoGenerate[!] [expand]
+
+ Creates or updates your auto-generated source files by running `go
+ generate`.
+
+ You may optionally pass any valid go generate flags/options. For a full
+ list please see `go help generate`. Options are expanded with [expand].
+
+ If [!] is not given the first error is jumped to.
+
+ *:GoInfo*
+:GoInfo
+ Show type information about the identifier under the cursor. For example
+ putting it above a function call is going to show the full function
+ signature. By default it uses `gopls` to get the type informations. To
+ change the underlying tool from `gopls` to another tool, see
+ |'g:go_info_mode'|.
+
+
+ *:GoInstall*
+:GoInstall[!] [options]
+
+ Install your package with `go install`.
+
+ You may optionally pass any valid go install flags/options. For a full
+ list please see `go help install`.
+
+ If [!] is not given the first error is jumped to.
+
+ *:GoTest*
+:GoTest[!] [expand]
+
+ Run the tests on your _test.go files via in your current directory. Errors
+ are populated in the quickfix window. If an argument is passed, [expand]
+ is used as file selector (useful for cases like `:GoTest ./...`).
+
+ You may optionally pass any valid go test flags/options. For a full list
+ please see `go help test`.
+
+ GoTest times out automatically after 10 seconds. To customize the timeout
+ use |'g:go_test_timeout'|. This feature is disabled if any arguments are
+ passed to the `:GoTest` command.
+
+ If [!] is not given the first error is jumped to.
+
+ If using neovim `:GoTest` will run in a new terminal or run asynchronously
+ in the background according to |'g:go_term_enabled'|. You can set the mode
+ of the new terminal with |'g:go_term_mode'|.
+
+ *:GoTestFunc*
+:GoTestFunc[!] [expand]
+
+ Runs :GoTest, but only on the single test function immediate to your
+ cursor using 'go test's '-run' flag.
+
+ Lookup is done starting at the cursor (including that line) moving up till
+ a matching `func Test` pattern is found or top of file is reached. Search
+ will not wrap around when at the top of the file.
+
+ If [!] is not given the first error is jumped to.
+
+ If using neovim `:GoTestFunc` will run in a new terminal or run
+ asynchronously in the background according to |'g:go_term_enabled'|. You
+ can set the mode of the new terminal with |'g:go_term_mode'|.
+
+ *:GoTestCompile*
+:GoTestCompile[!] [expand]
+
+ Compile your _test.go files via in your current directory. Errors are
+ populated in the quickfix window. If an argument is passed, [expand] is
+ used as file selector (useful for cases like `:GoTest ./...`). Useful to
+ not run the tests and capture/fix errors before running the tests or to
+ create test binary.
+
+ If [!] is not given the first error is jumped to.
+
+ If using neovim `:GoTestCompile` will run in a new terminal or run
+ asynchronously in the background according to |'g:go_term_enabled'|. You
+ can set the mode of the new terminal with |'g:go_term_mode'|.
+
+ *:GoCoverage*
+:GoCoverage[!] [options]
+
+ Create a coverage profile and annotates the current file's source code. If
+ called again it rerurns the tests.
+
+ If [!] is not given the first error is jumped to.
+
+ *:GoCoverageToggle*
+:GoCoverageToggle[!] [options]
+
+ Create a coverage profile and annotates the current file's source code. If
+ called again clears the annotation (works as a toggle).
+
+ If [!] is not given the first error is jumped to.
+
+ *:GoCoverageClear*
+:GoCoverageClear [options]
+
+ Clears the coverage annotation.
+
+
+ *:GoCoverageBrowser*
+:GoCoverageBrowser[!] [options]
+
+ Create a coverage profile and open a browser to display the annotated
+ source code of the current package.
+
+ You may optionally pass any valid go test flags/options, such as
+ `-covermode set,count,atomic`. For a full list please see `go help test`.
+
+ If [!] is not given the first error is jumped to.
+
+ *:GoErrCheck*
+:GoErrCheck! [options]
+
+ Check for unchecked errors in you current package. Errors are populated in
+ the quickfix window.
+
+ You may optionally pass any valid errcheck flags/options. See
+ `errcheck -h` for a full list.
+
+ If [!] is not given the first error is jumped to.
+
+ *:GoFiles*
+:GoFiles [source_files]
+
+ Show source files for the current package. The [source_files] specifies
+ which file types to list. See the "// Source files" section of
+ `go list -h` for possible values; multiple values are accepted.
+ Command-line completion also works for this command.
+ The default is to use `GoFiles` if no arguments are given.
+
+ *:GoDeps*
+:GoDeps
+
+ Show dependencies for the current package.
+
+ *:GoInstallBinaries*
+:GoInstallBinaries [binaries]
+
+ Download and install all necessary Go tool binaries such as `godef`,
+ `goimports`, `gopls`, etc. under |'g:go_bin_path'|. If [binaries] is
+ supplied, then only the specified binaries will be installed. The default
+ is to install everything.
+
+ Set |'g:go_get_update'| to disable updating dependencies.
+
+ *:GoUpdateBinaries*
+:GoUpdateBinaries [binaries]
+
+ Download and update previously installed Go tool binaries such as `godef`,
+ `goimports`, `gopls`, etc. under |'g:go_bin_path'|. If [binaries] is
+ supplied, then only the specified binaries will be updated. The default is
+ to update everything.
+
+ Set |'g:go_get_update'| to disable updating dependencies.
+
+ *:GoImplements*
+:GoImplements
+
+ Show "implements" relation for a selected package. A list of interfaces
+ for the type that implements an interface under the cursor (or selected
+ package) is shown in a location list.
+ *:GoRename*
+:GoRename[!] [to]
+
+ Rename the identifier under the cursor to the desired new name. If no
+ argument is given a prompt will ask for the desired identifier.
+
+ If [!] is not given the first error is jumped to.
+
+
+ *:GoGuruScope*
+:GoGuruScope [pattern] ...
+
+ Changes the custom |'g:go_guru_scope'| setting and overrides it with the
+ given package patterns. The custom scope is cleared (unset) if `""` is
+ given as the only path. If no arguments is given it prints the current
+ custom scope. Example patterns are:
+>
+ golang.org/x/tools/cmd/guru # a single package
+ golang.org/x/tools/... # all packages beneath dir
+ ... # the entire workspace.
+<
+ Example usage, the following sets the scope to a `github.com/fatih/color`
+ and to all packages under `golang.org/x/tools/`:
+>
+ :GoGuruScope github.com/fatih/color golang.org/x/tools/...
+<
+ The following sets it to the entire workspace:
+>
+ :GoGuruScope ...
+<
+ Under the hood, the patterns are all joined to a comma-separated list and
+ passed to `guru`'s `-scope` flag.
+
+ Also see |go-guru-scope|.
+
+ *:GoCallees*
+:GoCallees
+
+ Show "callees" relation for a selected package. A list of possible call
+ targets for the type under the cursor (or selected package) is shown in a
+ location list.
+
+ *:GoCallers*
+:GoCallers
+
+ Show "callers" relation for a selected function. A list of possible
+ callers for the selected function under the cursor is shown in a location
+ list.
+
+ *:GoDescribe*
+:GoDescribe
+
+ Shows various properties of the selected syntax: its syntactic kind, its
+ type (for an expression), its value (for a constant expression), its size,
+ alignment, method set and interfaces (for a type), its declaration (for an
+ identifier), etc. Almost any piece of syntax may be described, and the
+ guru will try to print all the useful information it can.
+
+ *:GoCallstack*
+:GoCallstack
+
+ Shows "callstack" relation for the selected function. An arbitrary path
+ from the root of the callgraph to the selected function is shown in a
+ location list. This may be useful to understand how the function is
+ reached in a given program.
+
+ *:GoFreevars*
+:GoFreevars
+
+ Enumerates the free variables of the selection. "Free variables" is a
+ technical term meaning the set of variables that are referenced but not
+ defined within the selection, or loosely speaking, its inputs.
+
+ This information is useful when considering whether to refactor the
+ selection into a function of its own, as the free variables would be the
+ necessary parameters of that function. It's also useful when you want to
+ understand what the inputs are to a complex block of code even if you
+ don’t plan to change it.
+
+ *:GoChannelPeers*
+:GoChannelPeers
+
+ Shows the set of possible sends/receives on the channel operand of the
+ selected send or receive operation; the selection must be a `<-` token.
+
+ For example, visually select a channel operand in the form of:
+>
+ done <- true
+<
+ And call |:GoChannelPeers| on it. It will show where it was allocated, and
+ the sending and receiving endings.
+
+ *:GoReferrers*
+:GoReferrers
+
+ The referrers query shows the set of identifiers that refer to the same
+ object as does the selected identifier.
+
+ *:GoSameIds*
+:GoSameIds
+
+ Highlights all identifiers that are equivalent to the identifier under the
+ cursor.
+
+ *:GoSameIdsClear*
+:GoSameIdsClear
+
+ Clears all SameIds highlights from a |:GoSameIds| call.
+
+ *:GoSameIdsToggle*
+:GoSameIdsToggle
+
+ Toggle between |:GoSameIds| and |:GoSameIdsClear|.
+
+ *:GoSameIdsAutoToggle*
+:GoSameIdsAutoToggle
+
+ Enables or disables automatic highlighting of |:GoSameIds| while moving
+ the cursor. This basically toggles the option |'g:go_auto_sameids'|
+ on/off.
+ If enabled it starts highlighting whenever your cursor is staying at the
+ same position for a configurable period of time (see |'g:go_updatetime'|).
+ If disabled it clears and stops automatic highlighting.
+
+ *:GoMetaLinter*
+:GoMetaLinter! [path]
+
+ Calls the underlying `golangci-lint` tool and displays all warnings and
+ errors in the |quickfix| window. By default the following linters are
+ enabled: `vet`, `golint`, and `errcheck`. This can be changed with the
+ |'g:go_metalinter_enabled'| variable. To override the command completely
+ use the variable |'g:go_metalinter_command'|. To override the maximum
+ linters execution time use |'g:go_metalinter_deadline'| variable.
+
+ If [!] is not given the first error is jumped to.
+
+ *:GoDiagnostics*
+:GoDiagnostics! [packages]
+
+ Displays the diagnostics from `gopls` for the given packages in a
+ |quickfix| window. The diagnostics for the current package are displayed
+ when no package is given. The diagnostics for all packages will be
+ displayed when `all` is as an argument.
+
+ Disabled when |'g:go_diagnostics_enabled'| is not set.
+
+ If [!] is not given the first error is jumped to.
+
+ *:GoBuildTags*
+:GoBuildTags [tags]
+
+ Changes the build tags for various commands. If you have any file that
+ uses a custom build tag, such as `// +build integration` , this command
+ can be used to pass it to all tools that accepts tags, such as gopls,
+ guru, gorename, etc.
+
+ The build tags is cleared (unset) if `""` is given. If no arguments are
+ given it prints the current build tags.
+
+ *:AsmFmt*
+:AsmFmt
+
+ Filter the current Go asm buffer through asmfmt. It tries to preserve
+ cursor position and avoids replacing the buffer with stderr output.
+
+ *:GoAlternate*
+:GoAlternate[!]
+
+ Alternates between the implementation and test code. For example if in
+ main.go, switch to main_test.go. Uses the |'g:go_alternate_mode'| setting
+ as the command to open the file.
+
+ If [!] is given then it switches to the new file even if it does not
+ exist.
+
+ If you would like to override the traditional commands for alternating,
+ add the following to your .vimrc:
+>
+ augroup go
+ autocmd!
+ autocmd Filetype go
+ \ command! -bang A call go#alternate#Switch(<bang>0, 'edit')
+ \| command! -bang AV call go#alternate#Switch(<bang>0, 'vsplit')
+ \| command! -bang AS call go#alternate#Switch(<bang>0, 'split')
+ augroup END
+<
+
+ *:GoPointsTo*
+:GoPointsTo
+
+ Show all variables to which the pointer under the cursor may point to.
+
+ *:GoWhicherrs*
+:GoWhicherrs
+
+ Show the list of possible constants, global variables, and concrete types
+ for the error type under the cursor in a location list.
+
+ *:GoDecls*
+:GoDecls [file]
+
+ Show all function and type declarations for the current file. If
+ [file] is non empty it parses the given file.
+ Requires `ctrlp.vim` or `fzf`; it will autodetect the plugin if installed,
+ but you can use |'g:go_decls_mode'| to force using one or the other.
+ By default `type` and `func` declarations are shown. This can be changed
+ via |'g:go_decls_includes'|. Also see |unite-decls|, |denite-decls|.
+
+ *:GoDeclsDir*
+:GoDeclsDir [dir]
+
+ Show all function and type declarations for the current directory. If
+ [dir] is given it parses the given directory.
+
+ *unite-decls*
+ *denite-decls*
+:Unite decls[:path]
+:Denite decls[:path]
+
+ Only enabled if `unite.vim` or `denite.nvim` is installed. Show
+ declarations for all functions and types on the current file or directory
+ or for [path] if given.
+
+ Note: `denite.nvim` requires NeoVim or Vim 8 with |:python3| enabled.
+>
+ " show declarations on the parent directory of the current file
+ :Unite decls
+ :Denite decls
+
+ " show declarations in the file.
+ :Unite decls:foo/bar.go
+ :Denite decls:foo/bar.go
+
+ " show declarations in the directory "foo".
+ :Unite decls:foo
+ :Denite decls:foo
+<
+ *:GoImpl*
+:GoImpl [receiver] [interface]
+
+ Generates method stubs for implementing an interface. If no arguments is
+ passed it takes the identifier under the cursor to be the receiver and
+ asks for the interface type to be generated. If used with arguments, the
+ receiver and the interface needs to be specified. Example usages:
+>
+ :GoImpl f *Foo io.Writer
+ :GoImpl t Type io.ReadWriteCloser
+<
+ *:GoAddTags*
+:[range]GoAddTags [key],[option] [key1],[option] ...
+
+ Adds field tags for the fields of a struct. If called inside a struct it
+ automatically add field tags with the `json` key and the value
+ automatically generated based on the field name. An error message is given
+ if it's called outside a struct definition or if the file is not correctly
+ formatted.
+
+ If [range] is given, only the selected fields will be changed.
+
+ The default `json` can be changed by providing one or more [key]
+ arguments. An example of adding `xml` and `db` would be:
+>
+ :GoAddTags xml db
+<
+ If [option] is passed it'll either add a new tag with an option or will
+ modify existing tags. An example of adding `omitempty` to all `json`
+ fields would be:
+>
+ :GoAddTags json,omitempty
+<
+ You can define a constant value instead of the default field based value.
+ For example the following command will add ``valid:"1"`` to all fields.
+>
+ :GoAddTags valid=1
+<
+ *:GoRemoveTags*
+:[range]GoRemoveTags [key],[option] [key1],[option1] ...
+
+ Remove field tags for the fields of a struct. If called inside a struct it
+ automatically remove all field tags. An error message is given if it's
+ called outside a struct definition or if the file is not correctly
+ formatted
+
+ If [range] is given, only the selected fields will be changed.
+
+ If [key] is given, it will only remove those keys. Example:
+>
+ :GoRemoveTags json
+<
+ If [option] is passed with a [key], it will only remove the options.
+ Example, this will only remove `omitempty` options from fields containing
+ `json`:
+>
+ :GoRemoveTags json,omitempty
+<
+ *:GoAutoTypeInfoToggle*
+:GoAutoTypeInfoToggle
+
+ Toggles |'g:go_auto_type_info'|.
+
+ *:GoFmtAutoSaveToggle*
+:GoFmtAutoSaveToggle
+
+ Toggles |'g:go_fmt_autosave'|.
+
+ *:GoModFmtAutoSaveToggle*
+:GoModFmtAutoSaveToggle
+
+ Toggles |'g:go_mod_fmt_autosave'|.
+
+ *:GoAsmFmtAutoSaveToggle*
+:GoAsmFmtAutoSaveToggle
+
+ Toggles |'g:go_asmfmt_autosave'|.
+
+ *:GoMetaLinterAutoSaveToggle*
+:GoMetaLinterAutoSaveToggle
+
+ Toggles |'g:go_metalinter_autosave'|.
+
+ By default, `golangci-lint` messages will be shown in the |location-list|
+ window. The list to use can be set using |'g:go_list_type_commands'|.
+
+ *:GoTemplateAutoCreateToggle*
+:GoTemplateAutoCreateToggle
+
+ Toggles |'g:go_template_autocreate'|.
+
+ *:GoKeyify*
+:GoKeyify
+
+ Uses `keyify` to turn unkeyed struct literals into keyed ones.
+
+ For example:
+>
+ Person{"John", "Smith"}
+<
+ Becomes:
+>
+ Person{
+ Name: "John",
+ Surname: "Smith",
+ }
+<
+ *:GoFillStruct*
+:GoFillStruct
+
+ Use `fillstruct` to fill a struct literal with default values. Existing
+ values (if any) are preserved. The cursor must be on the struct you wish
+ to fill.
+
+ For example:
+>
+ addr := net.Address{Name: "Ford Prefect"}
+<
+ Becomes:
+>
+ addr := net.Address{
+ Name: "Ford Prefect",
+ Email: "",
+ }
+<
+
+ *:GoIfErr*
+:GoIfErr
+
+ Generate if err != nil { return ... } automatically which infer the type
+ of return values and the numbers.
+
+ For example:
+>
+ func doSomething() (string, error) {
+ f, err := os.Open("file")
+ }
+<
+ Becomes:
+>
+ func doSomething() (string, error) {
+ f, err := os.Open("file")
+ if err != nil {
+ return "", err
+ }
+ }
+<
+ *:GoModFmt*
+:GoModFmt
+
+ Filter the current go.mod buffer through "go mod edit -fmt" command. It
+ tries to preserve cursor position and avoids replacing the buffer with
+ stderr output.
+
+ *:GoAddWorkspace*
+:GoAddWorkspace [dir] ...
+
+ Add directories to the `gopls` workspace.
+
+ *:GoLSPDebugBrowser*
+:GoLSPDebugBrowser
+
+ Open a browser to see gopls debugging information.
+
+==============================================================================
+MAPPINGS *go-mappings*
+
+vim-go has several <Plug> keys which can be used to create custom mappings
+For example, to create a mapping that calls `go run` for the current package,
+create a mapping for the `(go-run)`: >
+
+ au FileType go nmap <leader>r <Plug>(go-run)
+
+As always one is free to create more advanced mappings or functions based with
+|go-commands|. For more information please check out the mappings command
+documentation in the |go-commands| section. Available <Plug> keys are:
+
+ *(go-run)*
+
+Calls `go run` for the current main package
+
+ *(go-run-tab)*
+
+Calls `go run` for the current file in a new terminal tab
+This option is neovim only.
+
+ *(go-run-split)*
+
+Calls `go run` for the current file in a new terminal horizontal split
+This option is neovim only.
+
+ *(go-run-vertical)*
+
+Calls `go run` for the current file in a new terminal vertical split
+This option is neovim only.
+
+ *(go-build)*
+
+Calls `go build` for the current package
+
+ *(go-generate)*
+
+Calls `go generate` for the current package
+
+ *(go-info)*
+
+Shows type information for the word under the cursor
+
+ *(go-install)*
+
+Calls `go install` for the current package
+
+ *(go-test)*
+
+Calls `go test` for the current package
+
+ *(go-test-func)*
+
+Calls `go test -run '...'` for the test function immediate to cursor
+
+ *(go-test-compile)*
+
+Calls `go test -c` for the current package
+
+ *(go-coverage)*
+
+Calls `go test -coverprofile-temp.out` for the current package and shows the
+coverage annotation.
+
+ *(go-coverage-clear)*
+
+Clears the coverage annotation
+
+ *(go-coverage-toggle)*
+
+Calls `go test -coverprofile-temp.out` for the current package and shows the
+coverage annotation. If run again it acts as a toggle and clears the
+annotation.
+
+ *(go-imports)*
+
+Calls `goimports` for the current package
+
+ *(go-lint)*
+
+Calls `golint` for the current package
+
+ *(go-vet)*
+
+Calls `go vet` for the current package
+
+
+ *(go-files)*
+
+Show source files that depends for the current package
+
+
+ *(go-deps)*
+
+Show dependencies for the current package
+
+ *(go-doc)*
+
+Show the relevant GoDoc for the word under the cursor in a split window
+leftabove (default mode).
+
+ *(go-doc-split)*
+
+Show the relevant GoDoc for the word under the cursor in a split window.
+
+
+ *(go-doc-vertical)*
+
+Show the relevant GoDoc for the word under the cursor in a vertical split
+window.
+
+ *(go-doc-tab)*
+
+Show the relevant GoDoc for the word under the cursor in a tab window.
+
+
+ *(go-doc-browser)*
+
+Show the relevant GoDoc for the word under in browser
+
+ *(go-def)*
+
+Goto declaration/definition. Results are shown in the current window.
+
+ *(go-def-split)*
+
+Goto declaration/definition. Results are shown in a split window.
+Jumps to an existing buffer if |'g:go_def_reuse_buffer'| is enabled.
+
+ *(go-def-vertical)*
+
+Goto declaration/definition. Results are shown in a vertical split window.
+Jumps to an existing buffer if |'g:go_def_reuse_buffer'| is enabled.
+
+ *(go-def-tab)*
+
+Goto declaration/definition. Results are shown in a tab window.
+Jumps to an existing buffer if |'g:go_def_reuse_buffer'| is enabled.
+
+ *(go-def-type)*
+
+Goto type declaration/definition. Results are shown in the current window.
+Jumps to an existing buffer if |'g:go_def_reuse_buffer'| is enabled.
+
+ *(go-def-type-vertical)*
+Goto type declaration/definition. Results are shown in a vertical split
+window.
+Jumps to an existing buffer if |'g:go_def_reuse_buffer'| is enabled.
+
+ *(go-def-type-split)*
+Goto type declaration/definition. Results are shown in a split window.
+Jumps to an existing buffer if |'g:go_def_reuse_buffer'| is enabled.
+
+ *(go-def-type-tab)*
+Goto type declaration/definition. Results are shown in a tab window.
+Jumps to an existing buffer if |'g:go_def_reuse_buffer'| is enabled.
+
+ *(go-def-stack)*
+
+Shows the godef tag stack
+
+ *(go-def-stack-clear)*
+
+Resets and clears the tag stack
+
+ *(go-def-pop)*
+
+Jump to previous entry in the tag stack
+
+ *(go-implements)*
+
+Show the interfaces that the type under the cursor implements.
+
+ *(go-rename)*
+
+Rename the identifier under the cursor to the desired new name
+
+ *(go-callees)*
+
+Show the call targets for the type under the cursor
+
+ *(go-callers)*
+
+Show possible callers of selected function
+
+ *(go-describe)*
+
+Describe selected syntax: definition, methods, etc
+
+ *(go-callstack)*
+
+Show path from callgraph root to selected function
+
+ *(go-freevars)*
+
+Show free variables of selection
+
+ *(go-channelpeers)*
+
+Show send/receive corresponding to selected channel op
+
+ *(go-referrers)*
+
+Show all refs to entity denoted by selected identifier
+
+ *(go-pointsto)*
+
+Show all variables to which the pointer under the cursor may point to.
+
+ *(go-metalinter)*
+
+Calls `go-metalinter` for the current directory
+
+ *(go-alternate-edit)*
+
+Alternates between the implementation and test code in the current window
+
+ *(go-alternate-split)*
+
+Alternates between the implementation and test code in a new horizontal split
+
+ *(go-alternate-vertical)*
+
+Alternates between the implementation and test code in a new vertical split
+
+ *(go-import)*
+
+Calls `:GoImport` for the current package
+
+ *(go-iferr)*
+
+Generate if err != nil { return ... } automatically which infer the type of
+return values and the numbers.
+
+ *(go-mod-fmt)*
+
+Calls |:GoModFmt| for the current buffer
+
+ *(go-diagnostics)*
+Calls `:GoDiagnostics`
+
+==============================================================================
+TEXT OBJECTS *go-text-objects*
+
+vim-go comes with several custom |text-objects| that can be used to operate
+upon regions of text. vim-go currently defines the following text objects:
+
+ *go-v_af* *go-af*
+af "a function", select contents from a function definition to the
+ closing bracket. If |'g:go_textobj_include_function_doc'| is
+ enabled it also includes the comment doc for a function
+ declaration. This text-object also supports literal functions.
+ If |'g:go_textobj_include_variable'| is enabled it also
+ includes the variable of an function assignment
+
+ *go-v_if* *go-if*
+if "inside a function", select contents of a function,
+ excluding the function definition and the closing bracket. This
+ text-object also supports literal functions
+
+ *go-v_ac* *go-ac*
+ac "a comment", select contents of the current comment block.
+
+ *go-v_ic* *go-ic*
+ic "inner comment", select contents of the current comment block,
+ excluding the start and end comment markers.
+
+vim-go also defines the following text motion objects:
+
+ *go-v_]]* *go-]]*
+]] [count] forward to next function declaration. If
+ |'g:go_textobj_include_function_doc'| is enabled and if your
+ on a comment, it skips the function which the comment
+ belongs and forwards to the next function declaration.
+
+ *go-v_[[* *go-[[*
+[[ [count] backward to previous function declaration.
+
+
+
+==============================================================================
+FUNCTIONS *go-functions*
+
+ *go#statusline#Show()*
+
+Shows the status of a job running asynchronously. Can be used to plug into the
+statusline. It works to show the status per package instead of per file.
+Assume you have three files open, all belonging to the same package, if the
+package build (`:GoBuild`) is successful, all statuslines will show `success`,
+if it fails all windows' statuslines will show `failed`.
+
+To avoid always showing old status information, the status information is
+cleaned for each package after `60` seconds. This can be changed with the
+|'g:go_statusline_duration'| setting.
+
+ *go#complete#GetInfo()*
+
+Returns the description of the identifer under the cursor. Can be used to plug
+into the statusline.
+
+ *go#complete#Complete()*
+
+Uses `gopls` for autocompletion. By default, it is hooked up to 'omnifunc'.
+
+ *go#tool#DescribeBalloon()*
+
+Suitable to be used as an expression to show the evaluation balloon. See `help
+balloonexpr`.
+
+==============================================================================
+SETTINGS *go-settings*
+
+ *'g:go_version_warning'*
+
+Enable warning when using an unsupported version of Vim. By default it is
+enabled.
+>
+ let g:go_version_warning = 1
+<
+
+ *'g:go_code_completion_enabled'*
+
+Enable code completion with 'omnifunc'. By default it is enabled.
+>
+ let g:go_code_completion_enabled = 1
+<
+
+ *'g:go_code_completion_icase'*
+
+Override the icase field in 'omnifunc' results. By default it is set to 0.
+See 'complete-items' for details.
+>
+ let g:go_code_completion_icase = 0
+<
+
+ *'g:go_test_show_name'*
+
+Show the name of each failed test before the errors and logs output by the
+test. By default it is disabled.
+>
+ let g:go_test_show_name = 0
+<
+
+ *'g:go_test_timeout'*
+
+Use this option to change the test timeout of |:GoTest|. By default it is
+set to 10 seconds . >
+
+ let g:go_test_timeout= '10s'
+<
+ *'g:go_play_browser_command'*
+
+Browser to use for |:GoPlay|, |:GoDocBrowser|, and |:GoLSPDebugBrowser|. The
+url must be added with `%URL%`, and it's advisable to include `&` to make sure
+the shell returns. For example:
+>
+ let g:go_play_browser_command = 'firefox-developer %URL% &'
+<
+
+By default it tries to find it automatically for the current OS. >
+
+ let g:go_play_browser_command = ''
+<
+ *'g:go_play_open_browser'*
+
+Use this option to open browser after posting the snippet to play.golang.org
+with |:GoPlay|. By default it's enabled. >
+
+ let g:go_play_open_browser = 1
+<
+ *'g:go_auto_type_info'*
+
+Use this option to show the type info (|:GoInfo|) for the word under the
+cursor automatically. Whenever the cursor changes the type info will be
+updated. By default it's disabled. The delay can be configured with the
+|'g:go_updatetime'| setting.
+>
+ let g:go_auto_type_info = 0
+<
+
+ *'g:go_info_mode'*
+
+Use this option to define the command to be used for |:GoInfo|. By default
+`gopls` is used, because it is the fastest and is known to be highly accurate.
+One might also use `guru` for its accuracy.
+Valid options are `gopls` and `guru`.
+>
+ let g:go_info_mode = 'gopls'
+<
+ *'g:go_auto_sameids'*
+
+Use this option to highlight all uses of the identifier under the cursor
+(|:GoSameIds|) automatically. By default it's disabled. The delay can be
+configured with the |'g:go_updatetime'| setting.
+>
+ let g:go_auto_sameids = 0
+<
+ *'g:go_updatetime'*
+
+Use this option to configure the delay until it starts some jobs (see
+|'g:go_auto_type_info'|, |'g:go_auto_sameids'|). If set to 0, it uses the
+value from 'updatetime'. By default it's set to 800ms.
+>
+ let g:go_updatetime = 800
+<
+ *'g:go_jump_to_error'*
+
+Use this option to enable/disable passing the bang attribute to the mappings
+(e.g. |(go-build)|, |(go-run)|, etc.) and the metalinter on save. When
+enabled it will jump to the first error automatically (means it will NOT pass
+the bang attribute to the appropriate command, i.e: (go-run) -> :GoRun ).
+Note, that calling this doesn't have any affect on calling the commands
+manually. This setting is only useful for changing the behaviour of our custom
+static mappings. By default it's enabled.
+>
+ let g:go_jump_to_error = 1
+<
+ *'g:go_fmt_autosave'*
+
+Use this option to auto |:GoFmt| on save. When both 'g:go_imports_autosave'
+and 'g:go_fmt_autosave' are enabled and both 'g:go_fmt_command' and
+'g:go_imports_mode' are set to `goimports`, `goimports` will be run only once.
+By default it's enabled >
+
+ let g:go_fmt_autosave = 1
+<
+ *'g:go_fmt_command'*
+
+Use this option to define which tool is used to format code. Valid options are
+`gofmt`, `goimports`, and `gopls`. By default `gofmt` is used.
+>
+
+ let g:go_fmt_command = "gofmt"
+<
+ *'g:go_fmt_options'*
+
+Use this option to add additional options to the |'g:go_fmt_command'|. It's
+value type can be either a string or a dictionary. This is due backwards
+compatibility. The string version will be removed in the future so please use
+the dictionary version. Default is empty.
+>
+ let g:go_fmt_options = ''
+
+ or
+
+ let g:go_fmt_options = {}
+<
+The dictionary version allows you to define options for multiple binaries:
+>
+ let g:go_fmt_options = {
+ \ 'gofmt': '-s',
+ \ 'goimports': '-local mycompany.com',
+ \ }
+<
+ *'b:go_fmt_options'*
+
+This option is identical to |'g:go_fmt_options'|, but a buffer-level setting.
+If present, it's used instead of the global setting. By default it is not set.
+
+As an example, the following autocmd will configure goimports to put imports
+of packages from the current module in their own group:
+>
+ autocmd FileType go let b:go_fmt_options = {
+ \ 'goimports': '-local ' .
+ \ trim(system('{cd '. shellescape(expand('%:h')) .' && go list -m;}')),
+ \ }
+<
+ *'g:go_fmt_fail_silently'*
+
+Use this option to disable showing a location list when |'g:go_fmt_command'|
+fails. By default the location list is shown. >
+
+ let g:go_fmt_fail_silently = 0
+<
+ *'g:go_fmt_experimental'*
+
+Use this option to enable fmt's experimental mode. This experimental mode is
+superior to the current mode as it fully saves the undo history, so undo/redo
+doesn't break. However, it's slow (creates/deletes a file for every save) and
+it's causing problems on some Vim versions. This has no effect if
+`g:go_fmt_command` is set to `gopls`. By default it's disabled.
+>
+
+ let g:go_fmt_experimental = 0
+
+<
+
+ *'g:go_imports_autosave'*
+
+Use this option to auto |:GoImports| on save. When both
+'g:go_imports_autosave' and 'g:go_fmt_autosave' are enabled and both
+'g:go_fmt_command' and 'g:go_imports_mode' are set to `goimports`, `goimports`
+will be run only once. By default it's disabled.
+>
+ let g:go_imports_autosave = 0
+<
+ *'g:go_imports_mode'*
+
+Use this option to define which tool is used to adjust imports. Valid options
+are `goimports` and `gopls`. The buffer will not be formatted when this is set
+to `gopls`. By default `goimports` is used.
+>
+
+ let g:go_imports_mode = "goimports"
+<
+ *'g:go_mod_fmt_autosave'*
+
+Use this option to auto |:GoModFmt| on save. By default it's enabled >
+
+ let g:go_mod_fmt_autosave = 1
+<
+
+ *'g:go_doc_keywordprg_enabled'*
+
+Use this option to run `godoc` on words under the cursor with |K|; this will
+normally run the `man` program, but for Go using `godoc` is more idiomatic. It
+will not override the 'keywordprg' setting, but will run |:GoDoc|. Default
+is enabled. >
+
+ let g:go_doc_keywordprg_enabled = 1
+<
+ *'g:go_doc_height'*
+
+Maximum height for the GoDoc window created with |:GoDoc|. Default is 20. >
+
+ let g:go_doc_max_height = 20
+<
+
+ *'g:go_doc_url'*
+
+godoc server URL used when |:GoDocBrowser| is used. Change if you want to use
+a private internal service. Default is 'https://pkg.go.dev'.
+>
+ let g:go_doc_url = 'https://pkg.go.dev'
+<
+
+ *'g:go_doc_popup_window'*
+
+Use this option to use the popup-window for |K| and |:GoDoc|, rather than the
+|preview-window|. Default is disabled.
+>
+ let g:go_doc_popup_window = 0
+<
+
+ *'g:go_def_mode'*
+
+Use this option to define the command to be used for |:GoDef|. By default
+`gopls` is used, because it is the fastest. One might also use `guru` for its
+accuracy or `godef` for its performance. Valid options are `godef`, `gopls`,
+and `guru`.
+>
+ let g:go_def_mode = 'gopls'
+<
+ *'g:go_referrers_mode'*
+
+Use this option to define the command to be used for |:GoReferrers|. By
+default `gopls` is used, because it is the fastest and works with Go modules.
+One might also use `guru` for its ability to show references from other
+packages. This option will be removed after `gopls` can show references from
+other packages. Valid options are `gopls` and `guru`. By default it's `gopls`.
+>
+ let g:go_referrers_mode = 'gopls'
+<
+ *'g:go_implements_mode'*
+
+Use this option to define the command to be used for |:GoImplements|.
+The Implements feature in gopls is still new and being worked upon.
+Valid options are `gopls` and `guru`. By default it's `guru`.
+>
+ let g:go_implements_mode = 'guru'
+<
+ *'g:go_def_mapping_enabled'*
+
+Use this option to enable/disable the default mapping of CTRL-],
+<C-LeftMouse>, g<C-LeftMouse> and (`gd`) for GoDef and CTRL-t for :GoDefPop.
+Disabling it allows you to map something else to these keys or mappings.
+Default is enabled. >
+
+ let g:go_def_mapping_enabled = 1
+<
+ *'g:go_def_reuse_buffer'*
+
+Use this option to jump to an existing buffer for the split, vsplit and tab
+mappings of |:GoDef|. By default it's disabled. >
+
+ let g:go_def_reuse_buffer = 0
+<
+ *'g:go_bin_path'*
+
+Use this option to change default path for vim-go tools when using
+|:GoInstallBinaries| and |:GoUpdateBinaries|. If not set `$GOBIN` or
+`$GOPATH/bin` is used. >
+
+ let g:go_bin_path = ""
+<
+ *'g:go_search_bin_path_first'*
+
+This option lets |'g:go_bin_path'| (or its default value) take precedence over
+$PATH when invoking a tool command such as |:GoFmt| or |:GoImports|.
+
+Enabling this option ensures that the binaries installed via
+|:GoInstallBinaries| and |:GoUpdateBinaries| are the same ones that are
+invoked via the tool commands.
+
+By default it is enabled. >
+
+ let g:go_search_bin_path_first = 1
+<
+ *'g:go_snippet_engine'*
+
+Define the snippet engine to use. The default is to auto-detect one. Valid
+values are:
+
+ automatic Automatically detect a snippet engine.
+ ultisnips https://github.com/SirVer/ultisnips
+ neosnippet https://github.com/Shougo/neosnippet.vim
+ minisnip https://github.com/joereynolds/vim-minisnip
+ Note: the original at KeyboardFire/vim-minisnip won't work.
+>
+ let g:go_snippet_engine = "automatic"
+<
+ *'g:go_get_update'*
+
+Use this option to disable updating dependencies with |:GoInstallBinaries|. By
+default this is enabled.
+>
+ let g:go_get_update = 1
+<
+ *'g:go_guru_scope'*
+
+Use this option to define the scope of the analysis to be passed for guru
+related commands, such as |:GoImplements|, |:GoCallers|, etc. You can change
+it on-the-fly with |:GoGuruScope|. The input should be a a list of package
+pattern. An example input might be:
+`["github.com/fatih/color","github.com/fatih/structs"]`
+
+Also see |go-guru-scope|.
+
+By default it's not set, so the relevant commands' defaults are being used.
+>
+ let g:go_guru_scope = []
+<
+ *'g:go_build_tags'*
+
+Space-separated list of build tags passed to the `-tags` flag of tools that
+support it.
+There is also the |:GoBuildTags| convenience command to change or remove build
+tags.
+>
+ let g:go_build_tags = ''
+<
+ *'g:go_autodetect_gopath'*
+
+Automatically modify GOPATH for certain directory structures, such as for
+the `godep` tool which stores dependencies in the `Godeps` folder. What this
+means is that all tools are now working with the newly modified GOPATH. So
+|:GoDef| for example jumps to the source inside the `Godeps` (vendored)
+source. Currently `godep` and `gb` are supported. By default it's disabled.
+>
+ let g:go_autodetect_gopath = 0
+<
+ *'g:go_textobj_enabled'*
+
+Adds custom text objects. By default it's enabled. >
+
+ let g:go_textobj_enabled = 1
+<
+ *'g:go_textobj_include_function_doc'*
+
+Consider the comment above a function to be part of the function when using
+the `af` text object and `[[` motion. By default it's enabled. >
+
+ let g:go_textobj_include_function_doc = 1
+<
+ *'g:go_textobj_include_variable'*
+
+Consider the variable of an function assignment to be part of the anonymous
+function when using the `af` text object. By default it's enabled. >
+
+ let g:go_textobj_include_variable = 1
+<
+ *'g:go_metalinter_autosave'*
+
+Use this option to auto |:GoMetaLinter| on save. Only linter messages for
+the active buffer will be shown.
+
+By default, `golangci-lint` messages will be shown in the |location-list|
+window. The list to use can be set using |'g:go_list_type_commands'|.
+
+ By default it's disabled >
+ let g:go_metalinter_autosave = 0
+<
+ *'g:go_metalinter_autosave_enabled'*
+
+Specifies the enabled linters for auto |:GoMetaLinter| on save. By
+default it's using `vet` and `golint`. If any are enabled, `--disable-all`
+will be sent to the metalinter.
+>
+ let g:go_metalinter_autosave_enabled = ['vet', 'golint']
+<
+ *'g:go_metalinter_enabled'*
+
+Specifies the linters to enable for the |:GoMetaLinter| command. By default
+it's using `vet`, `golint` and `errcheck`. If any are enabled, `--disable-all`
+will be sent to the metalinter.
+>
+ let g:go_metalinter_enabled = ['vet', 'golint', 'errcheck']
+<
+ *'g:go_metalinter_command'*
+
+Overrides the command to be executed when |:GoMetaLinter| is called. By
+default it's `golangci-lint`. Valid options are `golangci-lint` and `gopls`.
+When the value is `gopls`, users may want to consider setting
+`g:go_gopls_staticcheck`. It can also be used as an advanced setting for
+users who want to have more control over the metalinter.
+>
+ let g:go_metalinter_command = "golangci-lint"
+<
+ *'g:go_metalinter_deadline'*
+
+Overrides the maximum time the linters have to complete. By default it's 5
+seconds.
+>
+ let g:go_metalinter_deadline = "5s"
+<
+ *'g:go_list_height'*
+
+Specifies the window height for the quickfix and location list windows. The
+default value (empty) automatically sets the height to the number of items
+(maximum up to 10 items to prevent large heights). Setting the value
+explicitly overrides this behavior. For standard Vim behavior, set it to 10.
+>
+ let g:go_list_height = 0
+<
+ *'g:go_list_type'*
+
+Specifies the type of list to use for command outputs (such as errors from
+builds, results from static analysis commands, etc...). The list type for
+specific commands can be overridden with |'g:go_list_type_commands'|. The
+default value (empty) will use the appropriate kind of list for the command
+that was called. Supported values are "", "quickfix", and "locationlist".
+>
+ let g:go_list_type = ""
+<
+
+ *'g:go_list_type_commands'*
+
+Specifies the type of list to use for command outputs (such as errors from
+builds, results from static analysis commands, etc...). When an expected key
+is not present in the dictionary, |'g:go_list_type'| will be used instead.
+Supported keys are "GoBuild", "GoErrCheck", "GoFmt", "GoModFmt", "GoInstall",
+"GoLint", "GoMetaLinter", "GoMetaLinterAutoSave", "GoModifyTags" (used for
+both :GoAddTags and :GoRemoveTags), "GoRename", "GoRun", and "GoTest".
+Supported values for each command are "quickfix" and "locationlist".
+>
+ let g:go_list_type_commands = {}
+<
+As an example, the following settings will change all list types to
+`locationlist` except for `:GoBuild` where `quickfix` is used:
+>
+ let g:go_list_type = "locationlist"
+ let g:go_list_type_commands = {"GoBuild": "quickfix"}
+<
+
+ *'g:go_list_autoclose'*
+
+Specifies whether the quickfix/location list should be closed automatically
+in the absence of errors. The default value is 1.
+If you prefer to keep a long running error window open, you can disable
+this by setting the value to 0.
+>
+ let g:go_list_autoclose = 1
+<
+ *'g:go_asmfmt_autosave'*
+
+Use this option to auto |:AsmFmt| on save. By default it's disabled. >
+
+ let g:go_asmfmt_autosave = 0
+<
+ *'g:go_term_mode'*
+
+The default command used to open a new terminal for go commands such as
+|:GoRun|. The default is `:vsplit`.
+
+Applicable to Neovim and Vim with `terminal` feature only.
+>
+ let g:go_term_mode = "vsplit"
+<
+ *'g:go_term_height'*
+ *'g:go_term_width'*
+
+Controls the height and width of a terminal split, respectively. By default
+these are not set, meaning that the height and width are set automatically by
+the editor. The height only applies to a horizontal split and width only
+applies to a vertical split.
+
+Applicable to Neovim and Vim with `terminal` feature only.
+
+For example here is how to set each to 30.
+>
+ let g:go_term_height = 30
+ let g:go_term_width = 30
+<
+ *'g:go_term_enabled'*
+
+Causes some types of jobs to run inside a new terminal according to
+|'g:go_term_mode'|. By default it is disabled.
+
+Applicable to Neovim and Vim with `terminal` feature only.
+>
+ let g:go_term_enabled = 0
+<
+ *'g:go_term_close_on_exit'*
+
+Closes the terminal after the command run in it exits when the command fails.
+By default it is enabled.
+
+Applicable to Neovim and Vim with `terminal` feature only.
+
+>
+ let g:go_term_close_on_exit = 1
+<
+ *'g:go_alternate_mode'*
+
+Specifies the command that |:GoAlternate| uses to open the alternate file. By
+default it is set to edit.
+>
+ let g:go_alternate_mode = "edit"
+<
+ *'g:go_rename_command'*
+
+Use this option to define which tool is used to rename. By default `gopls`
+is used. Valid options are `gorename` and `gopls`.
+>
+ let g:go_rename_command = 'gopls'
+<
+ *'g:go_gorename_prefill'*
+
+Expression to prefill the new identifier when using |:GoRename| without any
+arguments. Use an empty string if you don't want to prefill anything. By
+default it converts the identifier to camel case but preserves the
+capitalisation of the first letter to ensure that the exported state stays the
+same.
+>
+ let g:go_gorename_prefill = 'expand("<cword>") =~# "^[A-Z]"' .
+ \ '? go#util#pascalcase(expand("<cword>"))' .
+ \ ': go#util#camelcase(expand("<cword>"))'
+<
+
+ *'g:go_gopls_enabled'*
+
+Specifies whether `gopls` can be used by vim-go. By default gopls is enabled.
+When gopls is disabled completion will not work and other configuration
+options may also need to be adjusted.
+
+>
+ let g:go_gopls_enabled = 1
+<
+
+ *'g:go_gopls_options'*
+
+The commandline arguments to pass to gopls. By default, it's `-remote=auto`.
+>
+ let g:go_gopls_options = []
+<
+
+ *'g:go_gopls_analyses'*
+
+The analyses settings for `gopls`. By default, it's `v:null`. Valid map values
+are `v:true` and `v:false`.
+>
+ let g:go_gopls_analyses = v:null
+<
+
+ *'g:go_gopls_complete_unimported'*
+
+Specifies whether `gopls` should include suggestions from unimported packages.
+When it is `v:null`, `gopls`' default will be used. By default it is
+`v:null`.
+>
+ let g:go_gopls_complete_unimported = v:null
+<
+
+ *'g:go_gopls_deep_completion'*
+
+Specifies whether `gopls` should use deep completion. When it is `v:null`,
+`gopls`' default will be used. By default it is `v:null`.
+
+>
+ let g:go_gopls_deep_completion = v:null
+<
+
+ *'g:go_gopls_matcher'*
+
+Specifies how `gopls` should match for completions. Valid values are `v:null`,
+`fuzzy`, and `caseSensitive`. When it is `v:null`, `gopls`' default will be
+used. By default it is `v:null`.
+>
+ let g:go_gopls_matcher = v:null
+<
+
+ *'g:go_gopls_staticcheck'*
+
+Specifies whether `gopls` should run staticcheck checks. When it is `v:null`,
+`gopls`' default will be used. By default it is `v:null`.
+>
+ let g:go_gopls_staticcheck = v:null
+<
+
+ *'g:go_gopls_use_placeholders'*
+
+Specifies whether `gopls` can provide placeholders for function parameters and
+struct fields. When set, completion items will be treated as anonymous
+snippets if UltiSnips is installed and configured to be used as
+|'g:go_snippet_engine'|. When it is `v:null`, `gopls`' default will be used.
+By default it is `v:null`.
+>
+ let g:go_gopls_use_placeholders = v:null
+<
+
+ *'g:go_gopls_temp_modfile'*
+
+Specifies whether `gopls` should use a temp modfile and suggest edits rather
+than modifying the ambient go.mod file. When it is `v:null`, `gopls`' default
+will be used. By default it is `v:null`.
+>
+ let g:go_gopls_temp_modfile = v:null
+<
+
+ *'g:go_gopls_local'*
+
+Specifies the prefix for imports that `gopls` should consider group
+separately. When it is `v:null`, `gopls`' default will be used. By default it
+is `v:null`.
+>
+ let g:go_gopls_local = v:null
+<
+
+ *'g:go_diagnostics_enabled'*
+
+Specifies whether `gopls` diagnostics are enabled. Only the diagnostics for
+the current buffer will be processed when it is not set; all others will be
+ignored. By default it is disabled.
+>
+ let g:go_diagnostics_enabled = 0
+<
+
+ *'g:go_template_autocreate'*
+
+When a new Go file is created, vim-go automatically fills the buffer content
+with a Go code template. By default, the templates under the `templates`
+folder are used. This can be changed with the |'g:go_template_file'| and
+|'g:go_template_test_file'| settings to either use a different file in the
+same `templates` folder, or to use a file stored elsewhere.
+
+If the new file is created in an already prepopulated package (with other Go
+files), in this case a Go code template with only the Go package declaration
+(which is automatically determined according to the current package) is added.
+
+To always use the package name instead of the template, enable the
+|'g:go_template_use_pkg'| setting.
+
+By default it is enabled.
+>
+ let g:go_template_autocreate = 1
+<
+ *'g:go_template_file'*
+
+Specifies either the file under the `templates` folder that is used if a new
+Go file is created. Checkout |'g:go_template_autocreate'| for more info. By
+default the `hello_world.go` file is used.
+
+This variable can be set to an absolute path, so the template files don't have
+to be stored inside the vim-go directory structure. Useful when you want to
+use different templates for different projects.
+>
+ let g:go_template_file = "hello_world.go"
+<
+ *'g:go_template_test_file'*
+
+Like with |'g:go_template_file'|, this specifies the file to use for test
+tempaltes. The template file should be under the `templates` folder,
+alternatively absolute paths can be used, too. Checkout
+|'g:go_template_autocreate'| for more info. By default, the
+`hello_world_test.go` file is used.
+>
+ let g:go_template_test_file = "hello_world_test.go"
+<
+ *'g:go_template_use_pkg'*
+
+Specifies that, rather than using a template, the package name is used if a
+new Go file is created. Checkout |'g:go_template_autocreate'| for more info.
+By default the template file specified by |'g:go_template_file'| is used.
+
+>
+ let g:go_template_use_pkg = 0
+<
+ *'g:go_decls_includes'*
+
+Only useful if `ctrlp.vim`, `unite.vim`, `denite.nvim` or `fzf` are installed.
+This sets which declarations to show for |:GoDecls| (`ctrp.vim`),
+|unite-decls| (`unite.vim`) and |denite-decls| (`denite.nvim`). It is a Comma
+delimited list. Possible options are: {func,type}. The default is: >
+
+ let g:go_decls_includes = 'func,type'
+<
+ *'g:go_decls_mode'*
+
+Define the tool to be used for |:GoDecls|. Valid options are `ctrlp.vim`,
+`fzf`, or an empty string; in which case it will try to autodetect either
+`ctrlp.vim` or `fzf`.
+>
+ let g:go_decls_mode = ''
+<
+ *'g:go_echo_command_info'*
+
+Echoes information about various Go commands, such as `:GoBuild`, `:GoTest`,
+`:GoCoverage`, etc... Useful to disable if you use the statusline integration,
+i.e: |go#statusline#Show()|. By default it's enabled
+>
+ let g:go_echo_command_info = 1
+<
+ *'g:go_echo_go_info'*
+
+Use this option to show the identifier information when code completion is
+done. By default it's enabled. >
+
+ let g:go_echo_go_info = 1
+<
+Please note that 'noshowmode' must be set for this feature to work correctly.
+
+ *'g:go_statusline_duration'*
+
+Specifies the duration of statusline information being showed per package. By
+default it's 60 seconds. Must be in milliseconds.
+>
+ let g:go_statusline_duration = 60000
+<
+ *'g:go_addtags_transform'*
+
+Sets the `transform` option for `gomodifytags` when using |:GoAddTags| or if
+it's being used for snippet expansion of single fields. Possible options are:
+`snakecase`, `camelcase`, `lispcase`, `pascalcase`, `keep`. For the following
+case, if `snakecase` is used the field will be transformed to:
+>
+ type T struct {
+ FooBarQuz string `json:"foo_bar_quz"`
+ }
+<
+
+If "camelcase" is used:
+>
+ type T struct {
+ FooBarQuz string `json:"fooBarQuz"`
+ }
+<
+By default "snakecase" is used. Current values are: ["snakecase",
+"camelcase", "lispcase", "pascalcase", "keep"].
+>
+ let g:go_addtags_transform = 'snakecase'
+<
+ *'g:go_addtags_skip_unexported'*
+
+Sets the `skip-unexported` option for `gomodifytags` when using |:GoAddTags|.
+If set it will prevent `gomodifytags` from adding tags to unexported fields:
+>
+ type T struct {
+ FooBar string `json:"foo_bar"`
+ quz string
+ }
+<
+By default it is disabled.
+>
+ let g:go_addtags_skip_unexported = 0
+<
+ *'g:go_debug'*
+
+A list of options to debug; useful for development and/or reporting bugs.
+
+Currently accepted values:
+
+ shell-commands Echo all shell commands that vim-go runs.
+ debugger-state Expose debugger state in 'g:go_debug_diag'.
+ debugger-commands Echo communication between vim-go and `dlv`; requests and
+ responses are recorded in `g:go_debug_commands`.
+ lsp Echo communication between vim-go and `gopls`. All
+ communication is shown in a dedicated window. When
+ enabled before gopls is started, |:GoLSPDebugBrowser| can
+ be used to open a browser window to help debug gopls.
+>
+ let g:go_debug = []
+<
+
+==============================================================================
+SYNTAX HIGHLIGHTING *ft-go-syntax* *go-syntax*
+
+vim-go comes with an enhanced version of Vim's Go syntax highlighting. It
+comes with a number of features, most of which are disabled by default.
+
+The recommended settings are the default values. If you're experiencing
+slowdowns in Go files and you enabled some of these options then try disabling
+them; some can be resource intensive.
+
+ *'g:go_fold_enable'*
+
+Control syntax-based folding which takes effect when 'foldmethod' is set to
+`syntax`.
+You can enable specific fold regions by setting an array. Possible values are:
+
+ block `{` .. `}` blocks.
+ import `import` block.
+ varconst `var` and `const` blocks.
+ package_comment The package comment.
+ comment Any comment that is not the package comment.
+
+By default all except "comment" are enabled:
+>
+ let g:go_fold_enable = ['block', 'import', 'varconst', 'package_comment']
+<
+Enable folding of only imports:
+>
+ let g:go_fold_enable = ['import']
+<
+Disable everything (same as not setting 'foldmethod' to `syntax`):
+>
+ let g:go_fold_enable = []
+<
+ *'g:go_highlight_array_whitespace_error'*
+
+Highlight white space after `[]`. >
+
+ let g:go_highlight_array_whitespace_error = 0
+<
+ *'g:go_highlight_chan_whitespace_error'*
+
+Highlight white space around the receive operator (`<-`) that doesn't follow
+the standard style. >
+
+ let g:go_highlight_chan_whitespace_error = 0
+<
+ *'g:go_highlight_extra_types'*
+
+Highlight commonly used library types (`io.Reader`, etc.). >
+
+ let g:go_highlight_extra_types = 0
+<
+ *'g:go_highlight_space_tab_error'*
+
+Highlight instances of tabs following spaces. >
+
+ let g:go_highlight_space_tab_error = 0
+<
+ *'g:go_highlight_trailing_whitespace_error'*
+
+Highlight trailing white space. >
+
+ let g:go_highlight_trailing_whitespace_error = 0
+<
+ *'g:go_highlight_operators'*
+
+Highlight operators such as `:=` , `==`, `-=`, etc.
+>
+ let g:go_highlight_operators = 0
+<
+ *'g:go_highlight_functions'*
+
+Highlight function and method declarations.
+>
+ let g:go_highlight_functions = 0
+<
+ *'g:go_highlight_function_parameters'*
+
+Highlight the variable names in parameters (including named return parameters)
+in function declarations. Setting this implies the functionality from
+|'g:go_highlight_functions'|.
+>
+ let g:go_highlight_function_parameters = 0
+<
+ *'g:go_highlight_function_calls'*
+
+Highlight function and method calls.
+>
+ let g:go_highlight_function_calls = 0
+<
+ *'g:go_highlight_types'*
+
+Highlight struct and interface names.
+>
+ let g:go_highlight_types = 0
+<
+ *'g:go_highlight_fields'*
+
+Highlight struct field names.
+>
+ let g:go_highlight_fields = 0
+<
+ *'g:go_highlight_build_constraints'*
+
+Highlights build constraints.
+>
+ let g:go_highlight_build_constraints = 0
+<
+ *'g:go_highlight_generate_tags'*
+
+Highlight go:generate directives.
+>
+ let g:go_highlight_generate_tags = 0
+<
+ *'g:go_highlight_string_spellcheck'*
+
+Highlight spelling errors in strings when |spell| is enabled.
+>
+ let g:go_highlight_string_spellcheck = 1
+<
+ *'g:go_highlight_format_strings'*
+
+Highlight printf-style formatting verbs inside string literals.
+>
+ let g:go_highlight_format_strings = 1
+<
+ *'g:go_highlight_variable_declarations'*
+
+Highlight variable names in variable declarations (`x` in ` x :=`).
+>
+ let g:go_highlight_variable_declarations = 0
+<
+ *'g:go_highlight_variable_assignments'*
+
+Highlight variable names in variable assignments (`x` in `x =`).
+>
+ let g:go_highlight_variable_assignments = 0
+<
+ *'g:go_highlight_diagnostic_errors'*
+
+Highlight diagnostic errors.
+>
+ let g:go_highlight_diagnostic_errors = 1
+<
+ *'g:go_highlight_diagnostic_warnings'*
+
+Highlight diagnostic warnings.
+>
+ let g:go_highlight_diagnostic_warnings = 1
+<
+
+==============================================================================
+ *gohtmltmpl* *ft-gohtmltmpl-syntax*
+ *gotexttmpl* *ft-gotexttmpl-syntax*
+Go template syntax~
+
+The `gotexttmpl` 'filetype' provides syntax highlighting and indentation for
+Go's `text/template` package.
+
+The `gohtmltmpl` filetype is for use with the `html/template` package and is
+identical to `gotexttmpl` except that it will also load the standard `html`
+filetype.
+
+The `gohtmltmpl` filetype is automatically set for `*.tmpl` files; the
+`gotexttmpl` is never automatically set and needs to be set manually.
+
+==============================================================================
+ *gomod* *ft-gomod-syntax*
+go.mod file syntax~
+
+The `gomod` 'filetype' provides syntax highlighting for Go's module file
+`go.mod`
+
+
+==============================================================================
+DEBUGGER *go-debug*
+
+Vim-go comes with a special "debugger mode". This starts a `dlv` process in
+the background and provides various commands to communicate with it.
+
+This debugger is similar to Visual Studio or Eclipse and has the following
+features:
+
+ * Show stack trace and jumps.
+ * List local variables.
+ * List function arguments.
+ * Expand values of struct or array/slice.
+ * Show balloon on the symbol.
+ * Show output of stdout/stderr.
+ * Toggle breakpoint.
+ * Stack operation continue/next/step out.
+
+This feature requires either Vim 8.0.0087 or newer with the |+job| feature or
+Neovim. This features also requires Delve 1.0.0 or newer, and it is
+recommended to use Go 1.10 or newer, as its new caching will speed up
+recompiles.
+
+ *go-debug-intro*
+GETTING STARTED WITH THE DEBUGGER~
+
+Use |:GoDebugStart| or |:GoDebugTest| to start the debugger. The first
+argument is the package name, and any arguments after that will be passed on
+to the program; for example:
+>
+ :GoDebugStart . -someflag value
+<
+This may take few seconds. After the code is compiled you'll see three new
+windows: the stack trace on left side, the variable list on the bottom-left,
+and program output at the bottom.
+
+You can add breakpoints with |:GoDebugBreakpoint| (<F9>) and run your program
+with |:GoDebugContinue| (<F5>).
+
+The program will halt on the breakpoint, at which point you can inspect the
+program state. You can go to the next line with |:GoDebugNext| (<F10>) or step
+in with |:GoDebugStep| (<F11>).
+
+The variable window in the bottom left (`GODEBUG_VARIABLES`) will display all
+local variables. Struct values are displayed as `{...}`, array/slices as
+`[4]`. Use <CR> on the variable name to expand the values.
+
+The `GODEBUG_OUTPUT` window displays output from the program and the Delve
+debugger.
+
+The `GODEBUG_STACKTRACE` window can be used to jump to different places in the
+call stack.
+
+When you're done use |:GoDebugStop| to close the debugging windows and halt
+the `dlv` process, or |:GoDebugRestart| to recompile the code.
+
+ *go-debug-commands*
+DEBUGGER COMMANDS~
+
+Only |:GoDebugStart|, `:GoDebugTest`, and |:GoDebugBreakpoint| are available
+by default. `:GoDebugContinue` becomes available after running `:GoDebugStart`
+or `:GoDebugTest`. The rest of the commands and mappings become available
+after executing `:GoDebugContinue`.
+
+ *:GoDebugStart*
+:GoDebugStart [pkg] [program-args]
+
+ Start the debug mode for [pkg]; this does several things:
+
+ * Setup the debug windows according to |'g:go_debug_windows'|.
+ * Make the `:GoDebug*` commands and `(go-debug-*)` mappings available.
+
+ The directory of the current buffer is used if [pkg] is empty. Any other
+ arguments will be passed to the program.
+
+ Use |:GoDebugStop| to stop `dlv` and exit debugging mode.
+
+ *:GoDebugTest*
+:GoDebugTest [pkg] [program-args]
+
+ Behaves the same as |:GoDebugStart| but runs `dlv test` instead of
+ `dlv debug` so you can debug tests.
+
+ Use `-test.flag` to pass flags to `go test` when debugging a test; for
+ example `-test.v` or `-test.run TestFoo`
+
+ *:GoDebugRestart*
+:GoDebugRestart
+
+ Stop the program (if running) and restart `dlv` to recompile the package.
+ The current window layout and breakpoints will be left intact.
+
+ *:GoDebugStop*
+ *(go-debug-stop)*
+:GoDebugStop
+
+ Stop `dlv` and remove all debug-specific commands, mappings, and windows.
+
+ *:GoDebugBreakpoint*
+ *(go-debug-breakpoint)*
+:GoDebugBreakpoint [linenr]
+
+ Toggle breakpoint for the [linenr]. [linenr] defaults to the current line
+ if it is omitted. A line with a breakpoint will have the
+ {godebugbreakpoint} |:sign| placed on it. The line the program is
+ currently halted on will have the {godebugcurline} sign.
+
+ *hl-GoDebugCurrent* *hl-GoDebugBreakpoint*
+ A line with a breakpoint will be highlighted with the {GoDebugBreakpoint}
+ group; the line the program is currently halted on will be highlighted
+ with {GoDebugCurrent}.
+
+ Mapped to <F9> by default.
+
+ *:GoDebugContinue*
+ *(go-debug-continue)*
+:GoDebugContinue
+
+ Continue execution until breakpoint or program termination. It will start
+ the program if it hasn't been started yet.
+
+ Mapped to <F5> by default.
+
+ *:GoDebugNext*
+ *(go-debug-next)*
+:GoDebugNext
+
+ Advance execution by one line, also called "step over" by some other
+ debuggers.
+
+ Mapped to <F10> by default.
+
+ *:GoDebugStep*
+ *(go-debug-step)*
+:GoDebugStep
+
+ Advance execution by one step, stopping at the next line of code that will
+ be executed (regardless of location).
+
+ Mapped to <F11> by default.
+
+ *:GoDebugStepOut*
+ *(go-debug-stepout)*
+
+:GoDebugStepOut
+
+ Run all the code in the current function and halt when the function
+ returns ("step out of the current function").
+
+ *:GoDebugSet*
+:GoDebugSet {var} {value}
+
+ Set the variable {var} to {value}. Example:
+>
+ :GoDebugSet truth 42
+<
+ This only works for `float`, `int` and variants, `uint` and variants,
+ `bool`, and pointers (this is a `delve` limitation, not a vim-go
+ limitation).
+
+ *:GoDebugPrint*
+ *(go-debug-print)*
+:GoDebugPrint {expr}
+
+ Print the result of a Go expression.
+>
+ :GoDebugPrint truth == 42
+ truth == 42 true
+<
+ Mapped to <F6> by default, which will evaluate the <cword> under the
+ cursor.
+
+ *go-debug-settings*
+DEBUGGER SETTINGS~
+
+ *'g:go_debug_windows'*
+
+Controls the window layout for debugging mode. This is a |dict| with four
+possible keys: "vars", "stack", "goroutines", and "out"; each of the new
+windows will be created in that that order with the commands in the value. The
+current window is made the only window before creating the debug windows.
+
+A window will not be created if a key is missing or empty.
+
+Defaults:
+>
+ let g:go_debug_windows = {
+ \ 'vars': 'leftabove 30vnew',
+ \ 'stack': 'leftabove 20new',
+ \ 'goroutines': 'botright 10new',
+ \ 'out': 'botright 5new',
+ \ }
+<
+Show only variables on the right-hand side: >
+
+ let g:go_debug_windows = {
+ \ 'vars': 'rightbelow 60vnew',
+ \ }
+<
+ *'g:go_debug_address'*
+
+Server address `dlv` will listen on; must be in `hostname:port` format.
+Defaults to `127.0.0.1:8181`:
+>
+ let g:go_debug_address = '127.0.0.1:8181'
+<
+
+ *'g:go_debug_log_output'*
+
+Specifies log output options for `dlv`. Value should be a single string of
+comma-separated options suitable for passing to `dlv`. An empty string (`''`)
+will suppress logging entirely. Default: `'debugger,rpc'`:
+>
+ let g:go_debug_log_output = 'debugger,rpc'
+<
+
+ *'g:go_highlight_debug'*
+
+Highlight the current line and breakpoints in the debugger.
+
+>
+ let g:go_highlight_debug = 1
+<
+
+ *'go:go_debug_breakpoint_sign_text'*
+
+Set the sign text used for breakpoints in the debugger. By default it's '>'.
+
+>
+ let g:go_debug_breakpoint_sign_text = '>'
+<
+
+==============================================================================
+FAQ TROUBLESHOOTING *go-troubleshooting*
+
+How do I troubleshoot problems?~
+
+One of the best ways to understand what vim-go is doing and the output from
+the tools to which it delegates is to use leverage the features described in
+|'g:go_debug'|.
+
+Completion and other functions that use `gopls` don't work~
+
+Vim-go is heavily reliant on `gopls` for completion and other functionality.
+Many of the features that use `gopls` (e.g. completion, jumping to
+definitions, showing identifier information, et al.) can be configured to
+delegate to other tools. e.g. completion via 'omnifunc', |'g:go_info_mode'|
+and |'g:go_def_mode'| can be set to use other tools for now (though some of
+the alternatives to `gopls` are effectively at their end of life and support
+for them from within vim-go may be removed soon).
+
+I want to disable `gopls`~
+
+Vim-go's use of `gopls` can be disabled with 'g:go_gopls_enabled'.
+
+Some users want to do this to limit the load on their system when using vim-go
+concurrently with an LSP client like vim-lsp. Instead of disabling vim-go's
+use of `gopls`, you may prefer to configure vim-go to share the `gopls`
+instance with other LSP plugins. 'g:go_gopls_options' can be used to configure
+how vim-go starts `gopls` so that the instance can be shared with other
+plugins and vim-go user's can leverage the full power of vim-go.
+
+I get a "Unknown function: go#config#..." error~
+
+This often happens to vim-polyglot users when new config options are added to
+vim-go. Run vim-polyglot's `build` script or make sure that vim-go is loaded
+before vim-polyglot.
+
+It can also happen when multiple versions of vim-go are installed and the
+version loaded by Vim doesn't have a function introduced by a later version.
+To see where vim-go is being loaded from run
+>
+ :verbose function go#config#FmtAutosave
+<
+
+The output will show the path to the `autoload/go/config.vim` that was loaded
+by Vim. Make sure the root of the path to output by the command is the path
+from which vim-go is expected to sourced. If it is not rooted as expected,
+then there are multiple copies of vim-go installed; remove the unexpected
+copies.
+
+I get "not an editor command" error when I invoke :GoXXX~
+
+This happens if vim-go is not installed properly. Be sure you have added this
+line into your vimrc:
+>
+ filetype plugin indent on
+<
+
+I get a "command not found" error when I invoke :GoXXX~
+
+If you try to call |:GoDef|, |:GoInfo| and get a command not found, check that
+you have the binaries installed by using |:GoInstallBinaries|.
+
+Before opening vim, check your current $PATH:
+>
+ echo $PATH
+<
+After opening vim, run `:echo $PATH`, the output must be your current `$PATH`
+plus `$GOPATH/bin` (the location where |:GoInstallBinaries| installed the
+binaries).
+
+ *go-guru-scope*
+What is the guru scope and how do I set it?~
+
+Many vim-go commands use the `guru` commandline tool to get information. Some
+`guru` commands require an expensive analysis of the source code. To still get
+a reasonable amount of performance `guru` limits this analysis to a selected
+list of packages. This is known as the "guru scope".
+
+The default is to use the package the current buffer belongs to, but this may
+not always be correct. For example for the file `guthub.com/user/pkg/a/a.go`
+the scope will be set to `github.com/user/pkg/a`, but you probably want
+`github.com/user/pkg`
+
+Guessing what package(s) you do want is not easy so you may need to set this
+manually, usually from an |autocommand|:
+>
+ autocmd BufRead /home/martin/go/src/github.com/user/pkg/*.go
+ \ :GoGuruScope github.com/user/pkg
+<
+
+If you have a lot of packages with the same prefix (`github.com/user`) you can
+use a single autocommand:
+>
+ autocmd BufRead /home/martin/go/src/*.go
+ \ let s:tmp = matchlist(expand('%:p'),
+ \ '/home/martin/go/src/\(github.com/user/[^/]\+\)')
+ \| if len(s:tmp) > 1 | exe 'silent :GoGuruScope ' . s:tmp[1] | endif
+ \| unlet s:tmp
+<
+Also see |:GoGuruScope| and |'g:go_guru_scope'|.
+
+
+Vim becomes slow while editing Go files~
+
+The most common cause for this is using an older version of Vim that doesn't
+support asynchronous jobs. |'g:go_auto_sameids'| and |'g:go_auto_type_info'|
+run jobs that can cause noticable delays when used with vim74. The problem is
+most pronounced on vim74, but can occur on vim8 and nvim. On vim8 and nvim,
+the problem should be restricted to a short period when the first buffer in a
+package is first loaded.
+
+If you see unexpected characters rendered in the current window, the problem
+is most likely due to |'g:go_auto_sameids'| or |'g:go_auto_type_info'|. First,
+try using another mode for |'g:go_info_mode'|. If that doesn't work, try
+disabling |'g:go_auto_sameids'| and |'g:go_auto_type_info'|.
+
+To a lesser extent, this can be caused by `g:go_highlight_*` options. If Vim
+is just slower than normal, but doesn't render unexpected characters in the
+currrent window, then the problem is most likely the `g:go_highlight_*`
+options. Try disabling them if you've enabled some of them.
+
+I get errors when using GoInstallBinaries~
+
+If you see errors like this:
+>
+ Error installing golang.org/x/tools/cmd/goimports
+<
+that means your local Go setup is broken or the remote website is down. For
+example sometimes code.google.com times out. To test, just execute a simple
+`go get`:
+>
+ go get golang.org/x/tools/cmd/goimports
+<
+You'll see a more detailed error. If this works, vim-go will work too.
+
+
+I want to use a different binary name than "go", can I do this?~
+
+There is no way to directly configure the binary name; but you can use a
+wrapper script; for example if you would like to run `goapp` instead of `go`:
+
+1. In `~/gobin/go` (remember to make it executable):
+>
+ #!/bin/sh
+ # Remove gobin from PATH and run goapp.
+ PATH=${PATH#$HOME/gobin} goapp "$@"
+<
+2. Start Vim with `~/gobin` as the first `PATH` entry so it will use the
+ wrapper script:
+>
+ PATH="$HOME/gobin/:$PATH" vim
+<
+ Alternatively you you could set `$PATH` in your vimrc with an |:autocmd|.
+
+
+How do I use vim-go with syntastic?~
+
+Sometimes when using both `vim-go` and `syntastic` Vim will start lagging
+while saving and opening files. The following fixes this:
+>
+ let g:syntastic_go_checkers = ['golint', 'govet']
+ let g:syntastic_mode_map = { 'mode': 'active', 'passive_filetypes': ['go'] }
+<
+If you want to add errcheck you can use golangci-lint as a wrapper:
+>
+ let g:syntastic_go_checkers = ['golint', 'govet', 'golangci-lint']
+ let g:syntastic_go_gometalinter_args = ['--disable-all', '--enable=errcheck']
+ let g:syntastic_mode_map = { 'mode': 'active', 'passive_filetypes': ['go'] }
+<
+Another issue with `vim-go` and `syntastic` is that the location list window
+that contains the output of commands such as `:GoBuild` and `:GoTest` might
+not appear. To resolve this:
+>
+ let g:go_list_type = "quickfix"
+<
+
+How do I run focused ginkgo tests?~
+
+You must set this environment variable in your `.vimrc`:
+>
+ let $GINKGO_EDITOR_INTEGRATION = "true"
+<
+
+Using with NeoVim~
+
+Note: Neovim currently is not a first class citizen for vim-go. You are free
+to open bug, however I'm not using Neovim so it's hard for me to test it.
+vim-go might not work as well in Neovim as it does in Vim. I'm happy to accept
+pull requests or very detailed bug reports. If you're interested to improve
+the state of Neovim in vim-go you're always welcome!
+
+Run `:GoRun` in a new tab, horizontal split or vertical split terminal
+>
+ au FileType go nmap <leader>rt <Plug>(go-run-tab)
+ au FileType go nmap <leader>rs <Plug>(go-run-split)
+ au FileType go nmap <leader>rv <Plug>(go-run-vertical)
+<
+By default new terminals are opened in a vertical split. To change it
+>
+ let g:go_term_mode = "split"
+>
+
+How can I customize the highlighting?~
+
+All the highlight groups used by vim-go are prefixed with `go` (e.g.
+`goType`) and are defined in the files in the `syntax` directory. To change
+the highlighting for any group, add a `highlight` command for the group to
+your vimrc. To turn off the highlighting for any group, add `highlight link
+group-name NONE` (where `group-name` is the name of the group whose highlight
+you'd like to turn off) to your vimrc.
+
+Some people may wish to highlight Go's builtins as keywords. To do so, one
+should simply add `highlight link goBuiltins Keyword` to the `vimrc` file.
+
+==============================================================================
+DEVELOPMENT *go-development*
+
+vim-go supports test files written in VimScript; the way they're run is
+roughly similar to Go tests:
+
+- A `*.vim` file has a corresponding `*_test.vim`.
+- All functions starting with `Test_` are run as test.
+- A test is considered to be "failed" if |v:errors| has any entries. You can
+ use one of the |test-functions| to set this, or append to it directly.
+
+A simple example:
+>
+ function Test_run_fmt()
+ call assert_equal(expected, actual)
+ ...
+ endfunction
+<
+To run tests vim-go comes with three small helper scripts:
+
+ `scripts/install-vim` Install a pristine Vim to `/tmp/vim-go-test/`.
+ `scripts/run-vim` Run a Vim version from `/tmp/vim-go-test/`.
+ `scripts/test` Run all tests with a Vim from `/tmp/vim-go-test/`.
+
+All scripts accept a Vim version as the first argument, which can be
+`vim-8.0` or `nvim`. You will need to install a Vim version with
+`install-vim` before you can use `run-vim` or `test`.
+
+You can install and test all Vim versions by running `make`.
+
+
+==============================================================================
+DONATION *go-donation*
+
+People have asked for this for a long time, now you can be a fully supporter
+by being a patreon at: https://www.patreon.com/bhcleek
+
+By being a patron, you are enabling vim-go to grow and mature, helping me to
+invest in bug fixes, new documentation, and improving both current and future
+features. It's completely optional and is just a direct way to support
+vim-go's ongoing development. Thanks!
+
+Check it out: https://www.patreon.com/bhcleek
+
+
+==============================================================================
+CREDITS *go-credits*
+
+* Go Authors for official Vim plugins.
+* Gocode, Godef, Golint, Guru, Goimports, Errcheck projects and authors of
+ those projects.
+* Other vim-plugins, thanks for inspiration (vim-golang, go.vim, vim-gocode,
+ vim-godef).
+* vim-go contributors: https://github.com/fatih/vim-go/graphs/contributors.
+
+
+ vim: ft=help tw=78 et ts=2 sw=2 sts=2 norl
+
+endif