fatih/vim-go: Go editing inside Vim, from :GoBuild to gopls
Go development plugin for Vim
At a glance
- What is it?
- vim-go is the long-running Vim plugin that wires Go compilation, testing, debugging and gopls language-server features into the editor. It is for Vim and Neovim users who want Go tooling without leaving their terminal, and it asks for a recent Vim or Neovim plus a set of installed binaries.
- Who is it for?
- Adopt vim-go if you already live in Vim or Neovim, are on Vim 8.2.5072 or newer, and want build, test, debug and gopls features driven by ex commands rather than a separate editor. Do not adopt it if you are not a Vim user, if you cannot run :GoInstallBinaries to place the tool binaries, or if you expect the master branch to behave like a release.
- Can I use it commercially?
- Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
- Is it still maintained?
- Yes. The repository last received commits 37 days ago.
- What is it written in?
- Mainly Vim Script, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 29, 2026, and from our analysis. They are not legal advice.
Editorial analysis
What problem vim-go solves for Go developers who use Vim
Go's toolchain is command-line first, and Vim has no built-in knowledge of it. Without a plugin, you leave the editor to run go build, go test, go vet or a debugger, then come back and re-read the output in a terminal scrollback. vim-go closes that loop by exposing the toolchain as ex commands: :GoBuild compiles the package, :GoInstall installs it, :GoTest runs the package tests and :GoTestFunc runs a single test function. :GoRun executes the current file. The README lists these as the plugin's headline features, and the full set lives in doc/vim-go.txt.
The audience is narrow and specific: people who already edit Go in Vim or Neovim and do not want to switch editors to get language-server behaviour. The plugin also covers the parts of Go that are tedious by hand. :GoImport adds an import, :GoDrop removes one, :GoRename performs a type-safe rename of an identifier, :GoCoverage shows which code the tests exercise, and :GoAddTags and :GoRemoveTags manage struct field tags. If none of that maps to how you work, the plugin has little to offer you.
How the plugin is put together: VimL commands over external Go tools
The repository is a Vim runtime-path plugin, not a Go program. The top-level layout confirms it: autoload/, plugin/, ftplugin/, indent/, syntax/, compiler/, ftdetect/, gosnippets/ and rplugin/ are the standard directories a Vim plugin uses to hook into filetype detection, indentation, syntax highlighting and command definitions. The primary language is Vim Script. There is no compiled artifact to ship.
The mechanism is delegation. vim-go defines commands and mappings in VimL, then shells out to Go binaries to do the real work. The README states that :GoInstallBinaries will go install all the required binaries, so the plugin is a thin coordination layer: it decides which tool to call, with which arguments, and how to present the result in a quickfix list, a preview window or a location list. Debugging follows the same pattern through integrated delve support behind :GoDebugStart.
The language-server path is the interesting part of the architecture. vim-go integrates with gopls, and the README notes two design choices that matter for anyone running several plugins: the gopls instance can be shared with other Vim plugins, and vim-go's use of gopls can be disabled so alternative tools are used instead. That second point is unusual for editor plugins, which usually hard-wire their language server. Here the server is optional, and advanced source analysis such as :GoImplements, :GoCallees and :GoReferrers is described as utilising gopls. There are also integrations with Tagbar through gotags and with snippet engines including Ultisnips.
Installing vim-go and running a first build
The README states the minimum requirements plainly: Vim 8.2.5072 or Neovim 0.4.0. It also recommends the latest stable release over the master branch, which it calls a development branch. Pick your package manager from the list and clone accordingly. For Vim 8 packages the README gives this line:
git clone https://github.com/fatih/vim-go.git ~/.vim/pack/plugins/start/vim-goNeovim users get a different path, and vim-plug users get a Plug line that installs binaries as part of the plugin install:
git clone https://github.com/fatih/vim-go.git ~/.local/share/nvim/site/pack/plugins/start/vim-goPlug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' }After the plugin is on the runtime path, the binaries still need to exist. The README says vim-go makes this easy with :GoInstallBinaries, which go installs all required binaries. Run it once from inside Vim. Depending on how you installed, help tags may need generating manually; the README suggests :helptags ALL for that. To confirm the documentation is reachable, open a Go file and run :help vim-go.
With a Go file open, :GoBuild compiles the current package. Errors should land in Vim's quickfix list rather than a terminal, which is the whole point of the plugin. :GoTest runs the package tests, and :GoTestFunc runs the test under the cursor. If the binaries are missing, these commands fail rather than falling back to something else.
The binary dependency and the development branch are the real costs
The first limitation is stated in the README rather than hidden: you will need to install all the necessary binaries, and vim-go expects to do that through :GoInstallBinaries. That means the plugin's feature set is bounded by what the Go toolchain can install on your machine and by your network access to those modules. On a locked-down machine or an air-gapped one, the install step is where adoption stops.
The second is the branch. The README recommends the latest stable release and warns that master is a development branch to be used with caution. Release cadence is uneven: v1.29 was tagged on 2025-04-20, v1.28 on 2022-12-18. Anyone tracking master between those points is running code that the project itself labels as not the recommended version. That is a normal arrangement for a mature plugin, but it means bug reports against master may describe behaviour that never reaches a release.
Third, this is a Vim plugin. Its value is entirely contingent on you editing in Vim or Neovim. If your team standardises on a different editor, vim-go is not a component you can adopt halfway. And the gopls integration, while optional, is where the modern analysis features come from; disabling it, as the README permits, removes :GoImplements, :GoCallees and :GoReferrers along with it.
vim-go versus an editor with a Go language server built in
The honest alternative is an editor that ships Go support as a first-class feature rather than a plugin. The difference is not the language server, since both approaches talk to gopls. The difference is who owns the integration. In vim-go, the glue is Vim Script maintained in this repository, and the commands are ex commands you type: :GoDef for go-to-definition, :GoDoc and :GoDocBrowser for documentation, :GoRename for renaming. In an editor with built-in Go support, the same operations are bound to the editor's own keybindings and settings system, and the mapping layer is not something you configure.
That cuts both ways. vim-go gives you the ex-command surface, which composes with Vim's own machinery: quickfix lists, windows, registers, macros. You can put :GoTestFunc behind a mapping of your choosing and script around it. An editor with built-in support gives you less to configure and less to break, but also less to bend. Neither is better in the abstract; the deciding question is whether your editing habits are already Vim's. If they are, the plugin's command vocabulary is an advantage. If they are not, adopting Vim to get vim-go is the wrong order of operations.
Maintenance, releases and what the licence actually says
The repository is not archived, and the last push was on 2026-08-23, within the last month. That is the only maintenance signal available here; there is no published support policy in the README. The release history is more informative for planning: v1.29 landed on 2025-04-20 after v1.28 on 2022-12-18, a gap of more than two years between stable tags. If you pin to a stable release, expect to wait for the next one rather than receive a steady stream of point updates. If you track master, you accept the development-branch warning.
Upgrade cost is mostly the binary set, not the plugin. Because :GoInstallBinaries drives go install for the required tools, a plugin upgrade can change which binaries are expected, and :GoUpdateBinaries is the command the README's vim-plug snippet uses to refresh them. Budget for re-running it after upgrades.
On licensing, the README states the project is under the BSD 3-Clause License and points to the LICENSE file. The repository metadata reports the licence as NOASSERTION, so the two do not agree at the metadata level; read LICENSE itself before you rely on either. Nothing here is legal advice, and the BSD 3-Clause text has its own conditions about redistribution that your organisation should evaluate.
Reporting bugs and running the test suite
Two operational details in the README are worth knowing before you file anything. First, the FAQ and troubleshooting tips live in the documentation, reachable with :help go-troubleshooting. Second, :GoReportGitHubIssue pre-populates much of the information needed for a new issue, which is the path the README suggests when neither the help nor the existing issues address your problem. That command exists precisely because plugin bug reports need version and environment detail that users rarely include by hand.
If you want to run the project's own tests, the Makefile defines the entry points. The default target is all, which runs install, lint and test in sequence, and the Dockerfile builds an image containing Vim 8.2, Vim 9.1 and Neovim before running scripts/install-tools against Vim 9.1. The Makefile's VIMS variable defaults to that same three-way set, so a bare make exercises the minimum supported Vim, a newer Vim and Neovim. That is a heavier setup than most plugins require, and it tells you the project treats the minimum Vim version as a tested target rather than a stated floor.
Editorial conclusion
Adopt vim-go if you already live in Vim or Neovim, are on Vim 8.2.5072 or newer, and want build, test, debug and gopls features driven by ex commands rather than a separate editor. Do not adopt it if you are not a Vim user, if you cannot run :GoInstallBinaries to place the tool binaries, or if you expect the master branch to behave like a release. Verify three things first: your Vim version, that :help vim-go resolves after install, and whether the latest stable release or master fits your tolerance for a development branch.
Frequently asked questions
How do I install vim-go?
Clone the repository onto Vim's runtime path with the command matching your package manager, for example git clone https://github.com/fatih/vim-go.git ~/.vim/pack/plugins/start/vim-go for Vim 8 packages. Then run :GoInstallBinaries inside Vim so the required Go binaries are installed.
What is vim-go?
It is a Vim plugin that adds Go language support, including :GoBuild, :GoInstall, :GoTest, :GoRun, :GoDef, :GoRename and debugging through delve with :GoDebugStart. It also integrates with gopls for completion and advanced source analysis.
Which Vim versions does vim-go require?
The README states vim-go requires at least Vim 8.2.5072 or Neovim 0.4.0. The project's Makefile and Dockerfile test against Vim 8.2, Vim 9.1 and Neovim.
Does vim-go use gopls?
Yes. The README describes integration with gopls for completion and features such as :GoImplements, :GoCallees and :GoReferrers, and notes that the gopls instance can be shared with other Vim plugins. It also states that vim-go's use of gopls can be disabled in favour of alternative tools.
Should I use the master branch or a release of vim-go?
The README recommends the latest stable release and says that if you use the master branch instead, you should do so with caution because it is a development branch. The most recent stable tag listed is v1.29 from 2025-04-20.
How do I get help or report a bug in vim-go?
The FAQ and troubleshooting tips are in the documentation and can be opened with :help go-troubleshooting. For bugs not covered there or in existing issues, the README points to :GoReportGitHubIssue, which pre-populates much of the information a new issue needs.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/fatih-vim-go)