*gopher.nvim* Enhance your golang experience MIT License Copyright (c) 2025 Oleksandr Smirnov ============================================================================== gopher.nvim is a minimalistic plugin for Go development in Neovim written in Lua. It's not an LSP tool, the main goal of this plugin is add go tooling support in Neovim. Table of Contents Setup ................................................ |gopher.nvim-setup()| Install dependencies ............................ |gopher.nvim-dependencies| Config ................................................ |gopher.nvim-config| Commands ............................................ |gopher.nvim-commands| Modify struct tags ............................... |gopher.nvim-struct-tags| json2go .............................................. |gopher.nvim-json2go| Auto implementation of interface methods ................ |gopher.nvim-impl| Generating unit tests boilerplate .................... |gopher.nvim-gotests| Iferr .................................................. |gopher.nvim-iferr| Generate comments ................................... |gopher.nvim-comments| ------------------------------------------------------------------------------ *gopher.nvim-setup()* `gopher.setup`({user_config}) Setup function. This method simply merges default config with opts table. You can read more about configuration at |gopher.nvim-config| Calling this function is optional, if you ok with default settings. See |gopher.nvim.config| Usage ~ >lua require("gopher").setup {} -- use default config or replace {} with your own < Parameters ~ {user_config} `(gopher.Config)` See |gopher.nvim-config| ------------------------------------------------------------------------------ *gopher.nvim-dependencies* `gopher.install_deps` Gopher.nvim implements most of its features using third-party tools. To install plugin's dependencies, you can run: `:GoInstallDeps` or `:GoInstallDepsSync` or use `require("gopher").install_deps()` if you prefer lua api. ============================================================================== ------------------------------------------------------------------------------ *gopher.nvim-config* `default_config` >lua local default_config = { -- log level, you might consider using DEBUG or TRACE for debugging the plugin ---@type number log_level = vim.log.levels.INFO, -- timeout for running internal commands ---@type number timeout = 2000, -- timeout for running installer commands(e.g :GoDepsInstall, :GoDepsInstallSync) ---@type number installer_timeout = 999999, -- user specified paths to binaries ---@class gopher.ConfigCommand commands = { go = "go", gomodifytags = "gomodifytags", gotests = "gotests", impl = "impl", iferr = "iferr", json2go = "json2go", }, ---@class gopher.ConfigGotests gotests = { -- a default template that gotess will use. -- gotets doesn't have template named `default`, we use it to represent absence of the provided template. template = "default", -- path to a directory containing custom test code templates ---@type string|nil template_dir = nil, -- use named tests(map with test name as key) in table tests(slice of structs by default) named = false, }, ---@class gopher.ConfigGoTag gotag = { ---@type gopher.ConfigGoTagTransform transform = "snakecase", -- default tags to add to struct fields default_tag = "json", -- default tag option added struct fields, set to nil to disable -- e.g: `option = "json=omitempty,xml=omitempty` ---@type string|nil option = nil, }, ---@class gopher.ConfigIfErr iferr = { -- choose a custom error message, nil to use default -- e.g: `message = 'fmt.Errorf("failed to %w", err)'` ---@type string|nil message = nil, }, ---@class gopher.ConfigJson2Go json2go = { -- command used to open interactive input. -- e.g: `split`, `botright split`, `tabnew` interactive_cmd = "vsplit", -- name of autogenerated struct, if nil none, will the default one of json2go. -- e.g: "MySuperCoolName" ---@type string|nil type_name = nil, }, } < Class ~ {gopher.Config} Fields ~ {setup} `(fun(user_config?: gopher.Config))` ============================================================================== ------------------------------------------------------------------------------ *gopher.nvim-commands* If don't want to automatically register plugins' commands, you can set `vim.g.gopher_register_commands` to `false`, before loading the plugin. ============================================================================== ------------------------------------------------------------------------------ *gopher.nvim-struct-tags* `struct_tags` is utilizing the `gomodifytags` tool to add or remove tags to struct fields. Usage ~ How to add/remove/clear tags to struct fields: 1. Place cursor on the struct 2. Run `:GoTagAdd json` to add json tags to struct fields 3. Run `:GoTagRm json` to remove json tags to struct fields 4. Run `:GoTagClear` to clear all tags from struct fields If you want to add/remove tag with options, you can use `json=omitempty` (where json is tag, and omitempty is its option). Example: `:GoTagAdd xml json=omitempty` NOTE: if you dont specify the tag it will use `json` as default Example: >go // before type User struct { // ^ put your cursor here // run `:GoTagAdd yaml` ID int Name string } // after type User struct { ID int `yaml:id` Name string `yaml:name` } < ============================================================================== ------------------------------------------------------------------------------ *gopher.nvim-json2go* Convert json to go type annotations. Usage ~ `:GoJson` opens a temporary buffer where you can paste or write JSON. Saving the buffer (`:w` or `:wq`) automatically closes it and inserts the generated Go struct into the original buffer at the cursor position. Alternatively, you can pass JSON directly as an argument: >vim :GoJson {"name": "Alice", "age": 30} < ------------------------------------------------------------------------------ *json2go.transform()* `json2go.transform`({json_str}) Parameters ~ {json_str} `(string)` Json string that is going to be converted to go type. Return ~ `(string)` `(optional)` Go type, or nil if failed. ------------------------------------------------------------------------------ *json2go.json2go()* `json2go.json2go`({json_str}) Converts json string to go type, and puts result under the cursor. If [json_str] is nil, will open an interactive prompt (with cmd set in config). Parameters ~ {json_str} `(optional)` `(string)` ============================================================================== ------------------------------------------------------------------------------ *gopher.nvim-impl* Integration of `impl` tool to generate method stubs for interfaces. Usage ~ 1. Automatically implement an interface for a struct: - Place your cursor on the struct where you want to implement the interface. - Run `:GoImpl io.Reader` - This will automatically determine the receiver and implement the `io.Reader` interface. 2. Specify a custom receiver: - Place your cursor on the struct - Run `:GoImpl w io.Writer`, where: - `w` is the receiver. - `io.Writer` is the interface to implement. 3. Explicitly specify the receiver, struct, and interface: - No need to place the cursor on the struct if all arguments are provided. - Run `:GoImpl r RequestReader io.Reader`, where: - `r` is the receiver. - `RequestReader` is the struct. - `io.Reader` is the interface to implement. Example: >go type BytesReader struct{} // ^ put your cursor here // run `:GoImpl b io.Reader` // this is what you will get func (b *BytesReader) Read(p []byte) (n int, err error) { panic("not implemented") // TODO: Implement } < ============================================================================== ------------------------------------------------------------------------------ *gopher.nvim-gotests* gotests is utilizing the `gotests` tool to generate unit tests boilerplate. Usage ~ - Generate unit test for specific function/method: 1. Place your cursor on the desired function/method. 2. Run `:GoTestAdd` - Generate unit tests for *all* functions/methods in current file: - run `:GoTestsAll` - Generate unit tests *only* for *exported(public)* functions/methods: - run `:GoTestsExp` You can also specify the template to use for generating the tests. See |gopher.nvim-config|. More details about templates: https://github.com/cweill/gotests If you prefer named tests, you can enable them in |gopher.nvim-config|. ============================================================================== ------------------------------------------------------------------------------ *gopher.nvim-iferr* `iferr` provides a way to way to automatically insert `if err != nil` check. If you want to change `-message` option of `iferr` tool, see |gopher.nvim-config| Usage ~ Execute `:GoIfErr` near any `err` variable to insert the check ============================================================================== ------------------------------------------------------------------------------ *gopher.nvim-comments* This module provides a way to generate comments for Go code. Usage ~ Set cursor on line with function/method/struct/etc and run `:GoCmt` to generate a comment. vim:tw=78:ts=8:noet:ft=help:norl: