Golang LSP in Helix on macOS

Since getting my Forgeojo dev environment running I've begun poking around the issue backlog and learning my way around the code, looking for the stepping stones to becoming a contributor. One important early milestone was to get the Golang LSP running in Helix.

You can always check if Helix's LSP integration for a given language is ready by using hx --health.

$ hx --health go
Configured language servers:
  ✘ gopls: 'gopls' not found in $PATH
  ✘ golangci-lint-lsp: 'golangci-lint-langserver' not found in $PATH
Configured debug adapter:
  ✘ 'dlv' not found in $PATH
Configured formatter: None
Tree-sitter parser: ✓
Highlight queries: ✓
Textobject queries: ✓
Indent queries: ✓

Those ✘ symbols are bad news! Installing those missing tools looked like this.

go install golang.org/x/tools/gopls@latest
go install github.com/nametake/golangci-lint-langserver@latest
go install github.com/go-delve/delve/cmd/dlv@latest
brew install golangci-lint

That last brew install there is good to know about. You'll get ✓✓✓ from hx --health without it, but linting won't actually work, and instead there's an error about exec: "golangci-lint": executable not found in $PATH.

Then there was one last little trick necessary. Those things that go install downloaded live in ~/go/bin, which isn't in $PATH. I threw a Fish plugin at the problem, like this.

fisher install halostatue/fish-go@v2

After that, I had ✓ across the board.

$ hx --health go
Configured language servers:
  ✓ gopls: /Users/henrycatalinismith/go/bin/gopls
  ✓ golangci-lint-lsp: /Users/henrycatalinismith/go/bin/golangci-lint-langserver
Configured debug adapter:
  ✓ /Users/henrycatalinismith/go/bin/dlv
Configured formatter: None
Tree-sitter parser: ✓
Highlight queries: ✓
Textobject queries: ✓
Indent queries: ✓

Here's Helix in action with the tooling integrated, successfully detecting a linter error resulting from an unused variable.

Helix screenshot showing an unused variable x := 0 being annotated as 'declared and not used: x'