all repos

gopher.nvim @ eeb4850

Minimalistic plugin for Go development

gopher.nvim/doc/gopher.nvim.txt(view raw)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
*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: