Gopls: Использование Emacs

Установка gopls

Для использования gopls с Emacs, необходимо сначала установить исполняемый файл gopls и убедиться, что каталог, содержащий полученный исполняемый файл (либо $(go env GOBIN), либо $(go env GOPATH)/bin), находится в вашем PATH.

Выбор клиента LSP для Emacs

Для использования gopls с Emacs, необходимо выбрать и установить пакет клиента LSP для Emacs. Два популярных пакета клиента — это LSP Mode и Eglot.

LSP Mode использует подход с «всем в комплекте», с множеством интеграций, включённых «из коробки», а также дополнительным поведением, предоставляемым самим lsp-mode.

Eglot использует минималистичный подход, сосредотачиваясь на плавной интеграции с другими уже существующими пакетами. Он предоставляет несколько собственных команд eglot-, но по умолчанию не добавляет дополнительных сочетаний клавиш.

После того как вы выберете, какой клиент вы хотите использовать, установите его согласно инструкциям пакета: см. Eglot 1-2-3 или Установка LSP Mode.

Общая конфигурация

Как Eglot, так и LSP Mode могут интегрироваться с популярными пакетами из экосистемы Emacs:

  • Встроенный пакет xref предоставляет перекрёстные ссылки.
  • Встроенный пакет Flymake предоставляет встроенный слой диагностики в реальном времени.
  • Режим Company отображает кандидаты автозавершения кода (с более богатым интерфейсом, чем у встроенного completion-at-point).

Eglot предоставляет документацию с использованием встроенного режима ElDoc, тогда как LSP Mode по умолчанию предоставляет документацию с помощью собственного режима lsp-ui.

По умолчанию Eglot определяет корень проекта с использованием пакета [project]. В режиме LSP это поведение может быть настроено с помощью параметра lsp-auto-guess-root.

Настройка режима LSP

Загрузка режима LSP в .emacs

<code class="language-elisp">(require 'lsp-mode)
(add-hook 'go-mode-hook #'lsp-deferred)

;; Настройка хуков перед сохранением для форматирования буфера и добавления/удаления импортов.
;; Убедитесь, что другие хуки gofmt/goimports не включены.
(defun lsp-go-install-save-hooks ()
(add-hook 'before-save-hook #'lsp-format-buffer t t)
(add-hook 'before-save-hook #'lsp-organize-imports t t))
(add-hook 'go-mode-hook #'lsp-go-install-save-hooks)
</code>

Настройка gopls через режим LSP

См. настройки для получения информации о доступных параметрах gopls.

Стабильные параметры gopls имеют соответствующие переменные конфигурации в lsp-mode. Например, (setq lsp-gopls-use-placeholders nil) отключит заполнители в сниппетах завершения. См. lsp-go для списка доступных переменных.

Экспериментальные параметры могут быть настроены через lsp-register-custom-settings:

<code class="language-lisp">(lsp-register-custom-settings
'(("gopls.completeUnimported" t t)
("gopls.staticcheck" t t)))
</code>

Обратите внимание, что после изменения настроек необходимо перезапустить gopls, например, командой M-x lsp-restart-workspace.

Настройка Eglot

Настройка project для Go модулей в .emacs

Eglot использует встроенный пакет project для определения рабочей области LSP для вновь открытого буфера. Пакет project не имеет встроенной поддержки GOPATH или Go модулей. К счастью, можно задать пользовательский хук, который будет указывать на ближайший родительский файл go.mod (то есть корень Go модуля) как корень проекта.

<code class="language-elisp">(require 'project)

(defun project-find-go-module (dir)
(when-let ((root (locate-dominating-file dir "go.mod")))
(cons 'go-module root)))

(cl-defmethod project-root ((project (head go-module)))
(cdr project))

(add-hook 'project-find-functions #'project-find-go-module)
</code>

Загрузка Eglot в .emacs

<code class="language-elisp">;; Необязательно: загрузите другие пакеты перед eglot для включения интеграций.
(require 'company)
(require 'yasnippet)

(require 'go-mode)
(require 'eglot)
(add-hook 'go-mode-hook 'eglot-ensure)

;; Необязательно: установите eglot-format-buffer как хук перед сохранением.
;; Глубина -10 размещает его перед уведомлением willSave от eglot,
;; таким образом, уведомление будет отображать фактическое содержимое, которое будет сохранено.
(defun eglot-format-buffer-before-save ()
(add-hook 'before-save-hook #'eglot-format-buffer -10 t))
(add-hook 'go-mode-hook #'eglot-format-buffer-before-save)
</code>

Используйте M-x eglot-upgrade-eglot для обновления до последней версии Eglot.

Настройка gopls через Eglot

См. настройки для получения информации о доступных настройках gopls.

Настройки сервера LSP управляются переменной eglot-workspace-configuration, которую можно установить либо глобально в файле .emacs, либо в файле .dir-locals.el в корневой директории проекта.

.emacs:

<code class="language-elisp">(setq-default eglot-workspace-configuration
'((:gopls .
((staticcheck . t)
(matcher . "CaseSensitive")))))
</code>

.dir-locals.el:

<code class="language-elisp">((nil (eglot-workspace-configuration . ((gopls . ((staticcheck . t)
(matcher . "CaseSensitive")))))))
</code>

Организация импортов с помощью Eglot

gopls предоставляет функциональность организации импортов goimports в виде действия кода LSP, которое можно вызвать по необходимости, выполнив M-x eglot-code-actions (или выбрав клавишу, привязанную к функции eglot-code-actions), и выбрав Organize Imports в подсказке.

Для автоматической организации импортов перед сохранением добавьте хук:

<code class="language-elisp">(add-hook 'before-save-hook
(lambda ()
(call-interactively 'eglot-code-action-organize-imports))
nil t)
</code>

Устранение неполадок

Частые ошибки:


Исходные файлы этой документации можно найти в golang.org/x/tools/gopls/doc.

GoRu.dev Golang на русском

На сайте представлена адаптированная под русский язык документация языка программирования Golang